Maven - 根据项目属性激活配置文件

11

您好,我希望能够实现类似于以下的功能:

在一个父级POM中,我有:

<profile>
  <activation>
    <property>
      <name>Compile</name>
      <value>${project.artifactId}</value>
    ...

如果我在父POM下运行mvn -DCompile=mod1 install,它只会将配置文件应用于模块一,而不是其他模块。

同样地,如果我有

<profile>
  <activation>
    <property>
      <name>Compile</name>
      <value>${project.packaging}</value>
    ...

在父级 POM 下运行 mvn -DCompile=war install,它将仅将配置文件应用于要打包为 war 的内容,而不是 jar 或 pom。

我尝试过了,但效果不如预期。我错过了什么吗?请帮忙。

附言:不需要提出解决方法,因为我只对这种方法感兴趣。如果不行,请简要说明原因。谢谢


1
从Maven 3.9.0开始,"packaging"也可以作为激活属性使用:https://maven.apache.org/guides/introduction/introduction-to-profiles.html - Dan Armstrong
3个回答

19

由于...

首先:

接下来解释为什么从父级到子级无法生效:

  • 父级POM中的属性在子级POM进入项目之前就已经被展开了。

许多人在你之前都尝试过这种方法并失败了。

也许有人会想知道你真正想做什么。你是要从同一源代码项目构建不同的构件吗?也许你需要更多的Maven模块来处理这些事情。


你是说 ${project.packaging} 是静态的,不像父级那样扩展到pom,然后在子级中扩展到jar等吗? - user1589188
由于问题标记为“java”,让我们小心使用“static”这个词的含义 :) 我的意思是配置文件激活只被评估一次,因此基于父级项目的${project.packaging},可能是pom - Sander Verhagen
而真正有趣的是,我实际上必须使用 mvn -DCompile=${project.packaging}。所以它根本没有扩展... - user1589188

12

是的,您可以根据一个或多个参数(例如env变量)激活配置文件。

<project>
    ...
    <profiles>
        <profile>
            <id>development</id>
            <activation>
                <property>
                    <name>!environment.type</name>
                </property>
            </activation>
        </profile>
    </profiles>
</project>

如果您想根据X使用不同的包装方式,可以使用assembly插件并在那里进行操作。

http://maven.apache.org/plugins/maven-assembly-plugin/

有关激活属性的更多信息,请参见:


3

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