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目錄下,目錄結構如下:

指定了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