[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); } }