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

相关推荐
用户960102251622 分钟前
kubesphere的告别,从可用环境提取Kubesphere镜像
后端
种子q_q4 分钟前
组合索引、覆盖索引、聚集索引、非聚集索引的区别
后端·面试
码事漫谈5 分钟前
WaitForSingleObject 函数参数影响及信号处理分析
后端
ffutop5 分钟前
gRPC mTLS 问题调试指南
后端
讨厌吃蛋黄酥7 分钟前
利用Mock实现前后端联调的解决方案
前端·javascript·后端
JavaArchJourney7 分钟前
Spring Cloud 微服务架构
后端
苦学编程的谢43 分钟前
SpringBoot统一功能处理
java·spring boot·后端
程序员爱钓鱼1 小时前
Go语言实战案例:使用channel实现生产者消费者模型
后端·go·trae
程序员爱钓鱼1 小时前
Go语言实战案例:使用select监听多个channel
后端·go·trae
SoniaChen331 小时前
Rust基础-part6-数组与切片-字符串
后端·rust·web3