1. 程式人生 > >Maven引入本地依賴Jar到可執行Jar包中

Maven引入本地依賴Jar到可執行Jar包中

log copyright 目錄 -1 maven中央倉庫 div maven項目 path archive

在Maven中,默認地,是不會將依賴的Jar包打入可執行Jar包的,如果需要將依賴打入可執行Jar包,需要在pom中添加maven-assembly-plugin插件,這個很容易實現,但是在正規開發中不推薦這樣使用,為什麽?因為稍微大型一些的項目都至少有幾十個依賴項,而每次打包都將這些Jar包打入可執行Jar,使得最後生成的可執行Jar體積非常大。標準的做法是,將所有的依賴Jar包都打入lib目錄中,而在可執行Jar的MANIFEST.MF中指定lib路徑即可。這也很容易實現,並不是本文的重點,本文的重點是如何將不在Maven中央倉庫中的Jar包,或者說依賴本地的Jar包打入可執行Jar,並更新
MANIFEST.MF文件。

例如在我的Maven項目中,需要依賴本地Jar,首先將依賴的Jar復制到src/main/resources/lib目錄下,引用如下

1 2 3 4 5 6 7 <dependency> <groupId>com.yuewen</groupId> <artifactId>lucene</artifactId> <version>1.0.0-SNAPSHORT</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/resources/lib/lucene-1.0.0-SNAPSHORT.jar</systemPath>
</dependency>

這裏的scope只能是system範圍,systemPath屬性指定Jar包的路徑。

下一步將所有依賴的Jar包打入lib目錄中,方式如下

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <!--將依賴的資源全部打入lib目錄--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId>
<configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> <excludeTransitive>false</excludeTransitive> <stripVersion>false</stripVersion> </configuration> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> <excludeTransitive>false</excludeTransitive> <stripVersion>false</stripVersion> </configuration> </execution> </executions> </plugin>

至此,你在Maven項目中,依賴的所有Jar都被打入到target/lib目錄下了,剩下的關鍵一步就是如何添加MANIFEST.MF文件了。在pom中添加如下插件

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <!--打包插件,在Jar包中添加Class-Path和Main-Class--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.0.2</version> <configuration> <archive> <!--使用自己的Manifest文件,運行正常--> <!--<manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>--> <!--使用插件添加的Manifest文件,運行正常,一定要註意Manifest中jar包名稱和lib文件夾下jar包名稱版本號後綴等一定要一致,否則找不到依賴jar,此處有坑--> <manifest> <addClasspath>true</addClasspath> <!--指定依賴資源路徑前綴--> <classpathPrefix>lib/</classpathPrefix> <mainClass>cn.codepub.maven.test.Main</mainClass> </manifest> <!--可以把依賴本地系統的Jar包加入Manifest文件中--> <manifestEntries> <Class-Path>lib/lucene-1.0.0-SNAPSHORT.jar</Class-Path> </manifestEntries> </archive> </configuration> </plugin>

運行mvn clean package執行打包,完成之後,將包含依賴資源的lib目錄和可執行Jar放在同一級目錄下即可,這樣在運行java -jar xxx.jar的時候,可執行Jar包可以準確地找到依賴Jar包。並且以這種方式打出來的可執行Jar體積非常小,一般都是幾百KB而已。完整的MANIFEST.MF文件如下所示

1 2 3 4 5 6 7 Manifest-Version: 1.0 Built-By: wangxu Class-Path: lib/lombok-1.16.12.jar lib/guava-20.0.jar lib/log4j-api-2. 7.jar lib/log4j-core-2.7.jar lib/lucene-1.0.0-SNAPSHORT.jar Created-By: Apache Maven 3.3.3 Build-Jdk: 1.8.0_45 Main-Class: cn.codepub.maven.test.Main

本文地址:http://www.codepub.cn/2017/06/13/Maven-introduces-local-dependency-jar-to-executable-jar-packages/

Maven引入本地依賴Jar到可執行Jar包中