文章目录
前言
如标题所言,本篇博客讲解一下maven打包如何把依赖包和工程代码打成一个jar包并且可以正常使用(因为有些方式打出来虽然是一个jar包,但是运行时候找不到对应的依赖)。
一、工程结构
示例工程结构很简单,只有一个Main主类,加了一个本地jiar包依赖(博主用log相关jar包演示)。
1、pom.xml配置:
方式1:使用springboot插件打包,推荐
<?xml version="1.0" encoding="UTF-8"?>
<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>org.example</groupId>
<artifactId>package-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- 测试打包,把本地commons-logging-1.1.1.jar和工程代码打成一个jar包 -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
<!-- 方式1可以将远程和本地jar包都打包进去 -->
<systemPath>${project.basedir}/lib/commons-logging-1.1.1.jar</systemPath>
<scope>system</scope>
</dependency>
</dependencies>
<!-- 方式1:使用springboot插件打包,推荐 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!-- 版本可根据实际情况调整 -->
<version>2.1.4.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<includeSystemScope>true</includeSystemScope>
<mainClass>org.example.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
方式2:使用assembly插件打包,不推荐
<?xml version="1.0" encoding="UTF-8"?>
<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>org.example</groupId>
<artifactId>package-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- 测试打包,把本地commons-logging-1.1.1.jar和工程代码打成一个jar包 -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
<!-- 方式2可以将仓库jar包打包进去,但是本地依赖如果要打包进去,还需要调整配置,且需要使用自定义assembly.xml -->
<!-- <systemPath>${project.basedir}/lib/commons-logging-1.1.1.jar</systemPath>-->
<!-- <scope>system</scope>-->
</dependency>
</dependencies>
<!-- 方式2:使用assembly插件打包,不推荐 -->
<build>
<plugins>
<!-- 打包插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<executions>
<!-- 执行器 -->
<execution>
<!-- 阶段 -->
<phase>package</phase>
<!-- 目标 -->
<goals>
<goal>single</goal>
</goals>
<!-- 配置 -->
<configuration>
<!-- 档案 -->
<archive>
<!-- 表明 -->
<manifest>
<!-- 主类 -->
<mainClass>org.example.Main</mainClass>
</manifest>
</archive>
<!-- 描述引用 -->
<descriptorRefs>
<!-- bin : 类似于默认打包,会将bin目录下的文件打到包中 -->
<!-- jar-with-dependencies : 会将所有依赖都解压打包到生成物中 -->
<!-- src :只将源码目录下的文件打包 -->
<!-- project : 将整个project资源打包 -->
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
2、结构截图
3、Main主类代码
package org.example;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class Main {
private static final Log log = LogFactory.getLog(Main.class);
public static void main(String[] args) {
log.info("info Hello world!");
log.debug("debug Hello world!");
log.error("error Hello world!");
}
}
4、log4j.properties配置
log4j.rootLogger=info
二、打包效果
方式1:使用springboot插件打包,推荐
jar包名称:package-demo-1.0-SNAPSHOT.jar
jar包结构:
这是保准springboot打包出来的结构,也是比较推荐的方式。
方式2:使用assembly插件打包,不推荐
jar包名称:package-demo-1.0-SNAPSHOT-jar-with-dependencies.jar
jar包结构:
三、运行效果
将打包后的jar包上传到linux服务器上,使用命令运行:
方式1:
java -jar package-demo-1.0-SNAPSHOT.jar
[root@test ~]$ java -jar package-demo-1.0-SNAPSHOT.jar
May 07, 2024 4:03:15 PM org.example.Main main
INFO: info Hello world!
May 07, 2024 4:03:15 PM org.example.Main main
SEVERE: error Hello world!
方式2:
java -jar package-demo-1.0-SNAPSHOT-jar-with-dependencies.jar
[root@test ~]$ java -jar package-demo-1.0-SNAPSHOT-jar-with-dependencies.jar
May 07, 2024 4:05:24 PM org.example.Main main
INFO: info Hello world!
May 07, 2024 4:05:24 PM org.example.Main main
SEVERE: error Hello world!
总结
从上面打包后的jar包内部结构图可以看到方式2的结构和方式1差别还是很大的,方式2是把对应jar包的class都拷贝进去,这种方式可能会导致有些需要证书认证的jar包无法使用。
也许还有其他方式可以实现,博主演示两种最简单且最实用的方式,另外方式2的自定义assembly.xml没有在博客中演示,是因为博主觉得既然有简单的方式,为何还要选择复杂的方式呢。如果有什么疑问,可以在评论区回复或者私信,博主看到后都会答复。