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. 编译配置

<!--小游戏 地心侠士 -->
<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配置

<!--小游戏 地心侠士 -->
<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

<!--小游戏 地心侠士 公众号:小满小慢 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. 项目整体打包配置

<!--小游戏 地心侠士 公众号:小满小慢 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文件内容如下

<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文件,项目打包的源文件配置如下:

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

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

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

MAVEN构建分离依赖JAR的更多相关文章

  1. eclipse导入maven项目后依赖jar包更新问题->update project按钮

    eclipse导入maven项目后依赖jar包更新问题 1.eclipse有专门的导入maven项目按钮,file-import-maven project,eclipse会自动查找指定路径下的pom ...

  2. Maven下载项目依赖jar包和使用方法

    一.Maven3.5.0安装与配置+Eclipse应用 参考:Maven3.5.0安装与配置+Eclipse应用 二.http://mvnrepository.com/ 此处以http://mvnre ...

  3. Spring Boot 打包分离依赖 JAR 和配置文件

    <properties> <java.version>1.8</java.version> <project.build.sourceEncoding> ...

  4. Dubbo入门到精通学习笔记(二):Dubbo管理控制台、使用Maven构建Dubbo的jar包、在Linux上部署Dubbo privider服务(shell脚本)、部署consumer服务

    文章目录 Dubbo管理控制台 1.Dubbo管理控制台的主要作用: 2.管理控制台主要包含: 3.管理控制台版本: 安装 Dubbo 管理控制台 使用Maven构建Dubbo服务的可执行jar包 D ...

  5. 什么是Maven? 使用Apache Maven构建和依赖项管理

    通过优锐课java架构学习中,学到了不少干货,整理分享给大家学习. 开始使用最流行的Java构建和依赖管理工具Maven Apache Maven是Java开发的基石,也是Java使用最广泛的构建管理 ...

  6. Maven 配置本地依赖jar

    现有json-1.0.jar,引入依赖方法如下: 1.  在项目下新建 lib 目录,复制json-1.0.jar到lib目录下 pom.xml中添加配置 <dependency> < ...

  7. maven无法下载依赖jar包—几种仓库的区别

    一.问题背景 最近这两天,感觉自己智商急剧退化,到了自己都捉急的地步,呃,有必要记录下来,以后智商被人甩几条街的时候,看看这篇文字,找找灵感也是好的! 这个项目呢,是用IDEA开发的,我一切都弄好了, ...

  8. Maven手动增加依赖jar到本地Maven仓库中

    Apache Maven是一个项目管理及自动构建工具,有APache软件基金会提供.我们只要配置成功后就可以通过配置pom.xml添加所需依赖的jar包和类库,因为这些类库已经在我们配置的Maven仓 ...

  9. maven实战(4)-- maven构建自己的jar到本地仓库中

    在平时的开发中,经常需要用到自己以前开发的一个jar包,那么如何使用将自己开发的jar提交到本地仓库中,供其他的项目依赖呢?主要有三种方法: (1)使用mvn的构建命令:mvn clean insta ...

  10. spring maven项目解决依赖jar包版本冲突方案

    引入:http://blog.csdn.net/sanzhongguren/article/details/71191290 在spring reference中提到一个解决spring jar包之间 ...

随机推荐

  1. sql注入过程中字符的过滤

    1.过滤注释符过滤 常用的注释符号: --+ # %23 找到闭合方式,语句后对给一个闭合符,和源语句形成闭合. 2.and 和 or 的绕过: 大小写绕过:anD 复写绕过:anandd 符号代替: ...

  2. gitlabci之gitlab runner部署配置

    gitlab runner部署 部署方案可以采用gitlab runner operator部署,也可以直接使用gitlab helm charts部署. runner配置说明 对于k8s gitla ...

  3. Go语言new和make的区别

    一.简单说明 方法 作用 作用对象 返回值 new 分配内存 值类型和用户定义的类型 初始化为零值,返回指针 make 分配内存 内置引用类型(map,slice,channel) 初始化为零值,返回 ...

  4. 阿里微服务解决方案-Alibaba Cloud之服务提供方搭建(二)

    一.新建服务提供方模块 1.1 右键父工程 New-> Module 1.2 选择 Maven项目,然后 Next 1.3 指定父工程,并且子模块以端口号结尾,方便调试 1.4 因为父工程已经添 ...

  5. 用<marquee>实现图片上下滚动

    首先让我们认识这个<marquee>标签,它是成对出现的标签,首标签<marquee>和尾标签</marquee>之间的内容就是滚动内容.<marquee&g ...

  6. MeterSphere V2.x 添加数据库驱动

    MeterSphere V2.x 添加数据库驱动 背景 在使用 MeterSphere 进行接口测试时,会遇到一些接口场景,需要先查询数据库获取特定数据,再将查询结果作为请求参数传递给后续接口.然而, ...

  7. Codeforces Round #673 (Div. 2) ABC 题解

    A. Copy-paste 题意:问在保持每个数都小于等于k的情况下,最多能执行多少步a[j] += a[i] ,其中(i,j)为任意不同下标. 思路:水题,排个序,用a[1]去加到别的值上,看每个数 ...

  8. 批量生成测试数据,再次迎来升级,支持API调用,开发者的好帮手

    前端时间发表一篇文章介绍了FabricateData的在线批量生成测试数据的能力,这几天在看,平台不仅添加了本地数据源的概念,还增设了本地API的能力. FabricateData 网站地址:http ...

  9. 结构体 和 union 大小 小结

    这是因为字节对齐原则,在Linux下其是按2字节对齐,可是在VC++下默认是按8字节对齐,必须满足4的整数倍.这样有助于存储效率.第一个char 为1字节,int为4字节,由于8字节对齐原则系统会预留 ...

  10. 1009acm

    这道题有点小疑问 为什么我用sum_JavaBean+=(double)m / all_evel[j].b*all_evel[j].a;可以达到AC 用sum_JavaBean+=(double)al ...