【问题标题】:Maven Profile - Activate Profile depending on packagingMaven Profile - 根据打包激活 Profile
【发布时间】:2011-04-02 08:18:05
【问题描述】:

我有一个 POM,它声明了我的项目常用的 Web 应用程序内容。我将它用作所有 Web 应用程序的父级。

是否可以仅在包装为战争时激活配置文件?我已经尝试过属性方法,但这不起作用(因为它不是系统/环境属性)。

由于构建失败,我可以在安装 POM 时简单地禁用该配置文件,但我希望它自己更智能。

沃尔特

【问题讨论】:

标签: maven-2 profiles


【解决方案1】:

我知道这不是直接回答您的问题,但解决此类问题的通常解决方法是仅使用专业化(与类一样)。

因此,您的 MasterPom 具有所有常见行为。

扩展 MasterPom(它是父级)的 MasterWarPom,并将任何“包装就是战争”的专业化放在此处。

同样你可以拥有 MasterJarPom 等...

这样可以很好地区分差异。

【讨论】:

  • 这正是我正在做的。这是我的抽象 Web 应用程序 pom,问题是,密钥生成部分要在打包阶段运行。当我安装/部署 pom 时,我会禁用该配置文件。
【解决方案2】:

没有干净的方法可以做到这一点,父模块无法知道子模块的包装。 (非干净的解决方案将涉及创建一个解析子模块的 pom 等的插件。)

【讨论】:

  • 为什么不能简单的激活呢?例如,在父 pom 中,您说,在 project.packaging = war 或 jar 时激活。当子组件的包装覆盖父组件的 pom 包装时,就会激活配置文件。是否可以编写这样的激活?
  • 我很确定这不是配置文件继承的工作方式。父母会开启或不开启配置文件,但孩子不会继承开启逻辑,只会继承配置文件内的内容。
【解决方案3】:

对于这些场景,我能想到的最好办法就是使用基于文件的激活触发器。 例如,我的父母 pom 有

<profile>
   <id>maven-war-project</id>
   <activation>
     <file><!-- add a file named .maven-war-project-marker to webapp projects to activate this profile -->
       <exists>${basedir}/.maven-war-project-marker</exists>
     </file>
   </activation>
   <build>
     <plugins>
   <!-- configuration for webapp plugins here  -->
     </plugins>
   </build>

从这个父级继承的 webapp 项目包含一个名为 '.maven-war-project-marker' 激活配置文件

这看起来很钝,但工作相当可靠,而 - 如果不同的人或系统进行构建,则使用属性激活是不可靠的, - 从特定类型的父母继承对我来说有点麻烦,因为祖父母 pom 相对频繁地更改版本,因为它用于定义常见依赖项的“标准”或首选版本,这反过来又需要所有特定类型的相应版本除了祖父母版本之外没有任何变化的父母

【讨论】:

    【解决方案4】:

    您可以简单地检查 src/main/webapp 的存在。每个使用 Maven 标准目录布局的 Web 应用程序都应该包含这个文件夹。因此,您可以避免不必要的虚拟文件。

    <profile>
        <id>custom-profile-eclipse-project-generation-webapp</id>
        <activation>
            <file>
                <exists>${basedir}/src/main/webapp</exists>
            </file>
        </activation>
        <build>
        </build>
    </profile>
    

    更准确地说,您还可以检查 ${basedir}/src/main/webapp/WEB-INF/web.xml 是否存在。这应该明确地确定一个战争项目。

    对于我自己,我在我的常用 super-pom 中使用此配置来为不同的项目类型配置 maven-eclipse-plugin。这对于在我们组织中的相同项目类型上获得同质 eclipse 配置非常方便,尤其是当开发人员直接在多模块项目上运行 eclipse:eclipse 时。

    【讨论】:

    • 或者检查仅存在于具有父/聚合 pom 的目录中的文件。这样,IMO 就更加健壮了。例如:SOME_FILE_THAT_EXISTS_ONLY_IN_DIRECTORY_WITH_AGGREGATE_POM
    【解决方案5】:

    这样试试?

    mvn 包 -Dmaven.test.skip=true -Dwar

    <project ×××××>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>××××</groupId>
        <artifactId>×××××</artifactId>
        <version>×××××</version>
        <relativePath>../../</relativePath>
    </parent>
    <artifactId>×××××</artifactId>
    <name>${project.artifactId}-${project.version}</name>
    <description>${project.artifactId}-${project.version}</description>
    <properties>
        <packaging.type>jar</packaging.type>
    </properties>
    <profiles>
        <profile>
            <activation>
                <property>
                    <name>war</name>
                </property>
            </activation>
            <properties>
                <packaging.type>war</packaging.type>
            </properties>
            <build>
                <finalName>ROOT</finalName>
            </build>
        </profile>
    </profiles>
    <packaging>${packaging.type}</packaging>
    <dependencies>
        <dependency>
            ... ...
        </dependency>
        ... ... 
    </dependencies>
    

    【讨论】:

    • 嗨!欢迎来到 StackOverflow——您能否通过解释它如何回答所提出的问题来补充您的答案?
    • 外部化包装类型会使 Maven 配置变得不必要。
    猜你喜欢
    • 2021-12-23
    • 2013-10-14
    • 1970-01-01
    • 2021-10-15
    • 2012-02-25
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    相关资源
    最近更新 更多