MAVEN构建分离依赖JAR

MAVEN构建分离依赖JAR

1. 背景说明

在Springboot项目中,项目构建时,默认打包成一个可以执行的jar包.导致单一jar过大.项目部署过程中,需要把依赖的jar包和配置文件都单独存放到指定的文件夹中.

2. 插件配置

  1. maven-compiler-plugin 用于编译java代码
  2. maven-jar-plugin 用于构建jar包
  3. spring-boot-maven-plugin 用于构建Springboot项目
  4. maven-assembly-plugin 用于打包项目

3. 编译配置

xml 复制代码
<!--小游戏 地心侠士 -->
<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-compiler-plugin</artifactId>
   <configuration>
     <annotationProcessorPaths>
      	<path>
      		<groupId>org.projectlombok</groupId>
      		<artifactId>lombok</artifactId>
      		<version>${lombok.version}</version>
      </path>
     </annotationProcessorPaths>
   </configuration>
</plugin>

4. 构建jar配置

xml 复制代码
<!--小游戏 地心侠士 -->
<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-jar-plugin</artifactId>
   <configuration>
      <archive>
        <manifest>
      	 <useUniqueVersions>false</useUniqueVersions>
         <mainClass>com.herbert.Application</mainClass>
        </manifest>
      </archive>
      <excludes>
      	<exclude>*.properties</exclude>
      	<exclude>*.yml</exclude>
      	<exclude>**/mapper/*.xml</exclude>
      </excludes>
   </configuration>
</plugin>

5. 构建springboot项目配置

其中主要配置 <layout>ZIP\</layout> 为关键配置,打包后的jar包对应MANIFEST.MF配置的启动类为 Main-Class: org.springframework.boot.loader.PropertiesLauncher

xml 复制代码
<!--小游戏 地心侠士 公众号:小满小慢 QQ:464884492-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layout>ZIP</layout>
<includes>
	<include>
		<groupId>non-exists</groupId>
		<artifactId>non-exists</artifactId>
	</include>
</includes>
<excludes>
	<exclude>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
	</exclude>
</excludes>
</configuration>
</plugin>

5. 项目整体打包配置

xml 复制代码
<!--小游戏 地心侠士 公众号:小满小慢 QQ:464884492-->
<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-assembly-plugin</artifactId>
   <configuration>
      <appendAssemblyId>false</appendAssemblyId>
      <descriptors>
      	<descriptor>./package.xml</descriptor>
      </descriptors>
      <outputDirectory>${project.basedir}/dist</outputDirectory>
   </configuration>
   <executions>
      <execution>
      	<id>make-assembly</id>
      	<phase>package</phase>
      	<goals>
      		<goal>single</goal>
      	</goals>
      </execution>
   </executions>
</plugin>

其中 package.xml文件内容如下

xml 复制代码
<assembly
	xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
	<id>distribution</id>
	<formats>
		<format>zip</format>
	</formats>
    <!--小游戏 地心侠士 公众号:小满小慢 QQ:464884492-->
	<includeBaseDirectory>false</includeBaseDirectory>
	<fileSets>
		<fileSet>
			<directory>src/main/resources/</directory>
			<outputDirectory>/resources</outputDirectory>
			<filtered>true</filtered>
		</fileSet>
		<fileSet>
			<directory>${project.basedir}/script</directory>
			<outputDirectory>/</outputDirectory>
			<filtered>true</filtered>
		</fileSet>
		 <fileSet>
		    <directory>${project.basedir}/web/</directory>
			<outputDirectory>/resources/static</outputDirectory>
		 </fileSet>
	</fileSets>
	<dependencySets>
	  <dependencySet>
			<outputDirectory>/lib</outputDirectory>
			<scope>runtime</scope>
			<excludes>
				<exclude>${project.groupId}:${project.artifactId}</exclude>
			</excludes>
		</dependencySet>
		<dependencySet>
			<outputDirectory>/</outputDirectory>
			<includes>
				<include>${project.groupId}:${project.artifactId}</include>
			</includes>
		</dependencySet>
	</dependencySets>
</assembly>

fileSets/fileSet/filtered 属性为true时,表示在maven复制文件时,可以把maven的占位符替换成对应的值,比如需要打包文件中包含一个startup.bat文件,项目打包的源文件配置如下:

bat 复制代码
@echo off
title ${project.artifactId}-${project.version}-%date%-%time%-%cd%
java -Dloader.debug=true -jar  ${project.artifactId}-${project.version}.jar

项目打包后,输出文件内容会改变成如下:

bat 复制代码
rem 小游戏 地心侠士 by herbert
@echo off
title herbert.1.0.0-%date%-%time%-%cd%
java -Dloader.debug=true -jar herbert-1.0.0.jar

7. 项目启动问题

根据以上配置后,需要动态指定PropertiesLauncher的loader.path来加载分离后的lib,以及其他资源文件.这里提供两个实用的方法

  1. 通过 java -D指定参数

    java -jar -Dloader.path=resources,lib,plugin hebert-1.0.0-SNAPSHOT.jar

  2. 在jar包同级目录下创建loader.properties文件,并添加如下内容

    loader.path=resources,lib,plugin

相关推荐
韩师学子--小倪4 小时前
fastjson与gson的toString差异
java·json
Drawing stars4 小时前
JAVA后端 前端 大模型应用 学习路线
java·前端·学习
nbsaas-boot4 小时前
SQL Server 存储过程开发规范(公司内部模板)
java·服务器·数据库
行百里er5 小时前
用 ThreadLocal + Deque 打造一个“线程专属的调用栈” —— Spring Insight 的上下文管理术
java·后端·架构
玄〤5 小时前
黑马点评中 VoucherOrderServiceImpl 实现类中的一人一单实现解析(单机部署)
java·数据库·redis·笔记·后端·mybatis·springboot
J_liaty5 小时前
Spring Boot拦截器与过滤器深度解析
java·spring boot·后端·interceptor·filter
亲爱的非洲野猪6 小时前
Java锁机制八股文
java·开发语言
rgeshfgreh6 小时前
C++字符串处理:STL string终极指南
java·jvm·算法
Zoey的笔记本6 小时前
「支持ISO27001的GTD协作平台」数据生命周期管理方案与加密通信协议
java·前端·数据库
lpfasd1236 小时前
Spring Boot 4.0.1 时变更清单
java·spring boot·后端