Spring Boot去除provided的依赖
Maven的Dependency scope是用来限制Dependency的作用范围的, 影响maven项目在各个生命周期时导入的package的状态。总共有6种范围,默认是compile,作用于整个生命周期。当scope设置为provided时,打包的时候可以不用包进去。该依赖理论上可以参与编译,测试,运行等周期,相当于compile,但是在打包阶段做了exclude的动作。
例如,Java EE中Servlet api,我们在编译的时候用到servlet-api和jsp-api,但在打包的时候不用这两个依赖,因为容器都有提供。
1 | <dependency> |
但是在spring boot当中,当Dependency scope设置为provided时,例如:
1 | <dependency> |
spring-boot-devtools这个依赖帮助我们在开发的时候使用LiveReload或者Hot swapping,但是正式环境中用不到它(也有用但是我用不着),所以就没必要将这个依赖打入jar中,我将其设置为<scope>provided</scope>,但是生成executable jar中依旧含有这个jar包。

我们使用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
- 通过特定的
groupId和artifactId来排除 (有的依赖还有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>