我有一个POM文件,声明了在我项目中通用的Web应用程序的一些东西。我将其用作所有Web应用程序的父级。
当打包为war文件时,是否可能仅激活一个配置文件?我已经尝试了属性的方法,但这不起作用(因为它不是系统/环境属性)。
由于这会导致构建失败,我可以在安装POM时禁用该配置文件,但我希望它能够自动更加智能地处理。
Walter
我有一个POM文件,声明了在我项目中通用的Web应用程序的一些东西。我将其用作所有Web应用程序的父级。
当打包为war文件时,是否可能仅激活一个配置文件?我已经尝试了属性的方法,但这不起作用(因为它不是系统/环境属性)。
由于这会导致构建失败,我可以在安装POM时禁用该配置文件,但我希望它能够自动更加智能地处理。
Walter
你可以简单地检查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时。
我知道这并没有直接回答你的问题,但通常解决这类问题的方法是使用专业化(就像类一样)。
因此,您可以使用包含所有通用行为的MasterPom。
MasterWarPom扩展了MasterPom(作为其父级),并在其中放置任何“打包成war”的专业化内容。
同样,您也可以有MasterJarPom等等...
这样,差异就被很好地分离出来了。
没有干净的方法来做到这一点,父模块无法知道子模块的打包方式。(非干净的解决方案将涉及创建一个插件来解析子模块的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的版本相对频繁地更改,因为它用于定义常见依赖项的“标准”或首选版本,这反过来又需要所有特定类型的父级的相应发布,除了祖父版本之外没有任何更改。
尝试这种方式?
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>