Maven插件之assembly

标签: 无 分类: 未分类 创建时间:2022-07-19 07:35:01 更新时间:2025-09-26 04:44:39

这篇文章没有什么价值,操作起来一点都不流畅,不建议参考。
我先说一下我的整个的工程的架构,我使用了若依的开发框架,父工程包括了ruoyi-auth、ruoyi-common、ruoyi-gateway、ruoyi-modules等模块,在ruoyi-modules模块下,又包含了子模块:ruoyi-file、ruoyi-gen、ruoyi-system等模块,以及我新建的ph-job模块。在ph-job模块中,我引入了ruoyi-common模块下的ruoyi-common-core模块,同时因为ph-job模块包括了不同的开发环境,需要为每一个开发环境进行打包部署。这个时候,如果我从工程的根目录下直接进行打包,可以打包,但是我就没有办法指定ph-job的打包环境了,如果我直接在ph-job模块下进行打包,mvn clean pacage,就会出现ruoyi-common-core不满足的问题,无法进行打包。这里我可能遇到了一个误区,就是到底能不能用assembly对不同的微服务进行打包呢?我看到的很多的文章,其实是把多个相互依赖的模块打包成一个工程,只有一个启动类的情况下,但是我的微服务是多个启动类啊。

【解决】
为了解决上面提到的问题,需要如下操作:

1
2
3
4
5
6
7
8
## 1.在工程根目录下执行安装命令,将全部的模块安装到本地仓库中
mvn install

## 2.进入子模块目录
cd ruoyi-modules/ph-job

## 3.执行子模块的打包
mvn clean package

只需要先把依赖安装到本地,然后再在子模块中进行打包就可以了,这样就不会找不到模块了,我折腾了很久,还用了assembly,发现根本用不上,所以文章的下面很长的一段都没有用了,不做参考也罢。

参考文章:
1.maven的install的作用
2.maven父子项目使用assembly插件打包 注意如果前面有依赖包是本地jar包,这里打包时就遇到问题了,本地jar包scope是system,但assembly打包默认是把scope为runtime的jar包打进zip中,所以不能将本地jar包压进zip,网上给的建议都是把本地的jar包安装到本地maven库,最终我也妥协了。
3.SpringBoot+Maven多模块项目(创建、依赖、打包可执行jar包部署测试)完整流程 这里有父子工程关系和测试代码
4.Maven:两个命令clean 和 install clean :清除由项目编译创建的target,install:安装jar包到本地仓库。
5.mvn install之后如何从本地maven仓库中删除jar文件 mvn dependency:purge-local-repository -DmanualInclude=”groupId:artifactId, …”
6.Maven安装/卸载本地jar 使用上面的命令后,再阻止Maven对已删除的jar进行reResolve,mvn dependency:purge-local-repository -DreResolve=false

前言

自定义打包方式,这里主要介绍的是多模块的方式,使用的工程就是 若依项目,一个后台管理系统的开发脚手架,可以下下来进行参考。

参考文章:
1.使用Maven assembly打多个自定义包及War包简介
2.maven 根据环境打包不同配置文件
3.利用assembly插件分环境打包配置文件
4.使用Maven的assembly插件实现自定义打包
5.springboot maven多环境打包配置
6.maven-assembly-plugin 打包的配置 1.maven-jar-plugin:maven 默认打包插件,用来创建 project jar。2.maven-shade-plugin:用来打可执行包,executable(fat) jar。3.maven-assembly-plugin:支持定制化打包方式,例如 apache 项目的打包方式。

1.新建assembly模块

在项目中,新建assembly模块,这个模块主要用来进行打包,不包括任何的代码。在父pom.xml中,assembly模块放在所有模块的最后面。

1
2
3
4
5
6
7
8
9
<modules>
<module>ruoyi-auth</module>
<module>ruoyi-gateway</module>
<module>ruoyi-visual</module>
<module>ruoyi-modules</module>
<module>ruoyi-api</module>
<!--打包模块排在最后-->
<module>assembly</module>
</modules>

参考文章:
1.Maven打包方式(多模块) 这里虽然也是一个多模块的,即便是照着做,都不一定能成功,就是有些说不明白的地方,不知道为什么,比如编写完配置之后,如何进行打包,是不是和 mvn package 有什么区别?
2.还在打jar包?maven-assembly了解一下?
3.使用maven-assembly-plugin打包多模块项目 这篇文章也是,写了一半,

2.添加assembly依赖

修改父pom.xml的build.pluginManagement节点,添加plugins支持,我这里定义了 maven-assembly-plugin.version 版本为 3.4.1。

1
2
3
4
5
6
7
8
9
10
11
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>${maven-assembly-plugin.version}</version>
<configuration>
<finalName>ph-cloud</finalName>
<descriptors>
<descriptor>assembly/assembly.xml</descriptor>
</descriptors>
<appendAssemblyId>true</appendAssemblyId>
</configuration>
</plugin>

参考文章:
1.Maven中plugins和pluginManagement的区别

3.编写assembly模块文件目录

在assembly模块下,根据需要新建 bin、config、docs、lib、logs 等目录。

4.修改 assembly 模块的 pom.xml 文件

修改 assembly 模块的 pom.xml 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ruoyi</artifactId>
<groupId>com.ruoyi</groupId>
<version>3.5.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>assembly</artifactId>

