我有一个 POM,它声明了我的项目常见的 Web 应用程序内容。我将它用作所有 Web 应用程序的父级。
是否可以仅在包装为战争时激活配置文件?我已经尝试过属性方法,但这不起作用(因为它不是系统/环境属性)。
由于构建失败,我可以在安装 POM 时简单地禁用该配置文件,但我希望它本身更智能。
沃尔特
您可以简单地检查 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 时。
我知道这不是直接回答您的问题,但是解决此类问题的通常解决方法是仅使用专业化(与类一样)。
因此,您拥有具有所有常见行为的 MasterPom。
扩展 MasterPom 的 MasterWarPom(它是父级),并将任何“包装就是战争”的专业化放在此处。
同样,您可以拥有 MasterJarPom 等...
这样,差异就很好地分开了。
没有干净的方法可以做到这一点,父模块无法知道子模块的包装。(非干净的解决方案将涉及创建一个解析子模块的 pom 等的插件。)
对于这些场景,我能想到的最好的方法就是使用基于文件的激活触发器。例如,我的父母 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 相对频繁地更改版本,因为它用于定义常见依赖项的“标准”或首选版本,这反过来又需要所有特定类型父项的相应版本,除了祖父版本之外没有任何变化
用这种方法试试?
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>