Maven插件之assembly

标签: 无 分类: 未分类 创建时间:2022-07-19 07:35:01 更新时间:2024-11-23 02:04:25

这篇文章没有什么价值,操作起来一点都不流畅,不建议参考。
我先说一下我的整个的工程的架构,我使用了若依的开发框架,父工程包括了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>

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 之后出现的问题,我本意是想着能把依赖进行打包,看来似乎不是这么用的。


(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单独构建多模块项目中的单个模块
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 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.
幸福是年华的沉淀,微笑是寂寞的悲伤。