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命令传入中文参数乱码
我这里已经有现成的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="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/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>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</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: 2020-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里面的内容是一样的,可以分别解压看下。
接着来运行一下打包的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里面运行。
由于这次编写工具jar是为了处理excel文件的,这里就加了poi和easyExcel的依赖。
完整的pom文件内容为:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/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>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</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>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</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: 2020-12-30T15:25:21+08:00
[INFO] Final Memory: 31M/762M
[INFO] ------------------------------------------------------------------------
对比下两次打包后,jar文件的大小,差别就很明显了。
用好压打开两个jar对比:
此时才算完整的将工具打包完成。
工具有了,但是执行的时候,每次都要输入一串命令,还是不太方便,那就来个bat脚本执行。
在jar包同一文件夹下新建run.bat
文件,内容如下:
@echo off
java -jar test-maven-01-0.0.1-SNAPSHOT-jar-with-dependencies.jar E:/jar/bat-jar/GA-kqtj.xls
pause
这里@echo off
表示不将命令输出到屏幕上java -jar
是我们执行jar的命令。pause
是运行结束不自动关闭窗口。
双击运行 run.bat
,即可自动运行工具类,同时输出动态参数。
当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 !");
}