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);
    }
}
相关文章
相关标签/搜索