失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > maven打包可执行的jar包-包含依赖jar

maven打包可执行的jar包-包含依赖jar

时间:2020-09-26 07:27:18

相关推荐

maven打包可执行的jar包-包含依赖jar

maven打包可执行的jar包:

1. 首先确保编辑器里maven环境正常2. 运行打包的jar文件3. 测试添加依赖后打包。4. Unable to access jarfile test-maven-01-0.0.1-SNAPSHOT-jar-with-dependencies.5. 注意cmd命令传入中文参数乱码

1. 首先确保编辑器里maven环境正常

我这里已经有现成的maven环境和工具类了,这里先使用myeclipse先测试一下maven打包,不包含任何依赖,只包含一个类,里面定义main函数。

public class TestJarApplication{public static void main(String[] args) {for (int i = 0; i < args.length; i++) {System.out.println(args[i]);}System.out.println("Hello World!!!!!");}}

pom文件内容为:

<project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.lin</groupId><artifactId>test-maven-01</artifactId><version>0.0.1-SNAPSHOT</version><!-- 指定maven编译方式为jdk1.8版本 --><profiles><profile><activation><activeByDefault>true</activeByDefault><jdk>1.8</jdk></activation><properties><piler.source>1.8</piler.source><piler.target>1.8</piler.target><pilerVersion>1.8</pilerVersion></properties></profile></profiles><build><plugins><plugin><artifactId>maven-assembly-plugin</artifactId><executions><execution><phase>package</phase><goals><goal>single</goal></goals></execution></executions><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><archive><manifest><mainClass>com.lin.TestJarApplication</mainClass></manifest></archive></configuration></plugin></plugins></build></project>

这里使用maven-assembly-plugin打jar包配置文件(含主类设置),并且如果pom文件里面包含依赖,可将依赖一块打入jar包里面,可在外部直接使用java -jar XXX.jar运行。

之后右键项目名,使用run as --> maven install

