如何在依赖模块中激活Maven配置文件?

13

假设我有一个模块A:jar,其运行时和编译依赖关系取决于JDK版本。在我的例子中,我有一个pre-jdk6-profile用于JAXB API:在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.

在生成的 B.war 中缺少 jaxb-api-nnn.jar。但是如果我在构建父级 pom.xml 时激活此配置文件,则一切正常。这意味着配置文件不会从依赖项继承,并且父多模块 pom.xml 能够正确构建一切,因为看起来所有的配置文件都合并在反应堆中。

将配置文件移到父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>
2个回答

18

a) 在多模块构建中,您应该始终从顶层pom构建,而不是从单个模块构建。如果您只想构建一个模块,请使用高级反应堆选项(参见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>

我需要将第二部分添加到模块A还是模块B - dma_k
1
在 JAR 中使用 <scope>provided</scope>,在 webapp 中使用默认范围。但是在 profile 内部两者都要使用。 - Sean Patrick Floyd
我相信如果我在Hudson上运行构建,只能使用(b)。感谢您的提示。 - dma_k
1
我不明白,什么是子档案的激活?父档案是一个空档案吗?这两个档案如何链接在一起? - djjeck
2
我怀疑子配置文件也应该是 <id>pre-jdk-6</id>,对吗? - Eric B.
显示剩余3条评论

6
几点说明:
- 当您使用-P profName时,它会激活名为“profName”的配置文件。 - 之后,它会禁用所有具有<activation>标签的配置文件。无论是像示例中那样由Java版本激活还是通过默认值或环境变量等方式激活,都不重要。 - 这意味着-P会导致任何其他已激活的配置文件变为非活动状态。
解决方案:要么使用<activation><jdk>...</jdk></activation>,要么使用-P,但不要同时使用两者。

2
尽管这个规则在大多数情况下都是正确的,但至少在我的 Maven 3.3+ 经验中似乎存在一些例外。假设有一个基于 Java 版本激活配置文件的 Maven 描述文件(pom.xml)。即使我们明确选择 -P profName 的配置文件,Java 特定的配置文件仍将被激活!Maven 文档友好地解释了其他 "基于检测到的构建环境状态自动触发的配置文件" 也是同样的情况。 - leonidos79

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接