mvn 打包可执行包_【Java】Maven 打包可运行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工程

55bb962637cbc7a6e4390a6bce2d3198.png

2、编辑pom.xml文件

1 <?xml version="1.0" encoding="UTF-8"?>

2

3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

5 4.0.0

6

7 org.example

8 test-mvn-package

9 1.0-SNAPSHOT

10

11

12

13 cn.hutool

14 hutool-all

15 5.3.7

16

17

18

3、编辑主类MyMain.java

1 public classMyMain {2

3 public static voidmain(String[] args) {4 System.out.println("===========程 序 启 动===========");5

6 //当前时间字符串,格式:yyyy-MM-dd HH:mm:ss7 //DateUtil 第三方jar包中的类

8 String now =DateUtil.now();9 System.out.println("当前时间:" +now);10

11 System.out.println("===========程 序 关 闭===========");12 }13 }

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

b7e7e086bd0fbb852af16df9dd602121.png

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

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

2650815c79c45dd5dfa4053f097329ca.png

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

c1e1ecb79e722ef4af8ae0e6d2b841c8.png

均无法直接运行

项目打包

使用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 true

13 lib/

14 com.test.api.MyMain

15

16

17

18

19

20 org.apache.maven.plugins

21 maven-dependency-plugin

22 3.1.1

23

24

25 copy-dependencies

26 package

27

28 copy-dependencies

29

30

31 ${project.build.directory}/lib

32

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目录

091dd8d56562ebff2f46f8a2e01f4c01.png

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

2b3391ea849d1c88fbc4afee132c5bd3.png

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

2f43ece1fd0bdbb669833be920061dde.png

方法二:使用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.MyHttpRequest

13

14

15

16 jar-with-dependencies

17

18

19

20

21 make-assembly

22 package

23

24 single

25

26

27

28

29

30

31

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

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

ef6d5734f91450f86cc55a2cc7da4b2c.png

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

b609b2b6036201513b892239bc3b2c76.png

可以看到其中把第三方包的内容放到新的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,可以直接运行

124cae21cdc98e8b85d2043f2b381cb5.png

方法三:使用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 false

11

12

13

14 package

15

16 shade

17

18

19

20

21 com.test.api.MyMain

22

23

24

25

26

27

28

29

30

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

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

2f3d5f8f6215b05e0c78ddd72578ab19.png

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

69fb73efd569c36817d88fb0da3f01d8.png

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

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

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

4bab05b079b74d9229ae5201c1b57140.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值