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

dma*_*a_k 10 maven-2

假设我有一个模块A:jar,其依赖项的运行时和编译集取决于JDK版本.在我的示例中,我有一个pre-jdk6-profilefor 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.
Run Code Online (Sandbox Code Playgroud)

并且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>
Run Code Online (Sandbox Code Playgroud)

Sea*_*oyd 12

a)在多模块构建中,您应始终从顶部pom构建,而不是从单个模块构建.如果您只想构建一个模块,请使用高级reactor选项(请参阅mvn --help),如下所示:

mvn -pl mymodule
Run Code Online (Sandbox Code Playgroud)

b)定义并激活父pom中的配置文件,但在子pom中添加配置.

父pom.xml

<profiles>
    <profile>
         <id>pre-jdk-6</id>
         <activation>
            <jdk>(,1.6.0)</jdk>
         </activation>
    </profile>
</profiles>
Run Code Online (Sandbox Code Playgroud)

孩子pom.xml

<profiles>
    <profile>
        <id>pre-jdk-6</id>

        <dependencies>
            <dependency>
                <groupId>javax.xml.ws</groupId>
                <artifactId>jaxws-api</artifactId>
            </dependency>
        </dependencies>
    </profile>
</profiles>
Run Code Online (Sandbox Code Playgroud)

  • 我怀疑子配置文件也应该是&lt;id&gt;pre-jdk-6&lt;/id&gt;? (2认同)

Lee*_*dor 5

事后的几个注意事项:

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

解决方案:要么使用<activation><jdk>...</jdk></activation>要么使用-P但不要同时使用。

  • 尽管这条规则在大多数情况下都适用,但似乎有一些例外——至少在我使用 Maven 3.3+ 的经验中是这样。假设有一个 Maven 描述符(`pom.xml`)根据 Java 版本激活配置文件。即使我们使用`-P profName` 明确选择了一个配置文件,Java 特定的配置文件仍然会被激活!正如 Maven 文档亲切地解释的那样,其他“根据检测到的构建环境状态自动触发的配置文件”也是如此。 (2认同)