[TOC]html
上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。java
咱们知道,传统应用能够将程序打包成 war
文件,部署到 Tomcat
容器中运行。而 spring boot
默认内置集成了 tomcat
容器,提供将应用打包成独立的 jar
包,并经过 java
命令 java -jar <name>.jar
直接运行,接下来简单介绍下这两种打包方式。spring
查看 spring boot
官方文档 Part VIII. Build tool plugins 中 Spring Boot Maven Plugin一节内容,主要配置为:apache
<?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"> <modelVersion>4.0.0</modelVersion> <!-- ... --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.0.3.RELEASE</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
<?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>jar</packaging> <!-- ... --> </project>
mvn clean package -Dmaven.test.skip=true
spring boot 支持生成传统 war
包,同时也支持 java -jar
命令运行。查看官方文档 Traditional Deployment,配置以下:tomcat
引入 spring-boot-maven-plugin 插件,同上。app
配置打包文件格式,配置以下:maven
<packaging>war</packaging>
tomcat starter
依赖, 并设置 scope
为 provided
<dependencies> <!-- … --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <!-- … --> </dependencies>
SpringBootServletInitializer
,并复写 configure
方法@SpringBootApplication public class Application extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class); } public static void main(String[] args) throws Exception { SpringApplication.run(Application.class, args); } }
此时,生成的 war
包,既能够部署在 Tomcat
容器中,又能够经过 java -jar
命令运行。ide
在项目部署过程当中有时候会遇到打包本地 jar 包 到 war 包中,应该如何处理呢? 在使用 IDEA 开发环境中,咱们经过 Add as Library...
设置成 Project lib
或 Module lib
后,发如今项目打包后, war
包中并无包含本地的 jar
文件。其实,这里还须要几步配置来完成:spring-boot
spring-boot-maven-plugin
配置,设置 includeSystemScope
为 true
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <includeSystemScope>true</includeSystemScope> </configuration> </plugin>
system
,并设置依赖包路径。<dependency> <groupId>org.apache</groupId> <artifactId>opensaml</artifactId> <version>2.3.1</version> <scope>system</scope> <systemPath>${basedir}/src/main/lib/opensaml-2.3.1.jar</systemPath> </dependency>
经过以上两步,本地路径下的 ${basedir}/src/main/lib/opensaml-2.3.1.jar
包就会被打包到 war 文件中。可是须要注意的是 system
范围与provided
范围相似,打包后的 jar
文件会被放在 WEB-INF/lib-provided
目录下,若是直接经过 java -jar
命令运行 war
文件,能够正常启动。若是将 war
文件放在 Tomcat
容器中直接运行,可能会报错: class not found
。这是由于:ui
Start-Class: hello.Application Spring-Boot-Classes: WEB-INF/classes/ Spring-Boot-Lib: WEB-INF/lib/ Main-Class: org.springframework.boot.loader.WarLauncher
Tomcat
只检查servlet
定义的WEB-INF/lib
路径,但java -jar
时、Spring
的WarLauncher
还引入了存放着Tomcat
相关jar
的lib-provided
目录
@Override public boolean isNestedArchive(Archive.Entry entry) { if (entry.isDirectory()) { return entry.getName().equals(WEB_INF_CLASSES); } else { return entry.getName().startsWith(WEB_INF_LIB) || entry.getName().startsWith(WEB_INF_LIB_PROVIDED); } }