我开始与Maven合作但尚未成功用Maven的术语思考。我有一个特定的要求,文档没有给我足够的线索,所以我可以使用一些帮助:
我想创建一个
的程序集构建一个jar-with-dependencies
,就像这个名称的“标准”目标一样,但不包括几个资源。我希望log4j.properties
和其他一些配置文件不在jar中。
在其根目录中构建一个.ZIP
文件,其中包含步骤1中的.jar
以及上述配置文件。
我想从命令行(仅)启动此程序集,因此无需绑定到阶段(或目标?mojo?)。最好使用assembly:assembly
或assembly:single
。
pom.xml
?它位于src/assembly/something.xml
并被descriptorRef
?答案 0 :(得分:27)
我开始和Maven合作,但还没有成功地用Maven的话来思考。
欢迎加入,卡尔! :d
我想从命令行(仅)启动此程序集,因此无需绑定到阶段(或目标?mojo?)。最好使用任何一个组件:组装或组装:单个。
只是为了澄清:build lifecycle本身由phases
(编译,测试,包等)组成,插件目标(技术上是Mojos)受到阶段约束。然后,您可以调用阶段...或仅调用特定的插件目标。
我需要一个自定义程序集描述符吗?
好吧,既然你想要pre-defined descriptors没有涵盖的行为,是的。你甚至需要两个(用于uberjar,一个用于拉链)。
是不是我无法将其嵌套在pom.xml中?所以它在src / assembly / something.xml中,并用descriptorRef?
引用
是的,这是真的(描述符使用自定义格式),它们通常会进入src/main/assembly
。不,descriptorRef
适用于内置描述符,您必须在此使用descriptor
。
我可以将其编码为两个相对简单的程序集,其中一个构建在另一个上(即.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>
这个描述符的作用是(简而言之):
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>
)<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>