Maven的Dependency scope是用来限制Dependency的作用范围的, 影响maven项目在各个生命周期时导入的package的状态。总共有6种范围,默认是compile,作用于整个生命周期。当scope设置为provided时,打包的时候可以不用包进去。该依赖理论上可以参与编译,测试,运行等周期,相当于compile,但是在打包阶段做了exclude的动作。

例如,Java EE中Servlet api,我们在编译的时候用到servlet-api和jsp-api,但在打包的时候不用这两个依赖,因为容器都有提供。

1
2
3
4
5
6
7
8
9
10
11
12
<dependency>  
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>

但是在spring boot当中,当Dependency scope设置为provided时,例如:

1
2
3
4
5
6
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>provided</scope>
</dependency>

spring-boot-devtools这个依赖帮助我们在开发的时候使用LiveReload或者Hot swapping,但是正式环境中用不到它(也有用但是我用不着),所以就没必要将这个依赖打入jar中,我将其设置为<scope>provided</scope>,但是生成executable jar中依旧含有这个jar包。

Spring-Boot-exclude-dependency

我们使用Spring Boot时,都会使用Spring Boot Maven Plugin插件,其中的一个作用通过spring-boot:repackage生成一个可执行的jar或者war。一个可执行的jar当中必然包含servlet容器,如默认的tomcat,所以repackage设计成:即使dependencies的scope为provided,依旧会将依赖打入jar当中。

为了可以excluded dependencies from the executable jar,所以Spring Boot Maven Plugin可以通过配置去排除依赖exclude dependency

  • 通过特定的groupIdartifactId来排除 (有的依赖还有classifier)
  • 通过指定artifactId来排除:任何符合给定的artifactId都被排除
  • 通过指定groupId来排除属于这个groupId下的依赖

排除特定依赖com.foo:bar

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<project>
...
<build>
...
<plugins>
...
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.4.2.RELEASE</version>
<configuration>
<excludes>
<exclude>
<groupId>com.foo</groupId>
<artifactId>bar</artifactId>
</exclude>
</excludes>
</configuration>
...
</plugin>
...
</plugins>
...
</build>
...
</project>

排除artifact为my-lib 或者 another-lib的依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<project>
...
<build>
...
<plugins>
...
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.4.2.RELEASE</version>
<configuration>
<excludeArtifactIds>my-lib,another-lib</excludeArtifactIds>
</configuration>
...
</plugin>
...
</plugins>
...
</build>
...
</project>

排除所有属于com.foo这个group的依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<project>
...
<build>
...
<plugins>
...
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.4.2.RELEASE</version>
<configuration>
<excludeGroupIds>com.foo</excludeGroupIds>
</configuration>
...
</plugin>
...
</plugins>
...
</build>
...
</project>