我开始使用 Maven,但还没有成功地用 Maven 的方式思考。
欢迎加入,卡尔! :D
我想(仅)从命令行启动该程序集,因此不需要绑定到阶段(或目标?魔力?)。最好使用 assembly: assembly 或 assembly:single。
只是为了澄清:构建生命周期本身是由phases(编译、测试、打包等)和插件目标(技术上是 Mojos)都绑定在阶段上。然后,您可以调用一个阶段...或者只是调用一个特定的插件目标。
为此我需要一个自定义程序集描述符吗?
好吧,既然你想要的行为是预定义描述符不要覆盖,是的。您甚至需要其中两个(一个用于 uberjar,一个用于 zip)。
我真的不能将它嵌套在 pom.xml 中吗?那么它会进入 src/ assembly/something.xml 并通过描述符引用来引用吗?
是的,确实如此(描述符使用自定义格式)并且它们通常进入src/main/assembly
。和不,descriptorRef
对于内置描述符,您必须使用descriptor
here.
我可以将其编码为两个相对简单的程序集,其中一个程序集构建在另一个程序集的基础上(即 .Zip 程序集使用 .Jar 程序集),还是我必须在一个程序集中完成所有操作?
正如所暗示的,您将需要两个程序集描述符。让我帮忙一点...
假设您有以下项目结构:
$ tree .
.
├── pom.xml
└── src
├── main
│ ├── assembly
│ │ ├── jar.xml
│ │ └── zip.xml
│ ├── java
│ │ └── com
│ │ └── stackoverflow
│ │ └── App.java
│ └── resources
│ └── log4j.properties
└── test
└── java
└── com
└── stackoverflow
└── AppTest.java
哪里的pom.xml
包含程序集插件的以下配置:
<project>
...
<dependencies>
...
</dependencies>
...
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-5</version>
<configuration>
<descriptors>
<descriptor>src/main/assembly/jar.xml</descriptor>
<descriptor>src/main/assembly/zip.xml</descriptor>
</descriptors>
</configuration>
</plugin>
</plugins>
</build>
</project>
“过滤后的”uberjar (jar.xml) 的描述符如下所示:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>uberjar</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<unpack>true</unpack>
<scope>runtime</scope>
<useProjectArtifact>false</useProjectArtifact>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<directory>${project.build.outputDirectory}</directory>
<outputDirectory>/</outputDirectory>
<excludes>
<exclude>log4j.properties</exclude>
</excludes>
</fileSet>
</fileSets>
</assembly>
这个描述符的作用是(简而言之):
- 包含依赖项,解压它们,but排除项目本身(是的,这是违反直觉的,但为了向后兼容,保留了这种奇怪的默认行为)
- 包含项目文件但排除其中一些文件。
zip 的描述符 (zip.xml) 如下所示:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>bin</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${project.basedir}/src/main/resources</directory>
<outputDirectory/>
<includes>
<include>log4j.properties</include>
</includes>
</fileSet>
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory/>
<includes>
<include>*-uberjar.jar</include>
</includes>
</fileSet>
</fileSets>
</assembly>
这是(以某种方式)自我解释的:)
- 它包括配置文件(相对于
<directory>
) 在程序集的根部
- 它包括 uberjar(相对于
<directory>
) 在程序集的根部
最后,只需运行mvn assembly:assembly
(这是打算在 CLI 上使用的目标)。
我没有(故意)在 uberjar 的程序集中包含 META-INF/maven/** 。有没有一种简单的方法可以防止包含这些内容?
这些来自解压后的库。您可以使用排除它们unpackOptions。这是一个修改版本jar.xml
:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>uberjar</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<unpack>true</unpack>
<scope>runtime</scope>
<unpackOptions>
<excludes>
<exclude>META-INF/maven/**</exclude>
</excludes>
</unpackOptions>
<useProjectArtifact>false</useProjectArtifact>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<directory>${project.build.outputDirectory}</directory>
<outputDirectory>/</outputDirectory>
<excludes>
<exclude>log4j.properties</exclude>
</excludes>
</fileSet>
</fileSets>
</assembly>