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>
二、对于第三方 jar 包,传递依赖到 war 包的,但发布时并不需要的
如:我们项目中使用了 webwork-2.2.3.jar。可以我们在打包后发现在 war 下的 lib 中多了 spring-web-1.2.jar,可是我们项目并不需要这个 jar 啊。
第一种办法:借用**
虽然 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>