💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # 常用 ~~~ <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>3.1.0</version> <configuration> <archive> <manifest> <main>com.jdxia.EurekaServer</main> </manifest> </archive> <descriptorRefs> <!-- 会将所有依赖都解压打包到生成物中--> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <!--false,mvn deploy不会把assembly打的zip包上传到nexus--> <attach>false</attach> </configuration> <executions> <execution> <id>make-assembly</id> <!--名字任意 --> <phase>package</phase> <!-- 绑定到package生命周期阶段上 --> <goals> <goal>single</goal> <!-- 只运行一次 --> </goals> </execution> </executions> </plugin> ~~~ # 简介 简单的说,maven-assembly-plugin 就是用来帮助打包用的,比如说打出一个什么类型的包,包里包括哪些内容等等。 默认情况下,打jar包时,只有在类路径上的文件资源会被打包到jar中,并且文件名是`${artifactId}-${version}.jar`,**下面看看怎么用maven-assembly-plugin插件来定制化打包**。 首先需要添加插件声明: ~~~ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <id>${project.version}</id><!--名字任意 --> <phase>package</phase> <!-- 绑定到package生命周期阶段上 --> <goals> <goal>single</goal> <!-- 只运行一次 --> </goals> <configuration> <!-- 打包文件名字不包含 assembly.xml 中 id --> <appendAssemblyId>false</appendAssemblyId> <descriptors> <!--描述文件路径--> <descriptor>src/main/assembly/dist.xml</descriptor> </descriptors> <!--这样配置后,mvn deploy不会把assembly打的zip包上传到nexus--> <attach>false</attach> </configuration> </execution> </executions> </plugin> ~~~ dist.xml文件描述: ~~~ <?xml version="1.0" encoding="UTF-8"?> <assembly> <!-- 不配置会报错:Assembly ID must be present and non-empty --> <id>dist</id> <formats> <!--压缩文件的类型--> <format>tar.gz</format> </formats> <!--指明打包后是否有分发包的最外层,如果不写,默认是true--> <includeBaseDirectory>true</includeBaseDirectory> <fileSets> <!--需要包含的文件与输出的路径--> <fileSet> <!--指明要对src/main/assembly/bin文件夹操作--> <directory>src/main/assembly/bin</directory> <!--指明经过assembly插件打包后bin目录会放置在项目根目录下--> <outputDirectory>bin</outputDirectory> <!--指明bin目录下所有文件的权限为755--> <fileMode>0755</fileMode> </fileSet> <fileSet> <directory>src/main/assembly/conf</directory> <outputDirectory>conf</outputDirectory> <fileMode>0644</fileMode> </fileSet> <fileSet> <directory>target</directory> <outputDirectory>lib</outputDirectory> <!--指明经过assembly插件打包后lib目录会包含哪些jar包--> <includes> <include>*.jar</include> </includes> </fileSet> <fileSet> <directory>src/main/resources</directory> <outputDirectory>logs</outputDirectory> <fileMode>0755</fileMode> <!--指明经过assembly插件打包后logs过滤掉哪些文件--> <excludes> <!-- **/* 代表是任意路径下任务文件--> <exclude>**/*</exclude> </excludes> </fileSet> </fileSets> </assembly> ~~~ # maven打包 ~~~ -DskipTests和-Dmaven.test.skip=true的区别是 -DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下。 -Dmaven.test.skip=true,不执行测试用例,也不编译测试用例类。 ~~~ # Assembly Descriptor 要使用maven-assembly-plugin,需要指定至少一个要使用的assembly descriptor 文件。默认情况下,maven-assembly-plugin内置了几个可以用的assembly descriptor: * bin : 类似于默认打包,会将bin目录下的文件打到包中; * jar-with-dependencies : 会将所有依赖都解压打包到生成物中; * src :只将源码目录下的文件打包; * project : 将整个project资源打包。 自己定义的话 这个定义很简单: * format:指定打包类型; * includeBaseDirectory:指定是否包含打包层目录(比如finalName是output,当值为true,所有文件被放在output目录下,否则直接放在包的根目录下); * fileSets:指定要包含的文件集,可以定义多个fileSet; * directory:指定要包含的目录; * outputDirectory:指定当前要包含的目录的目的地。 # 添加文件 上面演示了添加所有编译后的资源,同样的可以增加其他资源,例如想添加当前工程目录下的某个文件 b.txt ,在assembly descriptor的assembly结点下增加 ~~~ <files> <file> <source>b.txt</source> <outputDirectory>/</outputDirectory> </file> </files> ~~~ > 这里用到了 files 元素类型,可以想象 fileSets 下的结点都是针对文件夹的;files 下的结点都是针对文件的。 # 排除文件 在 fileSet 里可以使用 includes 和 excludes 来更精确的控制哪些文件要添加,哪些文件要排除。 例如要排除某个目录下所有的txt文件: ~~~ <fileSet> <directory>${project.build.directory}/classes</directory> <outputDirectory>/</outputDirectory> <excludes> <exclude>**/*.txt</exclude> </excludes> </fileSet> ~~~ 或者某个目录下只想 .class 文件 ~~~ <fileSet> <directory>${project.build.directory}/classes</directory> <outputDirectory>/</outputDirectory> <includes> <include>**/*.class</include> </includes> </fileSet> ~~~ # 添加依赖 如果想把一些依赖库打到包里,可以用 dependencySets 元素,例如最简单的,把当前工程的所有依赖都添加到包里: ~~~ <dependencySets> <dependencySet> <outputDirectory>/</outputDirectory> </dependencySet> </dependencySets> ~~~ 在assembly下添加以上配置,则当前工程的依赖和工程本身生成的jar都会被打包进来。 如果要排除工程自身生成的jar,则可以添加 ~~~ <useProjectArtifact>false</useProjectArtifact> ~~~