Maven配置文件-根据打包类型激活配置文件

15

我有一个POM文件,声明了在我项目中通用的Web应用程序的一些东西。我将其用作所有Web应用程序的父级。

当打包为war文件时,是否可能仅激活一个配置文件?我已经尝试了属性的方法,但这不起作用(因为它不是系统/环境属性)。

由于这会导致构建失败,我可以在安装POM时禁用该配置文件,但我希望它能够自动更加智能地处理。

Walter


2
这种高级配置文件激活方式尚未实现。 - anttix
@anttix提到的问题已经被移动并自动关闭。 - Didier L
2
Maven 3.9.0以来,这是可能的。 - ZhekaKozlov
5个回答

16

你可以简单地检查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文件是否存在,这将明确标识为一个war项目。

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


或者检查仅存在于具有父/聚合pom目录中的文件。这样,它在我看来更加健壮。例如:<activation><file><missing>SOME_FILE_THAT_EXISTS_ONLY_IN_DIRECTORY_WITH_AGGREGATE_POM</missing></file></activation> - Rafał Kłys

5

我知道这并没有直接回答你的问题,但通常解决这类问题的方法是使用专业化(就像类一样)。

因此,您可以使用包含所有通用行为的MasterPom。

MasterWarPom扩展了MasterPom(作为其父级),并在其中放置任何“打包成war”的专业化内容。

同样,您也可以有MasterJarPom等等...

这样,差异就被很好地分离出来了。


这正是我正在做的事情。这是我的抽象Web应用程序pom,问题在于密钥生成部分希望在打包阶段运行。当我安装/部署pom时,我会禁用该配置文件。 - Walter White

2

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


为什么不能使用简单的激活方式呢?例如,在父POM中,您可以说当project.packaging = war或jar时激活。当子模块的打包方式覆盖了父POM的打包方式时,该配置文件将被激活。是否可能编写这样的激活方式呢? - Walter White
1
我非常确定这不是配置文件继承的工作方式。父级将根据配置文件开启或关闭,但子级不会继承开关逻辑,只会继承配置文件中的内容。 - Sean Patrick Floyd

0
我能想到的解决这类情况的最佳方法是使用基于文件的触发器。 例如,我的父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>

继承自此父级的Web应用程序项目包含一个名为'.maven-war-project-marker'的文件,该文件激活配置文件

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


-2

尝试这种方式?

mvn package -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 -- 你能否通过解释它如何回答所提出的问题来补充你的答案? - bwegs
1
将打包类型外部化会使Maven配置变得不必要复杂。 - shylynx

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