8

我目前正在为 Maven 苦苦挣扎:我有一个由几个嵌套模块组成的复杂项目,对于其中一些模块,我在 POM 中有类似的配置。

我想让它干净。实际上,我想定义一个“runnable-jar”通用配置并在某些模块中激活它。

这是我想在几个项目之间共享的 POM 片段:

<build>
    <plugins>
       <plugin>

        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>

            <!-- Use a custom descriptor, with suffix "bin" -->
            <descriptors>
                <descriptor>src/main/assembly/runnable-jar-assembly.xml</descriptor>
            </descriptors>

            <!-- Add main class to manifest -->
            <archive>
                <manifest>
                    <mainClass>${mainClass}</mainClass>
                </manifest>
            </archive>

        </configuration>

        <!-- Add build of this package to lifecycle -->
        <executions>
            <execution>
                <id>make-runnable-jar</id>
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executions>

       </plugin>
    </plugins>
</build>

在某些 POMS 中,我希望能够执行以下操作:

<!-- Set the main class -->
<properties>
    <mainClass>my.main.Class</mainClass>
</properties>

<!-- Activate runnable jar build -->
<import>src/main/pom/runnable-jar-pom.xml</import> 

我已经搜索了将一些 XML 片段导入 POM 或定义整个 XML 节点集宏的方法。

对于我所发现的,最接近的解决方案是在父 POM 中定义一个配置文件,并通过测试文件的存在来在某些子模块中激活它。请参阅此相关问题。但我面临的问题是{basedir}没有正确设置继承/设置的属性。

我发现需要一个黑客来做一些如此基本的事情(=通常)是非常令人惊讶的。你通常如何在 Maven 中处理这个问题?

4

4 回答 4

6

我刚刚发现了一些可以解决我的问题的东西:

模块不需要是其父模块的子模块。

模块和子模块关系是独立的概念。

您可以使用relativePath属性(如文档中所述)指定不是文件夹结构中实际父文件夹的父 POM 模块

就我而言,我使用以下布局:

  • 主项目
    • utils(父级:main-project
    • cli 程序(父级:main-project
      • generic-cli (parent: cli-programs ; Dummy & empty POM 模块)
      • cli-1(父级:generic-cli
      • cli-2(父级:generic-cli

然后,generic-cli/pom.xml我可以声明一个所有 cli 程序通用的配置(如自定义测试套件、runnable-jar 打包等)。

于 2011-01-12T13:53:29.010 回答
5

一种方法是在多模块项目的父 pom 中声明您的<plugin>代码。<pluginManagement>然后,各个模块可以有一个<plugin>部分可以使用它而无需重新声明内容。

父pom:

<pluginManagement>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-assembly-plugin</artifactId>
              ... all the details...
         </plugin>
         ...
     </plugins>
</pluginManagement>

儿童绒球:

     <plugins>
        ...
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
        </plugin>
     </plugin>
于 2011-01-12T05:54:13.457 回答
1

Maven-tiles解决了这个问题。它也在 maven 3.x 的路线图上,在此处跟踪。

于 2016-03-11T08:32:13.830 回答
0

不是一个完整的答案,但基于问题的解决方案是使用模块的通用布局,例如 root/modules/moduleA root/modules/moduleB。

您不能再从自己的目录构建模块,只能通过父项目。但是您可以使用配置文件。

于 2011-01-11T17:19:06.547 回答