<properties>
<assembly.format>tgz</assembly.format>
<skipDeploy>true</skipDeploy>
</properties>

<dependencies>
<dependency>引入各个子模块模块的依赖</dependency>
</dependencies>

<build>
<plugins>

<plugin>
<!-- 配置assembly插件 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>${maven-assembly-plugin.version}</version>
<configuration>
<finalName>${assembly.name}</finalName>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<!-- 配置打包方式assembly.xml文件路径 -->
<descriptor>assembly.xml</descriptor>
</descriptors>
<!-- 打成的包输出目录 -->
<outputDirectory>${project.parent.basedir}/dist</outputDirectory>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<!-- 只执行一次 -->
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>

</plugins>
</build>

</project>

4.编写assembly.xml文件

编写 assembly 模块下的 assembly.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<assembly>
<id>bin</id>
<!--最终打包成一个用于发布的zip文件-->
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>true</includeBaseDirectory>

<fileSets>
<!--打包可执行jar到lib目录-->
<fileSet>
<directory>target</directory>
<outputDirectory>lib</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
<!--执行脚本-->
<fileSet>
<directory>${project.parent.basedir}/assembly/bin</directory>
<outputDirectory>bin</outputDirectory>
<includes>
<include>*.sh</include>
</includes>
</fileSet>
<!--logs-->
<fileSet>
<directory>${project.parent.basedir}/assembly/logs</directory>
<outputDirectory>logs</outputDirectory>
</fileSet>
</fileSets>

<dependencySets>
<dependencySet>
<unpack>false</unpack>
<useProjectArtifact>true</useProjectArtifact>
<outputDirectory>lib</outputDirectory>
<scope>provided</scope>
</dependencySet>
<dependencySet>
<unpack>false</unpack>
<useProjectArtifact>true</useProjectArtifact>
<outputDirectory>lib</outputDirectory>
<scope>system</scope>
</dependencySet>
<dependencySet>
<unpack>false</unpack>
<useProjectArtifact>true</useProjectArtifact>
<outputDirectory>lib</outputDirectory>
<scope>runtime</scope>
</dependencySet>
</dependencySets>

</assembly>

参考文章:
1.maven-assembly-plugin 插件多模块打包实例 这里虽然强调了打包成功了,但是我还是有些疑问的,为什么要新建一个模块呢?

5.执行打包

编辑完成相关配置之后,执行打包命令:

1
mvn package assembly:single  

参考文章:
1.Maven打包三种方法和常用命令大全 这里写了两种执行打包命令的配置方式,一种是直接使用: mvn package,一种是 携带了 mvn package assembly。适合单模块的形式。
2.maven assembly plugin使用

问题

(1) on project ruoyi: Error reading assemblies: No assembly descriptors found.
这是我遇到的第一个问题,提示找不到assembly描述,这个需要在父模块的pom.xml文件中添加assembly.xml中的build节点的resource配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>${maven-assembly-plugin.version}</version>
<configuration>
<finalName>ph-cloud</finalName>
<descriptors>
<descriptor>assembly/assembly/assembly.xml</descriptor>
</descriptors>
<appendAssemblyId>true</appendAssemblyId>
</configuration>
</plugin>
</plugins>

这一点让我有些疑惑了,已经新建了一个模块叫assembly模块,也在里面写了pom.xml,那么在父模块的pom.xml也还要配置一遍 maven-assembly-plugin 这个插件的意义是什么呢?那么干脆直接在父模块中配置就好了,干嘛还要新建一个子模块叫 assembly 呢?

参考文章:
1.mvn assembly:single打包报错:Error reading assemblies: No assembly descriptors found. 我明明在模块的pom.xml中配置了configuration,结果还是找不到这个文件


(2) com.ruoyi:ruoyi-gateway:jar:3.5.0 (included by module) does not have an artifact with a file. Please ensure the package phase is run before the assembly is generated.
这个问题就是我配置了 moduleSets 之后出现的问题,我本意是想着能把依赖进行打包,看来似乎不是这么用的。

参考文章:
1.Maven Assembly plugin -Multi module project- source and javadoc not getting added to zip file
2.Maven assembly plugin complains about no files whatever I do
3.Maven Assembly 配置详细解释


(3) No plugin found for prefix ‘assemble’ in the current project and in the plugin groups
这个问题,主要是我在某一个模块中,单独进行了 assembly 配置,然后执行打包的时候,出现的问题。

【解决】
这个问题似乎是因为我写错了执行命令

1
2
3
4
5
6
## 错误
mvn clean package assemble:single


## 正确
mvn clean package assembly:single

参考文章:
1.[maven出现No plugin found for prefix ‘help’ in the current project and in the plugin groups org.ap… 增加了镜像

(4)

参考文章:
1.2021-01-21 maven依赖的项目报错Could not resolve dependencies for project 执行install,将上一步执行成功的jar文件安装到responsitory

6.其他配置

参考文章:
1.maven-assembly-plugin 打包的配置
2.Maven 单独构建多模块项目中的子模块 如果需要部署某个子模块 , 单独构建则会报错 , 如果构建整个项目 , 又会非常耗时
3.Maven单独构建多模块项目中的单个模块

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件(ititchuan@gmail.com)通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
ititchuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。