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>