目录

打包方法

方法一:使用maven-jar-plugin和maven-dependency-plugin

方法二:使用maven-assembly-plugin (推荐)

方法三:使用maven-shade-plugin

方法四:使用onejar-maven-plugin

方法五:使用spring-boot-maven-plugin

方法六:使用tomcat7-maven-plugin

参考


打包方法

方法一:使用maven-jar-pluginmaven-dependency-plugin

首先,maven-jar-plugin的作用是配置mainClass和指定classpath。

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><archive><manifest><addClasspath>true</addClasspath><classpathPrefix>libs/</classpathPrefix><mainClass>org.baeldung.executable.ExecutableMavenJar</mainClass></manifest></archive></configuration>
</plugin>

addClasspath: 是否在manifest文件中添加classpath。默认为false。如果为true,则会在manifest文件中添加classpath,这样在启动的时候就不用再手动指定classpath了。如下所示,文件中增加了Class-Path一行

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: michealyang
Class-Path: libs/jetty-server-9.4.7.v20170914.jar lib/javax.servlet-api-3.1.0.jar libs/jetty-http-9.4.7.v20170914.jar
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_162-ea
Main-Class: com.michealyang.jetty.embeded.EmbeddedJettyServer

classpathPrefix: classpath的前缀。如上面的manifest文件中,Class-Path的值中,每个jar包的前缀都是libs/。本质上,这个配置的值是所依赖jar包所在的文件夹。配置正确了才能找到依赖
mainClass: 指定启动时的Main Class

其次,maven-dependency-plugin会把所依赖的jar包copy到指定目录

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><executions><execution><id>copy-dependencies</id><phase>prepare-package</phase><goals><goal>copy-dependencies</goal></goals><configuration><outputDirectory>${project.build.directory}/libs</outputDirectory></configuration></execution></executions>
</plugin>

executions中的配置都很重要,按照上面的配置来就行了。outputDirectory指定了要将所依赖的jar包copy到哪个目录。要与maven-jar-plugin中的classpathPrefix一致。

执行如下命令,即可打包:

mvn package

打包结果是,自己写的Class在jar包中,所依赖的jar包在libs目录中:

├── embedded-jetty-1.0.0-SNAPSHOT.jar
├── lib
│ ├── jetty-server-9.4.7.v20170914.jar
│ ├── jetty-http-9.4.7.v20170914.jar

执行如下命令即可启动jar包:

java -jar embedded-jetty-1.0.0-SNAPSHOT.jar

优点
有诸多配置项,很自由,每个步骤都可控

缺点
打成的最终jar包中没有所依赖的jar包。依赖跟自己的代码不在一个jar包中。部署或者移动的时候,要考虑到多个文件,比较麻烦

方法二:使用maven-assembly-plugin (推荐)

maven-assembly-plugin可以将所有的东西都打包到一个jar包中。

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><executions><execution><phase>package</phase><goals><goal>single</goal></goals><configuration><archive><manifest><mainClass>com.michealyang.jetty.embeded.EmbeddedJettyServer</mainClass></manifest></archive><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration></execution></executions>
</plugin>

执行mvn package后,会在target文件夹下生成两个jar包,一个是不带依赖的jar包,一个是后缀有-dependencies带有依赖的jar包,如:

May 31 16:42 embedded-jetty-1.0.0-SNAPSHOT-jar-with-dependencies.jar
May 31 16:42 embedded-jetty-1.0.0-SNAPSHOT.jar

启动时,直接执行即可:

java -jar embedded-jetty-1.0.0-SNAPSHOT-jar-with-dependencies.jar

优点
所有的东西都打到一个jar包中,很方便
缺点
配置项少,不自由。

方法三:使用maven-shade-plugin

maven-assembly-plugin类似,都可以将所有的东西都打包到一个jar包中。

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><executions><execution><goals><goal>shade</goal></goals><configuration><shadedArtifactAttached>true</shadedArtifactAttached><transformers><transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass>com.michealyang.jetty.embeded.EmbeddedJettyServer</mainClass></transformer></transformers></configuration></execution></executions>
</plugin>

执行mvn package后,会在target文件夹下生成两个jar包,一个是不带依赖的jar包,一个是后缀有-shaded带有依赖的jar包,如:

May 31 16:53 embedded-jetty-1.0.0-SNAPSHOT-shaded.jar
May 31 16:53 embedded-jetty-1.0.0-SNAPSHOT.jar

启动时,直接执行即可:

java -jar embedded-jetty-1.0.0-SNAPSHOT-jar-with-shaded.jar

优点
功能同maven-assembly-plugin,但比前者强大
缺点
配置起来太麻烦。当你需要高级功能的时候,更是麻烦的不要不要的。

方法四:使用onejar-maven-plugin

This provides custom classloader that knows how to load classes and resources from jars inside an archive, instead of from jars in the filesystem.

<plugin><groupId>com.jolira</groupId><artifactId>onejar-maven-plugin</artifactId><executions><execution><configuration><mainClass>org.baeldung.executable.ExecutableMavenJar</mainClass><attachToBuild>true</attachToBuild><filename>${project.build.finalName}.${project.packaging}</filename></configuration><goals><goal>one-jar</goal></goals></execution></executions>
</plugin>

优点
clean delegation model, allows classes to be at the top-level of the One Jar, supports external jars and can support Native libraries
缺点
not actively supported since 2012

方法五:使用spring-boot-maven-plugin

能同时打可执行jar包和war包
This allows to package executable jar or war archives and run an application “in-place”.

需要maven版本不低于3.2

