我目前正在努力使用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中定义配置文件,并通过测试文件的存在在一些子模块中激活它。 See this related question。但我面临的问题是{basedir}
属性没有被正确设置为继承/设置。
我觉得非常令人惊讶的是需要一个黑客来做一些如此基本的事情(通常)。你通常如何在Maven中处理这个问题?
答案 0 :(得分:6)
我刚刚发现了一些可能解决我问题的方法:
模块不需要是其父模块的子模块。
父和子模块关系是不同的概念。
您可以使用 relativePath 属性(as explained in the doc)
指定文件夹结构中不是实际父文件夹的父POM模块就我而言,我使用以下布局:
- 主要项目强>
- utils (父级:主项目)
- cli-programs (父级:主项目)
- generic-cli (父级: cli-programs ; Dummy&amp; empty POM模块)
- cli-1 (父母: generic-cli )
- cli-2 (父母: generic-cli )
然后,在generic-cli/pom.xml
中,我可以声明所有cli程序(如自定义测试套件,runnable-jar包装等)通用的配置。
答案 1 :(得分:5)
执行此操作的一种方法是在多模块项目的父pom的<plugin>
内声明<pluginManagement>
代码。然后,各个模块可以有一个<plugin>
部分,可以使用它而无需重新声明内容。
父母:
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
... all the details...
</plugin>
...
</plugins>
</pluginManagement>
儿童poms:
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
</plugin>
</plugin>
答案 2 :(得分:0)
不是一个完整的答案,但是对于基础问题的解决方案是使用模块的通用布局,例如, root / modules / moduleA root / modules / moduleB。
您无法再通过thr父项目构建自己的目录模块。但您可以使用配置文件。
答案 3 :(得分:0)
Maven-tiles解决了这个问题。它也在maven 3.x的路线图上,跟踪here。