临时小驻

求仁得仁,复无怨怼。

使用 maven 自动获取 jar 包依赖

2018-11-16 19:10:00 +0800

通过 maven 我们可以通过多种方法产生包含依赖的 fat jar 包了。但是,这种包一般很大,在网络条件不好的时候,从本地上传到服务器有一定的压力。

本文描述这样一个过程:在本地使用 maven 编译、打包得到一个无依赖的 jar 包,将其上传到服务器,在服务器上运行 maven 解析 pom.xml 和下载依赖包,然后正常运行 jar 包。

假设我们有一个 maven 项目:

<groupId>my.group</groupId>
<artifactId>app</artifactId>
<version>1.0</version>

假设我们已经打包得到了一个 app.jar

可以通过运行 jar tf app.jar 来查看其内部目录结构。从中能够发现 maven 项目配置文件还在:META-INF/maven/my.group/app/pom.xml

通过以下命令提取 pom.xml

jar xf app.jar META-INF/maven/my.group/app/pom.xml
mv META-INF/maven/my.group/app/pom.xml ./ && rm -r META-INF/

可以通过运行 mvn dependency:list 来检查是否成功获取到了依赖列表。

接下来运行 mvn dependency:copy-dependencies 下载这些依赖包,他们会被放在 target/dependency 目录下。

我们需要将所有的依赖包加到 CLASSPATH 以运行:

CLASSPATH="app.jar"
JARS=$(find target/dependency -name "*.jar")
for JAR in ${JARS}; do
    CLASSPATH="${CLASSPATH}:${JAR}"
done
java -cp ${CLASSPATH} ${JAVA_OPTS} ${MAIN_CLASS} ${JAVA_ARGS}

Spring Boot

Spring Boot 通过插件 org.springframework.boot:spring-boot-maven-plugin 的 repackage 阶段,从 executable jar 产生 fat jar。

根据官方文档的说法,或者你也可以直接查看 fat jar 的内容发现,Spring Boot 使用包 org.springframework.boot:spring-boot-loader 的启动器(如 org.springframework.boot.loader.PropertiesLauncher)代替了原本的程序入口。因此,如果你想正确地运行 Spring Boot 程序,就需要额外将这个包加入 CLASSPATH。

mvn dependency:copy-dependencies 后增加一句 mvn dependency:copy -Dartifact=org.springframework.boot:spring-boot-loader:2.1.0.RELEASE 即可。

拓展阅读

原文链接 https://blog.xupu.name//p/2018-11-run-simple-jar-with-maven/

如无特别指明,本站原创文章均采用 CC BY-NC-ND 4.0 许可,转载或引用请注明出处,更多许可信息请查阅这里