13

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

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

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

沃尔特

4

5 回答 5

13

您可以简单地检查 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 是否存在。这应该明确地确定一个战争项目。

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

于 2013-12-03T10:28:13.803 回答
5

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

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

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

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

这样,差异就很好地分开了。

于 2010-08-22T18:42:47.753 回答
2

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

于 2010-08-23T05:00:21.227 回答
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>

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

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

于 2013-10-14T09:50:03.240 回答
-2

用这种方法试试?

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>

于 2014-10-24T03:57:36.627 回答