欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

maven 包可执行 jar 包 - 包含依赖项 jar

最编程 2024-07-18 13:36:56
...

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="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
maven打包可执行的jar包-包含依赖jar_apache
从文件名上也可以区分出来,目前由于还没有依赖,所以这俩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里面运行。
maven打包可执行的jar包-包含依赖jar_maven_02

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

由于这次编写工具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包里面。
maven打包可执行的jar包-包含依赖jar_apache_03
最后是:

[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文件的大小,差别就很明显了。
maven打包可执行的jar包-包含依赖jar_maven_04
用好压打开两个jar对比:
maven打包可执行的jar包-包含依赖jar_java_05
此时才算完整的将工具打包完成。

工具有了,但是执行的时候,每次都要输入一串命令,还是不太方便,那就来个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,即可自动运行工具类,同时输出动态参数。
maven打包可执行的jar包-包含依赖jar_apache_06

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_jar_07