1. 程式人生 > >maven打包時去除不需要的jar包策略

maven打包時去除不需要的jar包策略

Maven1中,需要把依賴所需要的包每個列出。這對於使用類似如Hibernate的使用者來說所操的心太多了,而且也不方便。在Maven2中實現了傳遞依賴,如此對於Hibernate所依賴的包,Maven2會自動下載,開發人員只需關心Hibernate即可。所以可以看出列出所需要的每個jar是在maven1中的功能,Maven2認為自動下載是一種改進

       這樣就產生了一個問題:Maven2雖然把編譯時需要的jar都下載了,但並不是所有編譯需要的jar在打成war包後執行時也需要。所以也就發現有許多的jar是不需要的,以至war包比較大。我們可以通過以下方式改善:

策略一:

對於容器提供的(如:servlet-api-2.3等)和測試需要時的(如:junit-3.81等),可以直接在pom.xml中去掉。

maven的dependency中有一個tag是<scope>option</scope>,其option有以下幾個值:

  compile, 預設值,適用於所有階段,會隨著專案一起釋出。

  provided,類似compile,期望JDK、容器或使用者會提供這個依賴。如servlet-api-2.3.jar。

  runtime

, 在執行時使用,如JDBC驅動,適用執行和測試階段。   如plexus-utils-1.1.jar

  test     只在測試時使用,用於編譯和執行測試程式碼。不會隨專案釋出。如Junit-3.8.1.jar

  system, 類似provided,需要顯式提供包含依賴的jar,Maven不會在Repository中查詢它。

如:

<dependency>

          <groupId>servletapi</groupId>

          <artifactId>servlet-api</artifactId>

          <version>2.4</version>

<scope>provided</scope>

     </dependency>

          <dependency>

               <groupId>junit</groupId>

               <artifactId>junit</artifactId>

               <version>3.8.1</version>

<scope>test</scope>

          </dependency>

策略二:

對於第三方jar包,傳遞依賴到war包的,但釋出時並不需要的。

如:我們專案中使用了webwork-2.2.3.jar。可以我們在打包後發現在war下的lib中多了spring-web-1.2.jar,可是我們專案並不需要這個jar啊。

第一種辦法:借用<scope>provided</scope>

雖然provided的本意是指jdk或者容器提供的,只是編譯中使用,但不會打到war中,但我們也可借用。

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-web</artifactId>

            <version>1.2</version>

            <scope>provided</scope>

        </dependency>

第二種辦法: 使用exclusions (效果與第一種相同)

<dependency>

            <groupId>opensymphony</groupId>

            <artifactId>webwork</artifactId>

            <version>2.2.3</version>

              <exclusions>

                    <exclusion>

                        <groupId>org.springframework</groupId>

                        <artifactId>spring-web</artifactId>

                    </exclusion>

               </exclusions>

     </dependency>

 

 

 

策略三:

對於我們公司內部開發的jar包,我們都加上<optional>true</optional>這樣可以使引用這些jar的專案不會產生傳遞依賴。

如:專案mycom-csa中使用了mycom-cas-client-1.0.3.jar,然而mycom-cas-client-1.0.3.jar 又使用了mycom-common-security-1.0.3.jar。所以我們在對mycom-csa打包時會把mycom-common-security-1.0.3.jar打進package中。我們當然可以參考“策略二”,但最好的方法是:可以通知開發mycom-cas-client-1.0.3.jar的同事在mycom-cas-client-1.0.3.jar的pom.xml中對dependency修改為:

<dependency>

      <groupId>com.mycom</groupId>

      <artifactId>mycom-common-security</artifactId>

      <version>1.0.3-SNAPSHOT</version>

       <optional>true</optional>

    </dependency>

新增<optional>true</optional> 這樣我們再打包時mycom-csa中就不會出現mycom-common-security-1.0.3.jar了。