如何激活依赖模块中的Maven配置文件?
假设我有一个模块A:jar
,其运行时和编译依赖依赖于JDK版本。 在我的例子中,我有一个用于JAXB API的pre-jdk6-profile
:在JDK 1.6.0之前,我需要包含jaxb-api-nnn.jar
作为编译依赖项。 这个配置文件被放置到A.pom
。
我也有模块B:war
,这取决于A:jar
。 我希望能够在构建服务器上激活此配置文件以构建JDK 1.5.x可交付成果。 当我使用激活的给定配置文件执行Maven时,我收到消息:
mvn -Ppre-jdk6-profile -o install
[WARNING]
Profile with id: 'pre-jdk6-profile' has not been activated.
而jaxb-api-nnn.jar
在结果B.war
缺失。 但是,如果从父pom.xml
构建时激活此配置文件,则一切正常。 这意味着配置文件不会从依赖关系继承,并且父多模块pom.xml能够正确构建所有内容,因为它似乎将所有配置文件合并到了reactor中。
将配置文件转移到父pom会使事情变得更糟,因为依赖项适用于所有其他项目(例如C:ear
)。 这个任务是否有很好的解决方案,即,如果任何模块A
依赖于模块B
,那么所有由配置文件激活的编译和运行时依赖关系都可以正确处理?
项目A:jar
的配置文件如下所示:
<project ...>
<artifactId>A</artifactId>
<packaging>jar</packaging>
...
<parent>
<artifactId>P</artifactId>
...
</parent>
<profiles>
<profile>
<id>pre-jdk6-profile</id>
<activation>
<jdk>(,1.6.0)</jdk>
</activation>
<dependencies>
<dependency>
<groupId>javax.xml.ws</groupId>
<artifactId>jaxws-api</artifactId>
</dependency>
</dependencies>
</profile>
</profiles>
...
</project>
a)在多模块构建中,您应该始终从顶层构建,而不是从单个模块构建。 如果您只想构建一个模块,请使用高级反应堆选项(请参阅mvn --help),如下所示:
mvn -pl mymodule
b)定义并激活父pom中的配置文件,但将配置添加到子pom中。
父pom.xml
<profiles>
<profile>
<id>pre-jdk-6</id>
<activation>
<jdk>(,1.6.0)</jdk>
</activation>
</profile>
</profiles>
孩子pom.xml
<profiles>
<profile>
<id>pre-jdk-6</id>
<dependencies>
<dependency>
<groupId>javax.xml.ws</groupId>
<artifactId>jaxws-api</artifactId>
</dependency>
</dependencies>
</profile>
</profiles>
事实之后有几种注释方式:
-P profName
,它将激活名为“profName”的配置文件 <activation>
标签的配置文件。 它们是否由java版本激活并不重要,如示例中所示,或者默认情况下或env值或任何值。 解决方案:使用<activation><jdk>...</jdk></activation>
或使用-P
但不要同时使用两者。