天天看點

maven多子產品合并打包_Maven是什麼?它打包的三種方式?方法一:使用maven-jar-plugin和maven-dependency-plugin插件打包方法二:使用maven-assembly-plugin插件打包方法三:使用maven-shade-plugin插件打包

maven到底是什麼呢,Maven是基于項目對象模型,Maven的核心功能便是合理叙述項目間的依賴關系,通俗點講,就是通過pom.xml檔案的配置擷取jar包,而不用手動去添加jar包,而這裡pom.xml檔案對于學了一點maven的人來說,就有些熟悉了,怎麼通過pom.xml的配置就可以擷取到jar包呢?pom.xml配置檔案從何而來?等等類似問題我們需要搞清楚,如果需要使用pom.xml來擷取jar包,那麼首先該項目就必須為maven項目,maven項目可以這樣去想,就是在java項目和web項目的上面包裹了一層maven,本質上java項目還是java項目,web項目還是web項目,但是包裹了maven之後,就可以使用maven提供的一些功能了。

Maven可以使用mvn package指令對項目進行打包,如果使用Java-jar xxx.jar執行運作jar檔案,會出現no main manifest attribute, in xxx.jar、ClassNotFoundException等錯誤。

要想jar包能直接通過java -jar xxx.jar運作,需要滿足:

1、要能加載到依賴包。

使用Maven有以下幾種方法可以生成能直接運作的jar包,可以根據需要選擇一種合适的方法。

2、在jar包中的META-INF/MANIFEST.MF中指定Main-Class,這樣才能确定程式的入口在哪裡;

方法一:使用maven-jar-plugin和maven-dependency-plugin插件打包

在pom.xml中配置:

org.apache.maven.plugins

maven-jar-plugin

2.6

true

lib/

com.xxg.Main

org.apache.maven.plugins

maven-dependency-plugin

2.10

copy-dependencies

package

copy-dependencies

${project.build.directory}/lib

maven-jar-plugin用于生成META-INF/MANIFEST.MF檔案的部分内容,com.xxg.Main指定MANIFEST.MF中的Main-Class,true會在MANIFEST.MF加上Class-Path項并配置依賴包,lib/指定依賴包所在目錄。

例如下面是一個通過maven-jar-plugin插件生成的MANIFEST.MF檔案片段:

Class-Path: lib/commons-logging-1.2.jar lib/commons-io-2.4.jar

Main-Class: com.xxg.Main

隻是生成MANIFEST.MF檔案還不夠,maven-dependency-plugin插件用于将依賴包拷貝到${project.build.directory}/lib指定的位置,即lib目錄下。

配置完成後,通過mvn package指令打包,會在target目錄下生成jar包,并将依賴包拷貝到target/lib目錄下,目錄結構如下:

maven多子產品合并打包_Maven是什麼?它打包的三種方式?方法一:使用maven-jar-plugin和maven-dependency-plugin插件打包方法二:使用maven-assembly-plugin插件打包方法三:使用maven-shade-plugin插件打包

指定了Main-Class,有了依賴包,那麼就可以直接通過java -jar xxx.jar運作jar包。

這種方式生成jar包有個缺點,就是生成的jar包太多不便于管理,下面兩種方式隻生成一個jar檔案,包含項目本身的代碼、資源以及所有的依賴包。

方法二:使用maven-assembly-plugin插件打包

在pom.xml中配置:

org.apache.maven.plugins

maven-assembly-plugin

2.5.5

com.xxg.Main

jar-with-dependencies

打包方式:

mvn package assembly:single

打包後會在target目錄下生成一個xxx-jar-with-dependencies.jar檔案,這個檔案不但包含了自己項目中的代碼和資源,還包含了所有依賴包的内容。是以可以直接通過java -jar來運作。

此外還可以直接通過mvn package來打包,無需assembly:single,不過需要加上一些配置:

org.apache.maven.plugins

maven-assembly-plugin

2.5.5

com.xxg.Main

jar-with-dependencies

make-assembly

package

single

其中package、single即表示在執行package打包時,執行assembly:single,是以可以直接使用mvn package打包。不過,如果項目中用到spring Framework,用這種方式打出來的包運作時會出錯,使用下面的方法三可以處理。

方法三:使用maven-shade-plugin插件打包

在pom.xml中配置:

org.apache.maven.plugins

maven-shade-plugin

2.4.1

package

shade

com.xxg.Main

配置完成後,執行mvn package即可打包。在target目錄下會生成兩個jar包,注意不是original-xxx.jar檔案,而是另外一個。和maven-assembly-plugin一樣,生成的jar檔案包含了所有依賴,是以可以直接運作。如果項目中用到了Spring Framework,将依賴打到一個jar包中,運作時會出現讀取XML schema檔案出錯。原因是Spring Framework的多個jar包中包含相同的檔案spring.handlers和spring.schemas,如果生成一個jar包會互相覆寫。為了避免互相影響,可以使用AppendingTransformer來對檔案内容追加合并:

org.apache.maven.plugins

maven-shade-plugin

2.4.1

package

shade

com.xxg.Main

META-INF/spring.handlers

META-INF/spring.schemas

繼續閱讀