【问题标题】:How to activate a Maven profile in a dependent module?如何在依赖模块中激活 Maven 配置文件?
【发布时间】:2011-04-01 17:32:03
【问题描述】:

假设我有一个模块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.

并且jaxb-api-nnn.jar 缺失导致B.war。但是,如果我在从父 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>

【问题讨论】:

    标签: maven-2


    【解决方案1】:

    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
    • 两者。在具有&lt;scope&gt;provided&lt;/scope&gt; 的 JAR 中,在具有默认范围的 webapp 中。但是在两个配置文件里面。
    • 我相信,如果我在 Hudson 上运行构建,我只能使用 (b)。谢谢你的提示。
    • 不明白,什么是激活子配置文件?父配置文件是空配置文件吗?这两个配置文件是如何关联在一起的?
    • 我怀疑子配置文件也应该是 pre-jdk-6
    【解决方案2】:

    事后的几个注意事项:

    1. 当您使用-P profName 时,它会激活一个名为“profName”的配置文件
    2. 之后,它会禁用所有带有&lt;activation&gt; 标签的配置文件。它们是由 java 版本(如示例中所示)激活,还是由默认值或 env 值或其他任何内容激活都没有关系。
    3. 这意味着 -P 会导致任何其他激活的配置文件被停用。

    解决方案:要么使用&lt;activation&gt;&lt;jdk&gt;...&lt;/jdk&gt;&lt;/activation&gt;,要么使用-P,但不要同时使用。

    【讨论】:

    • 尽管这条规则在大多数情况下都适用,但似乎也有一些例外——至少在我使用 Maven 3.3+ 的经验中是这样。假设有一个 Maven 描述符 (pom.xml) 激活基于 Java 版本的配置文件。即使我们明确选择了带有-P profName 的配置文件,Java 特定的配置文件仍然会被激活!正如 Maven 文档所解释的那样,其他“基于检测到的构建环境状态自动触发的配置文件”也是如此。
    猜你喜欢
    • 2011-06-14
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 2012-07-22
    • 2019-04-18
    • 2018-07-03
    • 2011-11-12
    相关资源
    最近更新 更多