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
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了。