Maven 2 Maven配置文件-根据包装激活配置文件

Maven 2 Maven配置文件-根据包装激活配置文件,maven-2,profiles,Maven 2,Profiles,我有一个POM,它声明了我的项目中常见的web应用程序内容。我将其用作所有web应用程序的父级 是否只有在包装为war时才能激活配置文件?我已经尝试过属性方法,但它不起作用(因为它不是系统/环境属性) 由于构建失败,我可以在安装POM时简单地禁用该配置文件,但我希望它本身更智能 Walter我知道这并不是直接回答你的问题,但解决此类问题的通常方法是使用专门化(与类一样) 因此,你有你的大师与所有常见的行为 MasterWarPom扩展了MasterPom(是它的父级),并将任何“打包就是战争”的

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

是否只有在包装为war时才能激活配置文件?我已经尝试过属性方法,但它不起作用(因为它不是系统/环境属性)

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


Walter

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

因此,你有你的大师与所有常见的行为

MasterWarPom扩展了MasterPom(是它的父级),并将任何“打包就是战争”的专业化放在这里

同样地,你也可以拥有大师贾波姆,等等


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

没有干净的方法可以做到这一点,父模块无法知道子模块的包装。(非干净的解决方案包括创建一个插件来解析子模块的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>

马文战争项目
${basedir}/.maven war项目标记
从该父级继承的webapp项目包含一个名为 “.maven war项目标记” 这将激活配置文件

这看起来相当迟钝,但工作相当可靠 -如果由其他人或系统进行构建,则使用属性激活是不可靠的,
-从特定于类型的父级继承对我来说有点麻烦,因为祖父母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>

自定义概要文件eclipse项目生成webapp
${basedir}/src/main/webapp
更准确地说,您还可以检查${basedir}/src/main/webapp/WEB-INF/WEB.xml是否存在。这将明确确定一个战争项目

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

尝试这种方法吗

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>

4.0.0
××××
×××××
×××××
../../
×××××
${project.artifactId}-${project.version}
${project.artifactId}-${project.version}
罐子
战争
战争
根
${packaging.type}
... ...
... ... 

这正是我正在做的。这是我的抽象web应用程序pom,问题是,关键生成部分希望在包阶段运行。我在安装/部署pom时要做的是禁用该配置文件。为什么一个简单的激活不能做到?例如,在父pom中,您可以说,当project.packaging=war或jar时激活。当子级的打包覆盖父级的pom打包时,配置文件被激活。有可能编写这样一个激活吗?我很确定这不是配置文件继承的工作方式。父级将打开或不打开配置文件,但子级将不会继承打开逻辑,只继承配置文件中的内容。这种类型的高级配置文件激活尚未实现!欢迎使用StackOverflow——您可以通过解释它如何回答所问的问题来补充您的答案吗?外部化打包类型会使Maven配置变得复杂,这是不必要的。或者检查仅存在于具有父/聚合pom的目录中的文件。这样它就更健壮了。例如:某些\u文件\u存在\u仅\u在\u目录\u中\u与\u聚合\u POM