自定义 Maven 组件

2023-11-22

我开始使用 Maven,但还没有成功地用 Maven 的方式思考。我有一个具体的要求,但文档没有给我足够的线索,所以我可以使用一些帮助:

我想创建一个程序集

  1. 建立一个jar-with-dependencies类似于此名称的“标准”目标,但不包括一些资源。我想log4j.properties和其他几个配置文件not在罐子里。

  2. 建立一个.ZIP文件在其根目录中包含.jar从步骤 1 以及上面提到的配置文件。

我想(仅)从命令行启动该程序集,因此不需要绑定到阶段(或目标?魔力?)。最好使用assembly:assembly or assembly:single.

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

我开始使用 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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义 Maven 组件 的相关文章

随机推荐