知方号

知方号

JavaMaven 打包可运行jar包

前提

Maven可以使用mvn package指令对项目进行打包,如果使用Java -jar xxx.jar执行运行jar文件,会出现"no main manifest attribute, in xxx.jar"(没有设置Main-Class)、ClassNotFoundException(找不到依赖包)等错误。

要想jar包能直接通过java -jar xxx.jar运行,需要满足:

1、在jar包中的META-INF/MANIFEST.MF中指定Main-Class,这样才能确定程序的入口在哪里;

2、要能加载到依赖包。

搭建示例项目

1、新建Maven工程

2、编辑pom.xml文件

1 2 5 4.0.0 6 7 org.example 8 test-mvn-package 9 1.0-SNAPSHOT10 11 12 13 cn.hutool14 hutool-all15 5.3.716 17 18

3、编辑主类MyMain.java

1 public class MyMain { 2 3 public static void main(String[] args) { 4 System.out.println("===========程 序 启 动==========="); 5 6 // 当前时间字符串,格式:yyyy-MM-dd HH:mm:ss 7 // DateUtil 第三方jar包中的类 8 String now = DateUtil.now(); 9 System.out.println("当前时间:" + now);10 11 System.out.println("===========程 序 关 闭===========");12 }13 }

4、测试,运行主方法,效果如下:

5、直接mvn package,打包后,运行jar包

运行方法一:java -jar test-mvn-package-1.0-SNAPSHOT.jar

运行方法二(指定主类):java -cp test-mvn-package-1.0-SNAPSHOT.jar com.test.api.MyMain

均无法直接运行

项目打包

使用Maven有以下几种方法可以生成能直接运行的jar包,可以根据需要选择一种合适的方法。

方法一:使用maven-jar-plugin和maven-dependency-plugin插件打包

1、在pom.xml中配置:

1 2 3 4 5 6 org.apache.maven.plugins 7 maven-jar-plugin 8 3.1.0 9 10 11 12 true13 lib/14 com.test.api.MyMain15 16 17 18 19 20 org.apache.maven.plugins21 maven-dependency-plugin22 3.1.123 24 25 copy-dependencies26 package27 28 copy-dependencies29 30 31 ${project.build.directory}/lib32 33 34 35 36 37 38  

说明:

maven-jar-plugin用于生成META-INF/MANIFEST.MF文件的部分内容,com.xx.Main指定MANIFEST.MF中的Main-Class,true会在MANIFEST.MF加上Class-Path项并配置依赖包,lib/指定依赖包所在目录。

只是生成MANIFEST.MF文件还不够,maven-dependency-plugin插件用于将依赖包拷贝到${project.build.directory}/lib指定的位置,即lib目录下。

2、使用maven命令:mvn clean package 打包

3、target目录内容如下,多了lib目录

反编译jar包,MANIFEST.MF文件内容如下:

4、使用命令:java -jar test-mvn-package-1.0-SNAPSHOT.jar,可以直接运行

方法二:使用maven-assembly-plugin插件打包

1、在pom.xml中配置:

1 2 3 4 5 6 org.apache.maven.plugins 7 maven-assembly-plugin 8 3.2.0 9 10 11 12 com.test.api.MyHttpRequest13 14 15 16 jar-with-dependencies17 18 19 20 21 make-assembly22 package23 24 single25 26 27 28 29 30 31

2、使用maven命令:mvn clean package 打包

3、target目录内容如下,多了test-mvn-package-1.0-SNAPSHOT-jar-with-dependencies.jar包

反编译jar包,test-mvn-package-1.0-SNAPSHOT-jar-with-dependencies.jar内容如下:

可以看到其中把第三方包的内容放到新的jar包中了

不过,如果项目中用到hutool-all第三方包,用这种方式打出来的包运行时可能会出错,但实验中没有出现这种情况。项目中最好使用maven依赖源包

4、使用命令:java -jar test-mvn-package-1.0-SNAPSHOT.jar,无法运行

5、使用命令:java -jar test-mvn-package-1.0-SNAPSHOT-jar-with-dependencies.jar,可以直接运行

方法三:使用maven-shade-plugin插件打包

1、在pom.xml中配置:

1 2 3 4 5 6 org.apache.maven.plugins 7 maven-shade-plugin 8 3.2.3 9 10 false11 12 13 14 package15 16 shade17 18 19 20 21 com.test.api.MyMain22 23 24 25 26 27 28 29 30

2、使用maven命令:mvn clean package 打包 

3、target目录内容如下,多了original-test-mvn-package-1.0-SNAPSHOT.jar包

反编译jar包,test-mvn-package-1.0-SNAPSHOT.jar内容如下:

可以看到其中把第三方包的内容放到新的jar包中了

不过,如果项目中用到hutool-all第三方包,用这种方式打出来的包运行时可能会出错,但实验中没有出现这种情况。项目中最好使用maven依赖源包

4、使用命令:java -jar test-mvn-package-1.0-SNAPSHOT.jar

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。