文档章节

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

Os_yxguang
 Os_yxguang
发布于 06/21 23:44
字数 893
阅读 91
收藏 19

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

[TOC]

上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。

spring boot 打包方式

我们知道,传统应用可以将程序打包成 war 文件,部署到 Tomcat 容器中运行。而 spring boot 默认内置集成了 tomcat 容器,提供将应用打包成独立的 jar 包,并通过 java 命令 java -jar <name>.jar 直接运行,接下来简单介绍下这两种打包方式。

spring boot 打 jar

查看 spring boot 官方文档 Part VIII. Build tool pluginsSpring Boot Maven Plugin一节内容,主要配置为:

  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,配置如下:

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

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

<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 命令运行。

打包本地 jar

在项目部署过程中有时候会遇到打包本地 jar 包 到 war 包中,应该如何处理呢? 在使用 IDEA 开发环境中,我们通过 Add as Library... 设置成 Project libModule lib 后,发现在项目打包后, war 包中并没有包含本地的 jar 文件。其实,这里还需要几步配置来完成:

  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。这是因为:

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 时、SpringWarLauncher 还引入了存放着 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);
    }
}

© 著作权归作者所有

共有 人打赏支持
Os_yxguang
粉丝 0
博文 9
码字总数 3349
作品 0
程序员
springboot冲突导致的发版失败

一、Spring boot因为内嵌tomcat容器,项目发布的时候可以把项目打包为jar包,如何将spring boot项目打包成可发布到tomcat中的war包项目呢?# # 1.需要打包成war包项目,首先需要在pom.xml文件...

坎布里奇
08/17
0
0
精通SpringBoot——第五篇:写一个spring-boot-starter包

为了能更好的理解Springboot的自动配置和工作原理,我们今天来手写一个spring-boot-hello-starter。这个过程很简单,代码不多。接下来我们看看怎么开始实践。 1. 新建maven工程。 这块就不演...

developlee
07/25
0
0
maven系列小技巧之Top3 MVQ(most valuable question)

首先声明,文章系个人原创 ,欢迎转载,转载请注明出处。 对于maven,有大神曾说过:如果你爱他,就请让他用Maven,因为那里是天堂,如果你恨他,就请让他用Maven,因为那里是地狱。尤其是m...

曦阳x
2017/08/13
0
0
Spring Boot整合MyBatis学习总结

公司的很多项目都陆陆续续引入了Spring Boot,通过对Spring Boot的接触了解发现其真的是大大地简化了开发、简化了依赖配置,很多功能注解一下就可以实现,真的是太方便了。下面记录了一个Spr...

zhuwensheng
06/29
0
0
【转】Spring Boot快速入门

简介 在您第1次接触和学习Spring框架的时候,是否因为其繁杂的配置而退却了?在你第n次使用Spring框架的时候,是否觉得一堆反复黏贴的配置有一些厌烦?那么您就不妨来试试使用Spring Boot来让...

HAVENT
07/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

驰狼课堂

http://www.chilangedu.com/

求是科技
15分钟前
0
0
jumpserver 报错"Incorrect string value

申明 本文所有内容参考自jumpserver记录命令无法入库问题 #1773 简介 jumpserver 1.4.0在jumpserver.log中大量报错,错误日志 File "/opt/jumpserver/apps/terminal/api.py", line 246, i...

zhnxin
22分钟前
2
0
用户管理相关配置文件及命令

9月19日任务 2.27linux和windows互传文件 3.1 用户配置文件和密码配置文件 3.2 用户组管理 3.3 用户管理 扩展知识 实用小工具 简单命令行下实现Linux/Windows文件互传 前提:使用远程工具Xsh...

robertt15
40分钟前
0
0
presto 架构

presto 介绍 是Facebook开源的,完全基于内存的并⾏计算,分布式SQL交互式查询引擎 是一种Massively parallel processing (MPP)架构,多个节点管道式执⾏ ⽀持任意数据源(通过扩展式Connect...

张欢19933
40分钟前
0
0
Ajax技术应用

1. 相关概述 1. ajax:即异步js与xml,可以实现客户端与服务端之间数据的异步交互。对于普通的B/S 模式是采用的同步方式,即一次请求必须等待一次服务器响应完成,而异步则是客户端发送请求后...

江左煤郎
40分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部