使用maven构建springboot2项目。
原文:https://docs.spring.io/spring-boot/docs/2.0.0.M5/reference/htmlsingle/#using-boot-build-systems
maven版本:假设使用eclipse4.7,自带maven3.3。
继承parent
可以继承 spring-boot-starter-parent 工程,已获得一些有用的默认设置,比如:
- Dependency Management:继承了 spring-boot-dependencies POM,帮助你自动设定spring依赖包的 version 。也可以手动指定各个依赖包的版本。 spring-boot v2.m5的默认依赖包的版本可以参考:https://github.com/spring-projects/spring-boot/tree/v2.0.0.M5/spring-boot-project/spring-boot-dependencies/pom.xml
- jdk编译器compliance级别:1.8
- source文件编码:utf-8
- 聪明的resources filtering:开启了对 src/main/resources 目录下的 含有 application 的设定文件(properties/yaml/yml)的filter(maven-resources-plugin)。关于filter进一步可以参考: https://maven.apache.org/plugins/maven-resources-plugin
- 聪明的plugin 配置(exec-maven-plugin,maven-git-commit-id-plugin,maven-shade-plugin等)
pom.xml写法:
<!-- Inherit defaults from Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.M5</version>
</parent>
<!-- override individual dependencies(EX. spring-data-releasetrain) by overriding a property -->
<properties>
<spring-data-releasetrain.version>Fowler-SR2</spring-data-releasetrain.version>
</properties>
不使用继承方式
如果不使用parent,或者必须指定其他的parent的时候,可以利用 dependencyManagement 使用spring boot(scope=import):
<dependencyManagement>
<dependencies>
<!-- Override jackson-databind provided by Spring Boot (2.9.1) -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.0.M5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
与继承parent的方式相比,这种方式不支持 Dependency Management ,指定依赖包版本的写法也不一样,但其他方面一样。就是说,需要我们自己指定spring依赖包的版本。
(注:实践发现,这种方式也支持 Dependency Management)
Spring Boot Maven Plugin
这个plugin可以把工程 package 为一个单一可执行的jar包,也可以直接 spring-boot:run 启动工程。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
如果使用milestone或者snapshot版本,还需要添加:
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<url>http://repo.spring.io/snapshot</url>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<url>http://repo.spring.io/milestone</url>
</pluginRepository>
</pluginRepositories>
注意:默认我们已经继承了parent。如果没有继承自spring-boot-starter-parent,还需要明确 version 。
(注:实践发现,利用dependencyManagement 的import方式也支持 Dependency Management)
打包成war :生成可以发布到 独立容器(服务器)中的war文件,需要指定 packaging=war,并且嵌入的容器需要指定scope=provided。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- ... -->
<packaging>war</packaging>
<!-- ... -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!-- ... -->
</dependencies>
</project>
注意:这个容器需要支持 Servlet 3.0 规范。如果不支持,需要自己追加web.xml文件,并且通过 DispatcherServlet 载入 ApplicationContext 。这里我们添加新版本的maven。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.0</version>
</plugin>
另外,Application 是否需要extends SpringBootServletInitializer
,有待于验证。经过验证,不需要处理 扩展 SpringBootServletInitializer
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
// 不需要扩展 SpringBootServletInitializer, 此处代码不需要
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
...
}
maven spring-boot:run
maven package
均成功。
验证结果:生成war文件,放到tomcat8.0.15下面启动成功,http get成功。验证用的pom.xml:
<project
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework</groupId>
<artifactId>gs-rest-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging> <!-- 验证1:生成war文件。默认为jar -->
<properties>
<java.version>1.8</java.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin> <!-- 验证2:打包成war文件,换成version3.2。默认的version2.2会提示缺少web.xml,可以配置,也可以像这里这样换版本,因为version3之后的默认配置有变化 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.0</version>
</plugin>
</plugins>
</build>
<dependencyManagement> <!-- 验证4:不使用继承parent方式添加依赖 -->
<dependencies>
<!-- Override Spring Data release train provided by Spring Boot -->
<dependency> <!-- 验证3:个别修改依赖包的版本:默认版本2.9.1 -->
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.0.M5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency> <!-- 验证5:打包成war,war中不包含容器环境,需要发布到容器环境。默认含有容器环境(tomcat/jetty),可以自启动 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
关于plugin的更多内容,可以参考:https://docs.spring.io/spring-boot/docs/2.0.0.M5/maven-plugin//
以上