2010-08-20 61 views
7

假设我有一个模块A:jar,其运行时和编译依赖关系取决于JDK版本。在我的例子中,我有一个pre-jdk6-profileJAXB API:在JDK 1.6.0之前,我需要包含jaxb-api-nnn.jar作为编译依赖。此配置文件被放置到A.pom。我也有模组B:war,这取决于A:jar。我希望能够在构建服务器上激活此配置文件以构建JDK 1.5.x可交付成果。当我被激活给定的配置文件执行的Maven,我得到的消息:如何激活依赖模块中的Maven配置文件?

mvn -Ppre-jdk6-profile -o install 
[WARNING] 
     Profile with id: 'pre-jdk6-profile' has not been activated. 

jaxb-api-nnn.jar,导致B.war丢失。但是,如果我从父母pom.xml构建时激活此配置文件,则一切正常。这意味着配置文件不会从依赖关系继承,并且父多模块pom.xml能够正确构建所有内容,因为它似乎将所有配置文件合并到了reactor中。

将配置文件移动到父pom会使事情变得更糟,因为依赖项适用于所有其他项目(例如C:ear)。这个任务是否有很好的解决方案,也就是说,如果任何模块A依赖于模块B,那么正确处理由配置文件激活的所有编译和运行时相关性?

的轮廓在项目A:jar如下:

<project ...> 
    <artifactId>A</artifactId> 
    <packaging>jar</packaging> 
    ... 
    <parent> 
     <artifactId>P</artifactId> 
     ... 
    </parent> 

    <profiles> 
     <profile> 
      <id>pre-jdk6-profile</id> 

      <activation> 
       <jdk>(,1.6.0)</jdk> 
      </activation> 

      <dependencies> 
       <dependency> 
        <groupId>javax.xml.ws</groupId> 
        <artifactId>jaxws-api</artifactId> 
       </dependency> 
      </dependencies> 
     </profile> 
    </profiles> 
... 
</project> 

回答

8

一)在多模块构建,你应该始终从顶部POM建设,从来没有从一个单独的模块。如果你想建立只有一个模块,采用先进的电抗器选项(参见MVN --help)是这样的:

mvn -pl mymodule 

b)定义并激活父POM的配置文件,但在孩子POM添加配置。

父pom.xml的

<profiles> 
    <profile> 
     <id>pre-jdk-6</id> 
     <activation> 
      <jdk>(,1.6.0)</jdk> 
     </activation> 
    </profile> 
</profiles> 

孩子的pom.xml事后

<profiles> 
    <profile> 
     <id>pre-jdk-6</id> 

     <dependencies> 
      <dependency> 
       <groupId>javax.xml.ws</groupId> 
       <artifactId>jaxws-api</artifactId> 
      </dependency> 
     </dependencies> 
    </profile> 
</profiles> 
+0

我是否需要将第二部分添加到模块“A”或模块“B”? – 2010-08-22 20:44:51

+0

两者。在JAR中使用'提供的',在默认范围内的webapp中。但在个人资料里面。 – 2010-08-23 04:43:22

+0

我相信,我只能使用(b)如果我运行哈德森版本。感谢您的提示。 – 2010-09-07 13:37:16

1

几个音符方式:

  1. 当您使用-P profName,它会激活一个名为轮廓“ profName'
  2. 之后,它禁用所有配置文件s有一个<activation>标签。它们是否由java版本激活并不重要,如示例中所示,或者默认情况下或env值或任何值。
  3. 这意味着-P会导致任何其他激活的配置文件变为停用状态。

解决方法:使用<activation><jdk>...</jdk></activation>或使用-P但不要同时使用两者。

相关问题