maven打包springboot项目的插件配置概览
jar包的术语背景:
- normal jar: 普通的jar,用于项目依赖引入,不能通过java -jar xx.jar执行,一般不包含其它依赖的jar包。
- fat jar: 也叫做uber jar,是一种可执行的jar(executable jar),既包含自己代码中的class ,也包含第三方依赖的jar。
- 不可执行,但包含第三方依赖的jar包,避免生成的jar与第三方引入后出现依赖版本冲突。
POM文件中的内置属性(Maven预定义可以直接使用):
${basedir} 项目根目录
${version} 表示项目版本;
${project.basedir} 同${basedir};
${project.version} 表示项目版本,与${version}相同;
${project.build.directory} 构建目录,缺省为target;
${project.build.sourceEncoding} 表示主源码的编码格式;
${project.build.sourceDirectory} 表示主源码路径;
${project.build.finalName} 表示输出文件名称;
${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes
1. 第一类需求: 生成单个fat jar
使用springboot提供的maven打包插件spring-boot-maven-plugin即可,方便快捷,pom文件的配置如下:
<!-- 测试本地jar包引入和打包 -->
<!-- 项目管理的角度,尽量不使用本地jar包,搭建maven私服可以统一更新管理自研jar包 -->
<dependency>
<groupId>cn.henry.test</groupId>
<artifactId>local_test</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/local_lib/local_test.jar</systemPath>
</dependency>
<build>
<plugins>
<!-- 常规打包,flat jar,打出来的jar很大,不易于修改部分文件后增量发布 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!-- 作用:项目打成jar的同时将本地jar包也引入进去 -->
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
</plugins>
</build>
2. 第二类需求: 启动项和依赖包分离的fat jar
项目文件和依赖的jar包分离,因为引用的jar变动较少,项目发布时只需替换项目jar包或class即可,使用常规maven打包插件, maven-jar-plugin, maven-dependency-plugin,输出为可执行的jar和lib包,pom文件的配置如下:
<!-- 测试本地jar包引入和打包 -->
<!-- 项目管理的角度,尽量不使用本地jar包,搭建maven私服可以统一更新管理自研jar包 -->
<dependency>
<groupId>cn.henry.test</groupId>
<artifactId>local_test</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/local_lib/local_test.jar</systemPath>
</dependency>
<build>
<!-- 配置文件,依赖jar和可执行jar分离的包,便于文件替换发布 -->
<plugins>
<!-- 复制依赖的jar包到指定的文件夹里,相当于:mvn dependency:copy-dependencies -DoutputDirectory=lib -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<!-- 配置依赖和启动类-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<!-- MANIFEST.MF 中 Class-Path 加入前缀 -->
<classpathPrefix>lib/</classpathPrefix>
<!--指定入口类 -->
<mainClass>cn.henry.study.FileMessageServer</mainClass>
</manifest>
<manifestEntries>
<!-- 在Class-Path下添加配置文件的路径,本地jar的引入方式: dependency中的artifactid-version.jar -->
<Class-Path>lib/local_test-1.0.0.jar</Class-Path>
<!--这里表示jar路径加入到MANIFEST.MF-->
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>
3. 第三类需求: 提供给第三方使用的,包含所有依赖的普通jar
解决项目jar中依赖与引用方jar包版本冲突的问题,提高jar包的易用性和独立性,缺点是打出来的包较大,jar包内置依赖不透明。 使用maven打包插件maven-shade-plugin,pom文件的配置如下:
在cmd中切换到local_test.jar包所在的目录,执行
mvn install:install-file "-DgroupId=cn.henry.frame" "-DartifactId=local_test" "-Dversion=1.0.0" "-Dpackaging=jar" "-Dfile=local_test.jar"
其中:
-DgroupId 为maven依赖的groupId
-DartifactId 为maven依赖的artifactId
-Dversion 为maven依赖的version
-Dfile 为local_test.jar包的文件名 引入安装后的local_test.jar包,maven依赖如下:
<!-- 项目管理的角度,尽量不使用本地jar包,搭建maven私服可以统一更新管理自研jar包 -->
<dependency>
<groupId>cn.henry.frame</groupId>
<artifactId>local_test</artifactId>
<version>1.0.0</version>
</dependency> <build>
<plugins>
<!-- 提供给第三方使用的,包含所有依赖的普通jar -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<!-- 加入启动类 -->
<!--<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>xxx.xxx</mainClass>
</transformer>
</transformers>-->
<createDependencyReducedPom>false</createDependencyReducedPom>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
4. 第四类需求: 提供给第三方使用的,仅包含项目代码的普通jar
通用模式,如果项目中有使用到第三方依赖,需要提供说明,否则会直接报class not found exception。 使用maven打包插件maven-jar-plugin,pom文件的配置如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
</plugin>
注意打包插件的版本选择,尽量使用高版本,官方可能修复了已存在的问题,按项目的需求选取打包方式。
maven的打包插件官网: http://maven.apache.org/plugins
用maven查看jar依赖:mvn dependency:tree
插件打包的原理:读取xml配置,组装成规范的jar文件
jar规范可以阅读oracle的官方文档:https://docs.oracle.com/javase/8/docs/technotes/guides/jar/jar.html
重点关注的部分: JAR文件格式中META-INF目录下的MANIFEST.MF文件,用于定义扩展和包相关的数据。主属性: Manifest-Version(MF文件版本号), Main-Class(包含main方法的类), Class-Path(执行这个jar包时的ClassPath,第三方依赖)
Manifest-Version: 1.0
Main-Class: test.Main
Class-Path: ./ ./lib/commons-collections-3.2.jar ./lib/commons-lang-2.3.jar ./lib/commons-logging-1.1.jar
打包的一般做法是扫描项目所依赖的包,按照规范拼接Class-Path的value值,写入MF文件。但这种做法不够灵活,框架通常会从MF文件获取自定义信息,使用classloader动态加载依赖的jar包,并控制文件的合并,过滤等规则。
maven打包springboot项目的插件配置概览的更多相关文章
- 【Docker】Maven打包SpringBoot项目成Docker镜像并上传到Harbor仓库(Eclipse、STS、IDEA、Maven通用)
写在前面 最近,在研究如何使用Maven将SpringBoot项目打包成Docker镜像并发布到Harbor仓库,网上翻阅了很多博客和资料,发现大部分都是在复制粘贴别人的东西,没有经过实践的检验,根本 ...
- Jenkins 集成Maven打包SpringBoot项目并自动部署到Tomcat服务器
提前条件: 1.在Jenkins服务器上安装Git.JDK和Maven 2.准备另一台服务器并安装Tomcat 3.Gitlab服务器 4.Gitlab仓库中上传SpringBoot项目代码 第一步, ...
- 使用maven 打包springboot项目步骤以及所遇到的问题
1.首先必须确保java和maven是安装好的,并且环境变量配置正确 2.接着可以看一下我们项目中的pom.xml中的以下配置 packaging那里很关键,表示我们打包项目的类型,可以为jar 也可 ...
- 利用Jenkins实现jdk11+Maven构建springboot项目
目录 原理图 前期准备 Jdk11安装 Jenkins安装 Maven安装 Jenkins的设置 插件安装 变量配置 搭建项目 1.通用配置 2.源码管理 3.构建触发 4.Maven的构建选项 5. ...
- 关于gradle与maven对springboot项目的配置文件加载异同
先说下缘由吧,由于年后跳槽换了家公司,构建项目工具也有maven改成gradle了,所以在搭建框架进行开发打包过程中难免会遇到一些意想不到的问题. 本文简述下打包扫描加载配置文件的异同吧. maven ...
- gradle 打包springboot项目,找不到项目jar application.class
如题:gradle 打包springboot项目,找不到项目jar入口main方法:application.class 检查:lib/目录下没有相应项目的jar包 用gradle命令行查看日志:gra ...
- SpringBoot01 InteliJ IDEA安装、Maven配置、创建SpringBoot项目、属性配置、多环境配置
1 InteliJ IDEA 安装 下载地址:点击前往 注意:需要下载专业版本的,注册码在网上随便搜一个就行啦 2 MAVEN工具的安装 2.1 获取安装包 下载地址:点击前往 2.2 安装过程 到官 ...
- eclipse+maven搭建springboot项目入门
一.下载jdk,例如(jdk1.8.171) 安装(注意仅仅安装jdk就可以了,不要安装jre,设置JAVA_HOME,配置jdk环境变量) 二.下载maven(apache-maven-3.5.3- ...
- IDEA中创建父子工程与maven打包Springboot聚合工程报错程序包不存在问题处理
公司新项目需使用java技术栈,便使用IDEA搭建了一个多SpringBoot项目的聚合工程,因为初次使用,遇到了很多问题,maven打包时各种报错,在网上查了好多终于解决了,为巩固记忆,特作此记录. ...
随机推荐
- 使用Linux系统,是一种什么体验?
导读 同事,从事嵌入式软件开发多年,主要开发环境用的就是linux,最疯狂的一段时间直接把系统装成linux系统,然后在linux下面虚拟一个windows操作系统,主要有些事情必须在windows才 ...
- python脚本文件引用
二.Python __init__.py 作用详解 https://www.cnblogs.com/Lands-ljk/p/5880483.html __init__.py 文件的作用是将文件夹变为一 ...
- tableau中图形分析相关设置
1.柱形堆叠图单元格顶部显示总计值(可通过参考线实现) 2.调节图形单元格的宽窄度 (ctrl + 右键/左键) 3.折线图预测区间 趋势区间线 分析中预测并不是针对所有的日期格式均其作用,比如日期格 ...
- oracle数据库常用操作语句 、创建视图
新增字段:alter table 表名 add (NAME VARCHAR(12), NAME NUMBER(10) );--如果添加单个字段可以不用括号包起来,例如 alter table cust ...
- BZOJ 3876 [Ahoi2014&Jsoi2014]支线剧情
题解: 带下界的费用流 对于x->y边权为z Addedge(x,t,1,0) Addedge(s,y,1,z) Addedge(x,y,inf,0) 然后对每个点Addedge(i,1,inf ...
- Floyd--P1119 灾后重建
题目背景 B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公路才能 ...
- spring boot2 运行环境
1.springboot个版本系统需求 spring boot maven jdk 内置tomcat 内置jetty servlet 2.0.x 3.2+ 8或9 8.5(3.1) 9.4(3.1) ...
- jQuery选择器全解析
1. 基本选择器 1.1 id选择器:$(#id) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...
- UVA - 10285 Longest Run on a Snowboard(最长的滑雪路径)(dp---记忆化搜索)
题意:在一个R*C(R, C<=100)的整数矩阵上找一条高度严格递减的最长路.起点任意,但每次只能沿着上下左右4个方向之一走一格,并且不能走出矩阵外.矩阵中的数均为0~100. 分析:dp[x ...
- ORACLE自增函数,一般函数
1.UNIX时间与普通时间互相转换 1.ORACLE先创建函数方法,再直接使用,MySQL直接使用方法UNIX_TIMESTAMP,FROM_UNIXTIME oracle_to_unix(creat ...