1. 程式人生 > >關於 maven 打包直接運行的 fat jar (uber jar) 時需要包含本地文件系統第三方 jar 文件的問題

關於 maven 打包直接運行的 fat jar (uber jar) 時需要包含本地文件系統第三方 jar 文件的問題

可執行 整合 pre tps pro 不勝感激 nal uber plugin

關於maven打包fat jar (uber jar) 時需要包含本地文件系統第三方jar文件的問題,今天折騰了一整天。最後還是用了spring boot來做。下面是幾篇關於打包的有參考價值的文章,以及我的解決方法。

參考文章:

1. 將 Spring boot 項目打成可執行Jar包,及相關註意事項(main-class、缺少 xsd、重復打包依賴)  https://blog.csdn.net/rainbow702/article/details/55096506

2. Java 打包 FatJar 方法小結  https://yq.aliyun.com/articles/631100

(此文說明了Unshaded,Shaded 和 jar of jars 的區別和方法,其中提到了 jar of jars 的工具有 Onejar Maven Plugin 和 下面的 spring boot plugin)

  

3. maven打包可運行的fat-jar的簡單方法  https://www.cnblogs.com/pekkle/p/9680769.html

(此處兩種方法均無法包含本地jar,下面就是關於如何在第二種方法中加入本地jar的選項。對於assembly,或者maven shade插件,我都還搞不清楚如何把本地jar包進去,或者包進去後如何被查找到。有知道的同學麻煩留言告知,不勝感激!)

我采用的方法:

最後的pom.xml文件,其中的gson是測試maven repo的依賴,mxGraph是測試本地jar文件的依賴 :

<?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>com.pekkle</groupId> <
artifactId>test-maven</artifactId> <version>1.0-SNAPSHOT</version> <name>${artifactId}</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <!--這個是maven repo中的dependency--> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.5</version> </dependency> <!--這個是本地文件系統中的dependency,groupId和artifactId和version其實都是可以自己隨便編一個的--> <!--systemPath就是指向${basedir}指向pom.xml文件所在的目錄--> <dependency> <groupId>com.jgraph</groupId> <artifactId>abctest</artifactId> <version>3.9.11</version> <scope>system</scope> <systemPath>${basedir}/src/lib/mxgraph-all.jar</systemPath> </dependency> </dependencies> <build> <finalName>${artifactId}</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!--自己寫的應用的主類--> <mainClass>com.pekkle.App</mainClass> <!--能包含本地文件系統的jar包的關鍵--> <includeSystemScope>true</includeSystemScope> </configuration> <executions> <execution> <goals> <!--必須repackage才會生成最終的fat jar--> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>

生成的jar最後直接運行: java -jar ./target/test-maven.jar , 沒有其他依賴。

總結:

本地文件的scope “system” 是被反對使用的,因為這樣的文件是遊離在maven repo之外。雖然可以通過安裝到內網的Nexus倉庫,或者安裝到本機的repo倉庫來提供依賴坐標,但是對於偶爾需要用到第三方jar,又需要整合到mvn package過程的需求來說,似乎還是需要這樣一條路徑。

關於 maven 打包直接運行的 fat jar (uber jar) 時需要包含本地文件系統第三方 jar 文件的問題