文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-09-06 12:36

关注

目录
打包方法
方法一:使用maven-jar-plugin和maven-dependency-plugin
方法二:使用maven-assembly-plugin (推荐)
方法三:使用maven-shade-plugin
方法四:使用onejar-maven-plugin
方法五:使用spring-boot-maven-plugin
方法六:使用tomcat7-maven-plugin
参考
 

打包方法

方法一:使用maven-jar-plugin和maven-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 ArchiverBuilt-By: michealyangClass-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.9Build-Jdk: 1.8.0_162-eaMain-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>

两个重点:

优点
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

本文转自https://blog.csdn.net/londa/article/details/115098901,如有侵权,请联系删除。

来源地址:https://blog.csdn.net/weixin_49613823/article/details/129783786

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