2010-02-11 92 views
14

我有一个多模块Maven2项目,它建立一个Web应用程序。该应用程序连接到后端服务器和数据库。有部署在我们的环境中的几个服务器实例,并且也有发展的多个后端和数据库实例,UAT,生产等,所以实际上,每一个应用程序的配置需要这3个坐标:为什么我无法从其他配置文件激活Maven2配置文件?

  • 前端服务器
  • 后端服务器
  • DB

我工作的统一和自动化应用程序配置。将这些不同的配置表示为Maven中的配置文件是很容易和明显的。然后,我可以通过激活每个组中的一个配置文件来创建特定配置,例如,

mvn -Pserver.Server1,backend.prod,db.uat clean install 

这是一个有点乏味键入且容易出错 - 如果特定服务器,配置到连接到错误的DB,价格也高。解决此问题的一个显而易见的方法是将所有有用的配置文件组合放入脚本文件中。

但我认为我可以直接从服务器配置文件启动所需的后台和数据库配置文件比这更聪明。服务器配置文件位于主要的pom中,例如

<profile> 
    <id>server.myserver</id> 
    <properties> 
     <jboss.home>D:\Programs\jboss-4.2.1.GA</jboss.home> 
     <server.name>NightlyBuild</server.name> 
     <hosttobind>192.168.1.100</hosttobind> 
     <servlet.port>8080</servlet.port> 
     ... 
     <db>dev02</db> 
    </properties> 
</profile> 

和后端和DB配置文件是在配置子模块,例如的聚甲醛

<profile> 
    <id>db.dev02</id> 
    <activation> 
     <property> 
      <name>db</name> 
      <value>dev02</value> 
     </property> 
    </activation> 
    <properties> 
     <jdbc.address>jdbc:oracle:thin:@192.168.0.101:1521:dbdev02</jdbc.address> 
    </properties> 
</profile> 

所以理论上,因为server.myserver轮廓设置db属性dev02,这将引发孩子POM的db.dev02轮廓的激活。但是,这不会发生。 (如果这两个配置文件是在同一个pom中,btw)。如果我有

mvn -Ddb=dev02 help:active-profiles 

设置属性在命令行,则轮廓虽然激活,所以显然我没有拼错什么。

我忽略了什么吗?有没有其他的方式来完成这项工作?

我看到了存在类似的问题:Can I make one maven profile activate another?
但是,恕我直言,这不是一个重复的 - 我看到,我的做法是不工作,我想知道为什么。 (我已经阅读了参考文献,但我可能忽略了一些明显的内容)。

回答

16

该功能根本不存在。属性激活器使用传入属性,而不是配置文件设置的任何东西(否则,如果没有更复杂的逻辑,它将不知道以什么顺序激活它们)。

您使用的解决方案具有相同的属性以激活您想要一起完成的任务,这是最佳解决方案。我意识到这可能并不总是令人满意 - 在这种情况下,你所能做的就是回到使个人简档尽可能简单,以便可以在命令行中以所需的方式组合它们,而无需在它们之间重复。

具有这一特征的问题是:https://issues.apache.org/jira/browse/MNG-3309
覆盖属性激活的问题是:https://issues.apache.org/jira/browse/MNG-2276

+0

@布雷特,谢谢,这清除了事情。最后一件事情是:你写道:“你使用的解决方案具有相同的属性来激活你想要一起做的事情,这是最好的解决方案。”凭什么?审美也许,但它仍然行不通... – 2010-02-12 09:22:07

+1

我的意思是“从命令行”。所以如果你需要'profile1'来暗示'profile2'被激活,请确保它们都是用'propertyX'激活的,然后使用'mvn -DpropertyX'而不是'mvn -Pprofile1'。它不像你想要的那么灵活。 – 2010-02-12 11:52:04

3

Issue MNG-2276由Brett提到的行家3.x中得到解决,所以你现在允许设置定义的属性。 xml触发你的pom中的配置文件。这里有一个例子:

Settings.XML中:

<profile> 
    <id>localDist</id> 
    <activation> 
     <property><name>localDist</name></property> 
    </activation> 
    <properties> 
     <doReleaseTasks>true</doReleaseTasks> 
    </properties> 
</profile> 

在你的POM(或更好,但在你的父POM):

<profile> 
    <id>doReleaseTasks</id> 
    <activation> 
     <property><name>doReleaseTasks</name></property> 
    </activation> 
    <build> 
     <plugins> 
      ... mvn -DlocalDist will activate these plugins 
     </plugins> 
    </build> 
</profile> 

好主意,用执法插件强制mvn 3.0或更高版本:

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-enforcer-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>enforce-maven</id> 
        <goals> <goal>enforce</goal> </goals> 
        <configuration> 
         <rules> 
          <requireMavenVersion> 
           <version>[3.0,)</version> 
           <message> 
*** Maven 3.x required to allow cascading profiles to be activated in settings.xml (MNG-2276) 
           </message> 
          </requireMavenVersion> 
         </rules> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 
相关问题