9

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

我想创建一个程序集

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

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

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

  • 我需要一个自定义程序集描述符吗?
  • 我不能将它嵌套在 中是真的pom.xml吗?所以它进入src/assembly/something.xml并被引用descriptorRef
  • 我可以将它编码为两个相对简单的程序集,其中一个构建在另一个上(即 .Zip 程序集使用 .Jar 程序集)还是我必须在一个程序集中完成所有事情?
4

1 回答 1

28

我开始使用 Maven,但还没有成功地用 Maven 的术语进行思考。

欢迎加入,卡尔!:D

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

澄清一下:构建生命周期本身是由phases(编译、测试、打包等)组成的,插件目标(技术上是 Mojos)绑定在阶段上。然后,您可以调用一个阶段......或者只是一个特定的插件目标。

我需要一个自定义程序集描述符吗?

好吧,既然您想要预定义的描述符不涵盖的行为,是的。您甚至需要其中两个(用于 uberjar,一个用于 zip)。

我真的不能将它嵌套在 pom.xml 中吗?所以它进入 src/assembly/something.xml 并被一个descriptorRef引用?

是的,这是真的(描述符使用自定义格式),它们通常进入src/main/assembly. 不,descriptorRef是内置描述符,你必须在descriptor这里使用。

我可以将它编码为两个相对简单的程序集,其中一个构建在另一个上(即 .Zip 程序集使用 .Jar 程序集)还是我必须在一个程序集中完成所有事情?

正如所暗示的,您将需要两个程序集描述符。让我帮一点忙……

假设您有以下项目结构:

$树。
.
├── pom.xml
└── 源
    ├── 主要
    │ ├── 组装
    │ │ ├── jar.xml
    │ │ └── zip.xml
    │ ├── java
    │ │ └── com
    │ │ └── stackoverflow
    │ │ └── App.java
    │ └── 资源
    │ └── log4j.properties
    └── 测试
        └── java
            └── com
                └── 堆栈溢出
                    └── 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>它在程序集的根目录中包含 uberjar(相对于)

最后,只需运行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>
于 2010-08-16T16:29:51.080 回答