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

相关推荐
知其然亦知其所以然2 分钟前
SpringAI + Groq 实战:3 分钟教你搭建超快聊天机器人!
java·后端·openai
M1A114 分钟前
诺贝尔奖得主的终极学习法:西蒙学习法全解读
后端
PetterHillWater41 分钟前
基于AI互联网系统架构分析与评估
后端·aigc
MaxHua1 小时前
多数据源与分库分表方案设计
后端·面试
季风11321 小时前
17.Axon框架-消息
后端·领域驱动设计
苏三说技术1 小时前
Token续期的5种方案
后端
小森林81 小时前
分享一次Guzzlehttp上传批量图片优化的经历
后端·php
码事漫谈1 小时前
一文彻底搞懂缓存:从菜鸟到专家的完全指南
后端
华仔啊1 小时前
final在Java中到底有啥用?5个实际场景告诉你
java·后端
码事漫谈2 小时前
一文读懂:跨服务调用,用HTTP还是RPC?
后端