# war 包去掉不必要的 jar 包

Maven 2 虽然把编译时需要的 jar 都下载了,但并不是所有编译需要的 jar 在打成 war 包后运行时也需要。所以也就发现有许多的 jar 是不需要的,以至 war 包比较大或者有冲突。

一、对于容器提供的(如:servlet-api-2.3 等)和测试需要时的(如:junit-3.81 等),可以直接在 pom.xml 中去掉。

根据依赖范围:<scope>provided</scope>

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>

1
2
3
4
5
6
7
8
9
10
11
12
13

二、对于第三方 jar 包,传递依赖到 war 包的,但发布时并不需要的

如:我们项目中使用了 webwork-2.2.3.jar。可以我们在打包后发现在 war 下的 lib 中多了 spring-web-1.2.jar,可是我们项目并不需要这个 jar 啊。

第一种办法:借用**provided**

虽然 provided 的本意是指 jdk 或者容器提供的,只是编译中使用,但不会打到 war 中,但我们也可借用。

 <dependency>
	<groupId>org.springframework</groupId>
 	<artifactId>spring-web</artifactId>
	<version>1.2</version>
	<scope>provided</scope>
</dependency>

1
2
3
4
5
6
7

第二种办法: 使用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>

1
2
3
4
5
6
7
8
9
10
11
12