[INFO] Scanning for projects...[INFO] [INFO] ------------------------------------------------------------------------[INFO] Building test-maven-01 0.0.1-SNAPSHOT[INFO] ------------------------------------------------------------------------[INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ test-maven-01 ---[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent![INFO] Copying 0 resource[INFO] [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ test-maven-01 ---[INFO] Nothing to compile - all classes are up to date[INFO] [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ test-maven-01 ---[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent![INFO] Copying 0 resource[INFO] [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ test-maven-01 ---[INFO] Nothing to compile - all classes are up to date[INFO] [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ test-maven-01 ---[INFO] [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ test-maven-01 ---[INFO] [INFO] --- maven-assembly-plugin:2.2-beta-5:single (default) @ test-maven-01 ---[INFO] Building jar: D:\MyEclipse-WorkSpace\test-maven-01\target\test-maven-01-0.0.1-SNAPSHOT-jar-with-dependencies.jar[INFO] [INFO] --- maven-install-plugin:2.4:install (default-install) @ test-maven-01 ---[INFO] Installing D:\MyEclipse-WorkSpace\test-maven-01\target\test-maven-01-0.0.1-SNAPSHOT.jar to D:\maven\LocalMavenRepository\com\lin\test-maven-01\0.0.1-SNAPSHOT\test-maven-01-0.0.1-SNAPSHOT.jar[INFO] Installing D:\MyEclipse-WorkSpace\test-maven-01\pom.xml to D:\maven\LocalMavenRepository\com\lin\test-maven-01\0.0.1-SNAPSHOT\test-maven-01-0.0.1-SNAPSHOT.pom[INFO] Installing D:\MyEclipse-WorkSpace\test-maven-01\target\test-maven-01-0.0.1-SNAPSHOT-jar-with-dependencies.jar to D:\maven\LocalMavenRepository\com\lin\test-maven-01\0.0.1-SNAPSHOT\test-maven-01-0.0.1-SNAPSHOT-jar-with-dependencies.jar[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time: 1.957 s[INFO] Finished at: -12-30T15:10:06+08:00[INFO] Final Memory: 12M/232M[INFO] ------------------------------------------------------------------------

BUILD SUCCESS表示maven打包成功。

此时,项目的target文件夹下会生成两个jar包,一个是只包含项目编译后的class文件的test-maven-01-0.0.1-SNAPSHOT.jar,一个是带有依赖的test-maven-01-0.0.1-SNAPSHOT-jar-with-dependencies.jar

从文件名上也可以区分出来,目前由于还没有依赖,所以这俩jar里面的内容是一样的,可以分别解压看下。

2. 运行打包的jar文件

接着来运行一下打包的jar,看下是否正常。

test-maven-01-0.0.1-SNAPSHOT-jar-with-dependencies.jar拷贝到新的文件夹E:\jar\test-jar下。

打开cmd命令,切换到E:\jar\test-jar执行java -jar test-maven-01-0.0.1-SNAPSHOT-jar-with-dependencies.jar正常会输出Hello World !,由于main函数里面添加了输出启动命令的参数,可在命令后面添加动态参数,可以传入jar里面运行。

3. 测试添加依赖后打包。

由于这次编写工具jar是为了处理excel文件的,这里就加了poi和easyExcel的依赖。

完整的pom文件内容为:

<project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.lin</groupId><artifactId>test-maven-01</artifactId><version>0.0.1-SNAPSHOT</version><dependencies><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version><!-- <version>1.0.4</version> --></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.12</version></dependency><!-- /artifact/mons/commons-lang3 --><dependency><groupId>mons</groupId><artifactId>commons-lang3</artifactId><version>3.11</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.10-FINAL</version></dependency></dependencies><!-- 指定maven编译方式为jdk1.8版本 --><profiles><profile><activation><activeByDefault>true</activeByDefault><jdk>1.8</jdk></activation><properties><piler.source>1.8</piler.source><piler.target>1.8</piler.target><pilerVersion>1.8</pilerVersion></properties></profile></profiles><build><plugins><plugin><artifactId>maven-assembly-plugin</artifactId><executions><execution><phase>package</phase><goals><goal>single</goal></goals></execution></executions><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><archive><manifest><!-- 这里定义程序运行的入口 --><mainClass>com.lin.TestJarApplication</mainClass></manifest></archive></configuration></plugin></plugins></build></project>

再次使用maven install,则可以看到控制台在编译结束后,会将依赖打入jar包里面。

最后是:

[INFO] META-INF/LICENSE.txt already added, skipping[INFO] META-INF/NOTICE.txt already added, skipping[INFO] [INFO] --- maven-install-plugin:2.4:install (default-install) @ test-maven-01 ---[INFO] Installing D:\MyEclipse-WorkSpace\test-maven-01\target\test-maven-01-0.0.1-SNAPSHOT.jar to D:\maven\LocalMavenRepository\com\lin\test-maven-01\0.0.1-SNAPSHOT\test-maven-01-0.0.1-SNAPSHOT.jar[INFO] Installing D:\MyEclipse-WorkSpace\test-maven-01\pom.xml to D:\maven\LocalMavenRepository\com\lin\test-maven-01\0.0.1-SNAPSHOT\test-maven-01-0.0.1-SNAPSHOT.pom[INFO] Installing D:\MyEclipse-WorkSpace\test-maven-01\target\test-maven-01-0.0.1-SNAPSHOT-jar-with-dependencies.jar to D:\maven\LocalMavenRepository\com\lin\test-maven-01\0.0.1-SNAPSHOT\test-maven-01-0.0.1-SNAPSHOT-jar-with-dependencies.jar[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time: 14.721 s[INFO] Finished at: -12-30T15:25:21+08:00[INFO] Final Memory: 31M/762M[INFO] ------------------------------------------------------------------------

对比下两次打包后,jar文件的大小,差别就很明显了。

用好压打开两个jar对比:

此时才算完整的将工具打包完成。

工具有了,但是执行的时候,每次都要输入一串命令,还是不太方便,那就来个bat脚本执行。

在jar包同一文件夹下新建run.bat文件,内容如下:

@echo offjava -jar test-maven-01-0.0.1-SNAPSHOT-jar-with-dependencies.jar E:/jar/bat-jar/GA-kqtj.xlspause

这里@echo off表示不将命令输出到屏幕上

java -jar是我们执行jar的命令。

pause是运行结束不自动关闭窗口。

双击运行run.bat,即可自动运行工具类,同时输出动态参数。

4. Unable to access jarfile test-maven-01-0.0.1-SNAPSHOT-jar-with-dependencies.

java -jar命令行中jar的路径有误时,会提示此异常。如果没有写绝对路径,则默认会从当前命令行所在文件夹查找该jar文件,如果jar文件路径不存在,则抛出异常。

这时只需要检查运行当前jar的命令或者脚本,是否使用了相对路径,并且相对路径是否正确。

5. 注意cmd命令传入中文参数乱码

但是此时还有一个问题,就是cmd命令行传入的参数中包含中文时,在main函数中取到的就是乱码了,搜了下发现网上有人说在批处理命令里面添加chcp 65001,发现用了之后不好使。最后还是直接在main方法里面,对输入的参数重新UTF-8编码:arg.getBytes(),"utf-8"),然后就可以正常显示了。

public static void main(String[] args) {String arg = "";for (int i = 0; i < args.length; i++) {arg = args[i];try {System.out.println(new String(arg.getBytes(),"utf-8"));} catch (UnsupportedEncodingException e) {e.printStackTrace();}}System.out.println("Hello World !");}

如果觉得《maven打包可执行的jar包-包含依赖jar》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。