1. 程式人生 > >Maven打包方式,以及jar包衝突問題的解決方法

Maven打包方式,以及jar包衝突問題的解決方法

一、打包方式:

Maven可以使用mvn package指令對專案進行打包,如果使用Java -jar xxx.jar執行執行jar檔案,會出現"no main manifest attribute, in xxx.jar"(沒有設定Main-Class)、ClassNotFoundException(找不到依賴包)等錯誤。

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

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

2、要能載入到依賴包。

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

方法一:使用maven-jar-plugin和maven-dependency-plugin外掛打包

在pom.xml中配置:

  1. <build>
  2.     <plugins>
  3.         <plugin>
  4.             <groupId>org.apache.maven.plugins</groupId>
  5.             <artifactId>maven-jar-plugin</artifactId>
  6.             <version>
    2.6</version>
  7.             <configuration>
  8.                 <archive>
  9.                     <manifest>
  10.                         <addClasspath>true</addClasspath>
  11.                         <classpathPrefix>lib/</classpathPrefix>
  12.                         <mainClass
    >com.xxg.Main</mainClass>
  13.                     </manifest>
  14.                 </archive>
  15.             </configuration>
  16.         </plugin>
  17.         <plugin>
  18.             <groupId>org.apache.maven.plugins</groupId>
  19.             <artifactId>maven-dependency-plugin</artifactId>
  20.             <version>2.10</version>
  21.             <executions>
  22.                 <execution>
  23.                     <id>copy-dependencies</id>
  24.                     <phase>package</phase>
  25.                     <goals>
  26.                         <goal>copy-dependencies</goal>
  27.                     </goals>
  28.                     <configuration>
  29.                         <outputDirectory>${project.build.directory}/lib</outputDirectory>
  30.                     </configuration>
  31.                 </execution>
  32.             </executions>
  33.         </plugin>
  34.     </plugins>
  35. </build>

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

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

  1. Class-Path: lib/commons-logging-1.2.jar lib/commons-io-2.4.jar  
  2. Main-Class: com.xxg.Main  

只是生成MANIFEST.MF檔案還不夠,maven-dependency-plugin外掛用於將依賴包拷貝到<outputDirectory>${project.build.directory}/lib</outputDirectory>指定的位置,即lib目錄下。

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

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

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

方法二:使用maven-assembly-plugin外掛打包

在pom.xml中配置:

  1. <build>
  2.     <plugins>
  3.         <plugin>
  4.             <groupId>org.apache.maven.plugins</groupId>
  5.             <artifactId>maven-assembly-plugin</artifactId>
  6.             <version>2.5.5</version>
  7.             <configuration>
  8.                 <archive>
  9.                     <manifest>
  10.                         <mainClass>com.xxg.Main</mainClass>
  11.                     </manifest>
  12.                 </archive>
  13.                 <descriptorRefs>
  14.                     <descriptorRef>jar-with-dependencies</descriptorRef>
  15.                 </descriptorRefs>
  16.             </configuration>
  17.         </plugin>
  18.     </plugins>
  19. </build>

