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

相关推荐
期待のcode1 天前
Spring框架1—Spring的IOC核心技术1
java·后端·spring·架构
Livingbody1 天前
10分钟完成 ERNIE-4.5-21B-A3B-Thinking深度思考模型部署
后端
胡萝卜的兔1 天前
go 日志的分装和使用 Zap + lumberjack
开发语言·后端·golang
en-route1 天前
如何在 Spring Boot 中指定不同的配置文件?
java·spring boot·后端
栀椩1 天前
springboot配置请求日志
java·spring boot·后端
Swift社区1 天前
如何解决 Spring Bean 循环依赖
java·后端·spring
爱吃烤鸡翅的酸菜鱼1 天前
【Redis】常用数据结构之Hash篇:从常用命令到使用场景详解
数据结构·数据库·redis·后端·缓存·哈希算法
bobz9651 天前
calico vxlan 模式如何实现和公有云一样的 VPC 功能?
后端
面汤放盐1 天前
互联网“黑话”生存实用指南(100)
java·后端
爱吃烤鸡翅的酸菜鱼1 天前
【Redis】常用数据结构之List篇:从常用命令到典型使用场景
数据结构·redis·后端·缓存·list