<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals><goal>repackage</goal></goals><configuration><classifier>spring-boot</classifier><mainClass>org.baeldung.executable.ExecutableMavenJar</mainClass></configuration></execution></executions>
</plugin>

两个重点:

  • goal要写成repackage
  • classifier要写成spring-boot

优点
dependencies inside a jar file, you can run it in every accessible location, advanced control of packaging your artifact, with excluding dependencies from the jar file etc., packaging of war files as well

缺点
添加了一些不必要的Spring和Spring Boot依赖

方法六:使用tomcat7-maven-plugin

可打包成一个web工程类型的jar包。其实是内嵌了一个tomcat在里面。

<plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.0</version><executions><execution><id>tomcat-run</id><goals><goal>exec-war-only</goal></goals><phase>package</phase><configuration><path>/</path><enableNaming>false</enableNaming><finalName>webapp.jar</finalName><charset>utf-8</charset></configuration></execution></executions>
</plugin>

The goal is set as exec-war-only, path to your server is specified inside configuration tag, with additional properties, like finalName, charset etc. To build a jar, run man package, which will result in creating webapp.jar in your target directory. To run

To run the application, just write this in your console: java -jar target/webapp.jar and try to test it by specifying the localhost:8080/ in a browser.

优点
只有一个jar包
缺点
打包出的文件很大。因为里面内嵌了一个tomcat

参考

How to Create an Executable JAR with Maven

Maven打包可执行jar包方法大全(史上最全)相关推荐

  1. 如何通过maven打包可执行jar包

    一.目的 介绍将代码打包成jar包的四种形式: 只打包本项目的代码,不包括依赖的jar包,并且不可直接通过java -jar xxx.jar执行(应用场景:我们日常使用依赖的jar包) 只打包本项目的 ...

  2. maven打的包带exec包比不带的大_spring boot maven打包可执行jar包缺少依赖包的问题...

    问题描述:spring boot使用maven的package命令打出来的包,却不包含依赖的jar包 问题原因:打包时使用了maven默认的maven-jar-plugin插件,而不是spring-b ...

  3. mvn 打包可执行包_如何用Maven打包可执行jar包

    在pom文件里面加入如下代码: org.apache.maven.plugins        maven-compiler-plugin                    1.7         ...

  4. Maven 打包成第三方jar包且把pom依赖包打入进来的方法

    <Maven 打包成第三方jar包且把pom依赖包打入进来的方法> 提示: 本材料只做个人学习参考,不作为系统的学习流程,请注意识别!!! <Maven 打包成第三方jar包且把po ...

  5. 【收藏】Maven 生成打包可执行jar包

    Maven 生成打包可执行jar包 https://blog.csdn.net/daerzei/article/details/82883472

  6. Maven 生成打包可执行jar包

    文章目录 1. 需求 2. 开发环境 3. Maven打包插件介绍 4. Maven使用maven-jar-plugin打可执行jar包 5. Maven使用maven-assembly-plugin ...

  7. IDEA 打包可执行 jar 包

    Idea 打包可执行 jar 包 1.参考资料 idea打包java可执行jar包 Intellij Idea 将java项目打包成jar,cmd运行该jar 2.操作步骤 在项目上右击,选择[Ope ...

  8. maven打包导入本地jar包

    一 . 在项目根目录创建lib文件夹,把jar放入lib文件夹中 img 二 . 在项目中使用本地jar pom文件配置如下: <!--导入本地jar--><dependency&g ...

  9. 我的世界1.8正版服务器大全,史上最全服务器汇总 我的世界1.8服务器地址大全...

    我的世界服务器指令大全 史上最全的服务器指令介绍.那大家也知道在我的世界中有许许多多的指令,有的是单机的有的是手机的也有的是服务器的,那今天给大家介绍的是服务器的指令,那下面一起来看看在服务器里面都有 ...

最新文章

  1. 实现电脑与NUC之间进行远程登录
  2. 2021十大科技趋势来了!阿里巴巴达摩院全新发布
  3. 一文读懂 Shell 中各种括号的作用
  4. Java 线程状态---WAITING(部分转载)
  5. 新买电脑用户配置文件错误原因_电脑键盘与鼠标同时失灵怎么办
  6. 【uoj#174】新年的破栈 贪心
  7. 谈谈金融行业的开源风险管理
  8. Config文件中的回车符
  9. 企业之haproxy
  10. jQuery 滚动条插件nicescroll 使用方法、常见配置和事件回调使用说明
  11. 简约前端工程师简历PPT模板
  12. 计算机cmp代表什么意思,CMP是什么
  13. 群晖 DLNA 设置
  14. 巴菲特致股东的一封信:2002年
  15. matlab文件批量重命名并编号排序
  16. Game Plug-ins(1)
  17. Quartus II LPM使用指南-FIFO篇
  18. android陀螺仪手机垂直角度,Android设备中实现陀螺仪(Orientation Sensor)
  19. Chrome的无痕浏览实现初探
  20. 基于MPC的自适应巡航控制

热门文章

  1. 如何让页面跳转更丝滑
  2. 02-React受控组件及非受控组件、数据渲染、事件处理、组件通信
  3. IDEA书签,备份使用,全分支共享
  4. Android 情景模式的设置
  5. Matlab绘制波特图的两种方案
  6. 北师大心理学部计算机考研,我的跨专业考北师大心理学的感受
  7. 惠普6L接无线打印服务器,惠普6L的常见问题及解决办法
  8. android 代码 卸载app,Android在一个app中安装并卸载另一个app的示例代码
  9. etabs数据_ETABS二次开发入门(一)——简介
  10. OpenGL 坐标系统