打包方式:
  1. 相關推薦

    Maven打包方式以及jar衝突問題的解決方法

    一、打包方式: Maven可以使用mvn package指令對專案進行打包,如果使用Java -jar xxx.jar執行執行jar檔案,會出現"no main manifest attribute, in xxx.jar"(沒有設定Main-Class)、

    Jar衝突解決方法

    前言 對於Jar包衝突問題,我們開發人員經常都會有碰到,當我們使用一些jar包中的類、方法等,或者有時遇到一些日誌系統的問題(參考另一篇文章Jar包衝突導致的日誌問題),我們會遇到ClassNotFoundException,NoSuchFieldException,N

    tomcat啟動報錯jar衝突解決方法

    從公司的原始碼庫中同步程式碼之後,再啟動tomcat,出現了下面兩張圖的狀況,由於之前的啟動環境是同事給配好的,因此這次打算靠自己解決了。 1、servlet.jar的問題 情景重現: 圖中已經標註出來,檢測servet.jar和servlet_old.jar包時遇到了

    Maven實戰-由一次jar衝突來詳述 Maven 依賴範圍及依賴調節原則

    這篇文章的緣由是剛來搭建的專案有jar包衝突,報下面這個錯基本就是servlet-api包衝突無疑了 Caused by: java.lang.ClassCastException: org.springframework.web.SpringServletContainerInitia

    Maven打包時引入本地jar

    <!--pom.xml-->..... <dependencies> <dependency> <groupId>com.xxxxxx</groupId> <artifactId>xx

    maven專案jar衝突解決方案

    上圖中顯示的是servlet2.3而不是3.0。 解決方法:        網上都說servlet-api衝突是因為專案部署的時候WEB-INFO/lib下面的servlet-api和servlet中的servlet-api產生衝突,其實我的不然。因為我的專案是用maven管理的,在pom.

    maven 打包Scala程式碼到jar

    注意:Scala程式碼要放到Scala目錄下,Java程式碼要放到Java目錄下,否則在打包中會被忽略 mvn clean package預設只處理java原始碼的編譯,打包,如果此時Scala程式碼

    Maven jar衝突解決辦法

    下面兩個配置有簡潔的包依賴衝突: <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</ar

    Maven的傳遞性依賴及其jar衝突解決

    一、Maven簡介 Maven是一個跨平臺的專案管理工具。作為Apache組織的一個頗為成功的開源專案,其主要服務於基於Java平臺的專案建立,依賴管理和專案資訊管理。 二、Maven的依賴管理 1

    使用Maven打包能執行的Jar

    在pom.xml中新增 <properties> <project.build.sourceEncoding>UTF-8</project.build.s

    Gradle 引用第三方庫jar衝突解決方案

    一、使用exclude標籤 //RxTools工具類集合https://github.com/vondear/RxTools api 'com.github.vondear:RxTools:v1.7.6.4' //zxing第三方https://github

    eclipse使用MAVEN打包可執行的jar

    1.新建maven工程 注意勾選 隨便填一下 建好之後工程目錄如下 新建測試類與工具類,主類很簡單 工具類也很簡單,就是初始化了日誌 maven依賴包也只有一個log4j的jar  <dependencies>   <dependency&

    Missing artifact com.oracle:ojdbc7:jar:12.1.0.1. 配置maven.pom.xmlojdbc.jar出錯

    最近oracle資料庫開發需要oracle版本為 12c,配置maven.pom.xml,ojdbc.jar包出錯 原因:maven的中央倉庫中沒有這個資源,只能通過配置本地庫才能載入到專案中去。  解決辦法: (前提是安裝好了maven) 方法步

    maven打包找不到本地jar解決方法

    有時候我們在專案中會引入一些本地jar包,在maven打包時會找不到這些jar,我們需要在pom.xml中的 <pluginManagement> <plugins&

    Mavenjar衝突解決

    用了Maven之後,不得不說它是一個很好的用於專案構建,管理,jar包管理的工具,但是使用過程中,相信各位也遇到過jar衝突這種煩人的問題,特別是大專案,依賴的jar包比較多,很容易造成jar包衝突,jar包衝突的一個很大的原因即產類包之間的間接依賴引起的。每個顯式宣告的類包

    maven打包時候將依賴jar打入

    Java的jar包太多了,有時候我們為了方便執行,希望把所有引用的jar包打包到一起。 <plugins> <plugin> <artifactId>maven-assembly-plug

    maven JAR衝突解決方案

    前言 對於Jar包衝突問題,我們開發人員經常都會有碰到,當我們使用一些jar包中的類、方法等,或者有時遇到一些日誌系統的問題(參考另一篇文章Jar包衝突導致的日誌問題),我們會遇到ClassNotFoundException,NoSuchFieldException,NoSuchMethodExcept

    maven 打包可運行jar(轉)

    cmd ive 加載 多個 build 滿足 ngs clas str 目錄 1、前提 2、方法一:使用maven-jar-plugin和maven-dependency-plugin插件打包 3、方法二:使用maven-assembly-plugin插件打包 4、方法三:

    maven: 打包可執行的jar(java application)及依賴項處理

    IDE環境中,可以直接用exec-maven-plugin外掛來執行java application,類似下面這樣: 1 <plugin> 2 <groupId>org.codehaus.mojo</groupId> 3 <artifact

    maven打包dubbo服務依賴jar缺失問題

    在dubbo服務對應的pom檔案中加入以下內容(install完以後會在pom.xml同級目錄生成dependency-reduced-pom.xml檔案不用管這是打包外掛自動生成的)<!--