Maven如何構(gòu)建可執(zhí)行的jar包(包含依賴jar包)
目標(biāo):
將依賴的第三方j(luò)ar包打進(jìn)去
方法:
maven-assembly-plugin
環(huán)境:
IDEA 2016.3
JDK 1.8
遇到的問題:
此處耗時(shí)2天時(shí)間,遇到過的坑:
1.修改完pom.xml后,不生效。
--改pom.xml后,代碼不生效,是因?yàn)閷?duì)IDEA工具不熟,在修改完xml后,需要點(diǎn)工具右下角的import changes或者直接點(diǎn)auto-import就可以一勞永逸了。
2.生成jar后,idea可以執(zhí)行,但是java -jar無(wú)法執(zhí)行,報(bào)錯(cuò)Exception in thread "main" java.lang.NoClassDefFoundError
如果修改pom.xml中的mainClass生效了,說(shuō)不定是mainClass傳入的不對(duì),使用mvn exec:java -Dexec.mainClass="com.delon.main.Test"可以嘗試main方法是否正確。
如果想用編譯Test.java文件,可以使用mvn clean compile exec:java -Dexec.mainClass="com.delon.main.Test"
3.生成jar后,idea可以執(zhí)行,java -jar也可以執(zhí)行,但是缺少相關(guān)依賴,報(bào)錯(cuò)Exception in thread "main" java.lang.NoClassDefFoundError: okhttp3/RequestBody
參考如下解決方式即可。
maven構(gòu)建jar包的步驟:
1.執(zhí)行可執(zhí)行的class,代碼內(nèi)需要有入口main方法
2.通過mvn package來(lái)構(gòu)建jar包
3.使用java -jar test.jar來(lái)執(zhí)行jar包
一、包含依賴jar包
maven的pom.xml配置文件
<?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.xxx.delon</groupId> <artifactId>bugly</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <!-- 工程所需jar包引用開始 --> <!-- 單元測(cè)試 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.7</version> <scope>test</scope> </dependency> <!-- 代碼所需依賴 --> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>3.3.0</version> </dependency> <!-- 代碼所需依賴 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.2.2</version> </dependency> <!-- 工程所需jar包引用開始 --> </dependencies> <build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <appendAssemblyId>false</appendAssemblyId> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <!-- 此處指定main方法入口的class --> <mainClass>com.xxx.uploadFile</mainClass> </manifest> </archive> ta </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>assembly</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
生成jar包,會(huì)生成在target目錄下
mvn package
解壓縮bugly-1.0-SNAPSHOT.jar->META-INF->MANIFEST.MF
Manifest-Version: 1.0 Archiver-Version: Plexus Archiver Created-By: Apache Maven Built-By: delon Build-Jdk: 1.8.0_112 Main-Class: com.xxx.uploadFile
執(zhí)行:
# 運(yùn)行jar java -jar test.jar
也可以通過如下命令
mvn assembly:assembly
#跳過測(cè)試 mvn -Dmaven.test.skip=true assembly:assembly
注意:在執(zhí)行這個(gè)命令之前,必須先配置Maven的環(huán)境變量,檢查是否配置可通過命令: mvn -version
如果上面的命令成功執(zhí)行,那么在項(xiàng)目路徑的target文件下就會(huì)有兩個(gè)jar文件,一個(gè)是有jar包依賴的,一個(gè)是沒jar包依賴的。
二、不包含依賴jar包
如果不想包含依賴的jar包,可以把<build>里面的代碼替換成如下code:
<!-- 打包jar文件時(shí),配置manifest文件,加入lib包的jar依賴 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>com.xxx.uploadFile</mainClass> </manifest> </archive> </configuration> </plugin> <!-- 拷貝依賴的jar包到lib目錄 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory> ${project.build.directory}/lib </outputDirectory> </configuration> </execution> </executions> </plugin>
三、只包含部分依賴jar包
如果想只包含部分依賴jar包
比如說(shuō),想做一個(gè)工具jar包,依賴公共jar和自己本地jar包,本地jar包需要解壓成class打到j(luò)ar包內(nèi),而依賴的公共jar包則不需要。
剔除公共jar包 可以用<scope>
<scope>的值的含義:
compile,缺省值,適用于所有階段,會(huì)隨著項(xiàng)目一起發(fā)布。
provided,類似compile,期望JDK、容器或使用者會(huì)提供這個(gè)依賴。如servlet.jar。
runtime,只在運(yùn)行時(shí)使用,如JDBC驅(qū)動(dòng),適用運(yùn)行和測(cè)試階段。
test,只在測(cè)試時(shí)使用,用于編譯和運(yùn)行測(cè)試代碼。不會(huì)隨項(xiàng)目發(fā)布。
system,類似provided,需要顯式提供包含依賴的jar,Maven不會(huì)在Repository中查找它。
編譯的時(shí)候采用 compile
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> <scope>complie</scope> <optional>true</optional> </dependency>
在用package打包的時(shí)候,改成test,生成的jar包里就不會(huì)有該jar包的類了。
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> <scope>test</scope> <optional>true</optional> </dependency>
build配置項(xiàng),mainClass為空因?yàn)椴皇强蓤?zhí)行jar。
<build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass></mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java實(shí)現(xiàn)漢字轉(zhuǎn)unicode與漢字轉(zhuǎn)16進(jìn)制實(shí)例
這篇文章主要介紹了java實(shí)現(xiàn)漢字轉(zhuǎn)unicode與漢字轉(zhuǎn)16進(jìn)制的實(shí)現(xiàn)方法,是Java操作漢字編碼轉(zhuǎn)換的一個(gè)典型應(yīng)用,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-10-10java8 LocalDate LocalDateTime等時(shí)間類用法實(shí)例分析
這篇文章主要介紹了java8 LocalDate LocalDateTime等時(shí)間類用法,結(jié)合具體實(shí)例形式分析了LocalDate、LocalTime、LocalDateTime等日期時(shí)間相關(guān)類的功能與具體使用技巧,需要的朋友可以參考下2017-04-04Netty分布式server啟動(dòng)流程N(yùn)io創(chuàng)建源碼分析
這篇文章主要介紹了Netty分布式server啟動(dòng)流程N(yùn)io創(chuàng)建源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03Spring?Boot實(shí)現(xiàn)微信掃碼登錄功能流程分析
這篇文章主要介紹了Spring?Boot?實(shí)現(xiàn)微信掃碼登錄功能,介紹了授權(quán)流程代碼和用戶登錄和登出的操作代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04老生常談Java中List與ArrayList的區(qū)別
大家都知道List是接口,ArrayList是List接口的一個(gè)實(shí)現(xiàn)類,接下來(lái)通過本文給大家介紹Java中List與ArrayList的區(qū)別,需要的朋友可以參考下2022-08-08Java8接口中引入default關(guān)鍵字的本質(zhì)原因詳析
Default方法是在java8中引入的關(guān)鍵字,也可稱為Virtual extension methods—虛擬擴(kuò)展方法,這篇文章主要給大家介紹了關(guān)于Java8接口中引入default關(guān)鍵字的本質(zhì)原因,需要的朋友可以參考下2022-01-01spring cloud zuul 與 sentinel的結(jié)合使用操作
這篇文章主要介紹了spring cloud zuul 與 sentinel 的結(jié)合使用操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06