Spring boot 項目打包及引入本地jar包

Spring Boot 項目打包以及引入本地Jar包

[TOC]html

上篇文章提到 Maven 項目添加本地jar包的三種方式 ,本篇文章記錄下在實際項目中的應用。java

spring boot 打包方式

咱們知道,傳統應用能夠將程序打包成 war 文件,部署到 Tomcat 容器中運行。而 spring boot 默認內置集成了 tomcat 容器,提供將應用打包成獨立的 jar 包,並經過 java 命令 java -jar <name>.jar 直接運行,接下來簡單介紹下這兩種打包方式。spring

spring boot 打 jar

查看 spring boot 官方文檔 Part VIII. Build tool pluginsSpring Boot Maven Plugin一節內容,主要配置爲:apache

  1. 引入 spring-boot-maven-plugin 插件,配置以下:
<?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>
  1. 配置打包文件格式,配置以下:
<?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>
  1. 運行打包命令,命令以下:
mvn clean package -Dmaven.test.skip=true

spring boot 打 war

spring boot 支持生成傳統 war 包,同時也支持 java -jar 命令運行。查看官方文檔 Traditional Deployment,配置以下:tomcat

  1. 引入 spring-boot-maven-plugin 插件,同上。app

  2. 配置打包文件格式,配置以下:maven

<packaging>war</packaging>
  1. 引入 tomcat starter 依賴, 並設置 scopeprovided
<dependencies>
	<!-- … -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-tomcat</artifactId>
		<scope>provided</scope>
	</dependency>
	<!-- … -->
</dependencies>
  1. 修改程序入口,繼承 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);
	}
}
  1. 運行打包命令,同上。

此時,生成的 war 包,既能夠部署在 Tomcat 容器中,又能夠經過 java -jar 命令運行。ide

打包本地 jar

在項目部署過程當中有時候會遇到打包本地 jar 包 到 war 包中,應該如何處理呢? 在使用 IDEA 開發環境中,咱們經過 Add as Library... 設置成 Project libModule lib 後,發如今項目打包後, war 包中並無包含本地的 jar 文件。其實,這裏還須要幾步配置來完成:spring-boot

  1. 修改 spring-boot-maven-plugin 配置,設置 includeSystemScopetrue
<plugin>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-maven-plugin</artifactId>
    	<configuration>
        	<includeSystemScope>true</includeSystemScope>
    	</configuration>
	</plugin>
  1. 設置依賴包範圍爲 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 相關 jarlib-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);
    }
}
相關文章
相關標籤/搜索