目录
在这里主要讲一下maven-assembly-plugin这个插件
首先说一下为什么用到maven-assembly-plugin这个插件
maven中用来打包的插件:
- maveb-jar-plugin : maven默认打包插件,用来创建project jar
- maven-shade-plugin : 用来打可执行包(executable jar)
- maven-assembly-plugin : 支持定制化打包方式
在这里主要讲一下maven-assembly-plugin这个插件
其实assembly 这个插件的主要作用就是:允许用户将项目输出与它的依赖项、模块、站点文档、脚本和其他文件一起组装成一个可分发的归档文件。也就是可以自己个性化、选择性、结构定制化的打包。
代码:
(这一段是在pom.xml的build标签下)
主要注意的是:指定打包文件src/main/assembly/assembly.xml,在该配置文件内指定打包操作
也打包操作的核心内容 很重要,建议在main方法下建一个文件夹。
<plugin>
<!-- 插件 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<!-- 这个是assembly 所在位置;${basedir}是指项目的的根路径 -->
<descriptor>${basedir}/src/main/assembly/assembly.xml</descriptor>
</descriptors>
<!--打包解压后的目录名-->
<finalName>test</finalName>
<!-- 打包压缩包位置-->
<outputDirectory>${project.build.directory}</outputDirectory>
<appendAssemblyId>false</appendAssemblyId>
</configuration>
<!-- executions: 该插件的某个goal的执行方式。一个executions有如下属性:-->
<!-- id: 唯一标识。-->
<!-- goals:要执行的插件的goal,如run-->
<!-- phase: 插件的goal要嵌入到Maven的phase中执行,如verify-->
<!-- inherited: 该execution是否可被子项目继承-->
<!-- configuration:该execution的其他配置参数-->
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
这里提示一下,在build标签下可以再添加一段如下代码,可以时自定义jar包名字,不用再默认输出一大段jar包名。而在maven-assembly-plugin插件下的finalname标签则是打包解压后的目录名。
<finalName>${project.artifactId}</finalName>
下面说一下配置文件的参数说明
(也就是上述src/main/assembly/assembly.xml的具体配置)
代码:
<assembly>
<!-- 打包文件名的标识符,用来做后缀-->
<id>assembly</id>
<!-- formats是assembly插件支持的打包文件格式,有zip、tar、tar.gz、tar.bz2、jar、war。可以同时定义多个format。-->
<formats>
<format>tar.gz</format>
</formats>
<includeBaseDirectory>true</includeBaseDirectory>
<fileSets>
<!-- 用来设置一组文件在打包时的属性。-->
<fileSet>
<!--lineEnding选项可用于控制给定的行结束文件 -->
<lineEnding>unix</lineEnding>
<!-- 指定文件属性,使用八进制表达,分别为(User)(Group)(Other)所属属性,默认为 0644 -->
<fileMode>0755</fileMode>
<!-- directory:源目录的路径。-->
<directory>${project.basedir}/src/main/resources</directory>
<!-- outputDirectory:生成目录的路径。-->
<outputDirectory>${file.separator}</outputDirectory>
<!-- includes/excludes:设定包含或排除哪些文件,支持通配符-->
<includes>
<include>application*.yml</include>
<include>log*.xml</include>
<include>*.sh</include>
</includes>
</fileSet>
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory>${file.separator}</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
</assembly>
上面一些基础标签已经给定了注释,下面详细解释一下这两个标签
-
<lineEnding>
assembly插件具有lineEnding
选项可用于控制给定的行结束文件。最终可以生成zip存档,与CRLF线和tar 。gz存档与LF线。
此时可能的值包括:
- "keep" - 保留所有行尾
- "unix" - 使用Unix风格行尾 (例如 "n")
- "lf" - 使用单个换行符行尾( (例如"n")
- "dos" - 使用DOS /Windows样式行尾 (例如 "rn")
- "windows" - 使用DOS /Windows样式行尾 (例如 "rn")
- "crlf" - 使用回车,换行行尾 (例如 "rn")
-
<fileMode/>
与UNIX权限类似,设置包含的目录的目录模式。这是一个 OCTAL VALUE。格式:(用户)(组)(其他)[Format: (User)(Group)(Other) ] 其中每个组件是Read = 4,Write = 2和Execute = 1的总和。
例如,值0755转换为用户读写,Group和其他只读。
其默认值是0644.
(在这里说一下这个标签的实际作用,比如我在我的项目下配置一个启动、重启、停止的脚本,一起通过我们这个maven-assembly-plugin插件去一起打包部署到我们的云服务器上,但是这个 <fileMode/>标签的默认值是0644也就是只具有读写权限,没有execute(执行)权限,所以当我们执行脚本是,系统会提示没有权限,还需要使用 chmod +x 命令去给予执行权限。但是此时如果直接在<fileMode/>下设置0755就可以直接执行脚本)
最后注意在使用maven-assembly-plugin插件时还需在build标签下引入如下配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<compilerArgument>-parameters</compilerArgument>
<source>1.8</source>
<target>1.8</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>