定制maven组装

时间:2010-08-16 13:07:01

标签: maven-2 maven-assembly-plugin

我开始与Maven合作但尚未成功用Maven的术语思考。我有一个特定的要求,文档没有给我足够的线索,所以我可以使用一些帮助:

我想创建一个

的程序集
  1. 构建一个jar-with-dependencies,就像这个名称的“标准”目标一样,但不包括几个资源。我希望log4j.properties和其他一些配置文件在jar中。

  2. 在其根目录中构建一个.ZIP文件,其中包含步骤1中的.jar以及上述配置文件。

  3. 我想从命令行(仅)启动此程序集,因此无需绑定到阶段(或目标?mojo?)。最好使用assembly:assemblyassembly:single

    • 我需要一个自定义程序集描述符吗?
    • 是不是我无法将其嵌套在pom.xml?它位于src/assembly/something.xml并被descriptorRef
    • 引用
    • 我可以将其编码为两个相对简单的程序集,其中一个构建在另一个上(即.Zip程序集使用.Jar程序集)或者我是否必须在一个程序集中执行所有操作?

1 个答案:

答案 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>
  • 它包括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>