2009-10-22 67 views
0

我有一个在windows(32和64位),linux-gtk(32和64位)等几个不同平台上使用SWT的大型项目。一个简单的结构:使用Maven构建多平台多模块

 
project-parent 
+- core 
+- swt-bridge (uses SWT) 
+- module1 (uses swt-bridge module) 
+- module2 
+- ... 
+- module17 (uses swt-bridge module) 

我希望能够在所有支持的平台上从Eclipse运行我的代码。例如。如果我在32位Windows计算机上查看swt-bridge模块,它应该具有32位Windows SWT依赖关系,并且还将所需的DLL解压到某个目录,然后我可以将其添加到java.library.path

我可以通过定义由os.familyos.arch激活的配置文件来指定不同的依赖关系。

 
<profile> 
    <id>macos</id> 
    <activation> 
    <os> 
    <family>macosx</family> 
    <arch>x86</arch> 
    </os> 
    </activation> 
    <properties> 
    <swt.native.groupId>org.eclipse.swt.carbon.macosx</swt.native.groupId> 
    <swt.native.artifactId>x86</swt.native.artifactId> 
    <swt.native.version>3.5.1</swt.native.version> 
    </properties> 
</profile> 

我还可以使用maven-dependency-plugin提取任何的DLL。所以从SWT JAR文件target/swtlib,并从Eclipse中使用它们。

这工作正常,如果我把配置文件在swt-bridge模块。但是这样我就看不到其他项目中活动配置文件设置的属性,例如我不能使用这些属性(我想)的依赖插件。

我想我可以通过将配置文件移动到父POM来解决这个问题,事实上,如果我构建了整个产品,它就可以工作。但是这样我不能只创建一个模块,因为Maven会抱怨缺失的属性。

我敢肯定很多人都面临这个问题,所以必须有一种方法在Maven中正确处理这个问题。谁能告诉我它是什么?

+0

我是对的,假设你有一个真正的Maven项目继承(即子项目pom包含元素与相应的父项目坐标)并且说单个子模块由于缺少属性而无法生成? – 2009-10-22 10:07:54

+0

是的,有正确的指针。有没有说过我不允许以这种方式建立一个模块? – 2009-10-22 10:56:09

+0

嗯,Maven文档说明如下:'当一个项目指定一个父项时,它会继承父项目的POM中的信息。然后它可以覆盖并添加到此父POM'中指定的值。即假定您的子项目会看到父项目属性。我只是检查了如果父项目定义了一个激活的配置文件并且它被激活了,那么对于子项目的maven build会看到它的正确属性。 – 2009-10-22 11:20:13

回答

3

项目继承应该在这里工作:properties如果将它们放置在父POM 如果配置文件被激活继承。请注意,我说激活而不是活动为当前项目(请参阅MNG-3228为两个术语之间的差异)。

我已经设置了一个简单的多模块构建,演示了使用maven 2.2.1从父pom中的配置文件继承属性。该项目具有以下结构:

. 
|-- my-module 
| |-- pom.xml 
| `-- src 
|  |-- main 
|  | `-- java 
|  `-- test 
|   `-- java 
`-- pom.xml 

父pom.xml的定义如下(适合我的平台):

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.mycompany.app</groupId> 
    <artifactId>my-app</artifactId> 
    <packaging>pom</packaging> 
    <version>1.0-SNAPSHOT</version> 
    <modules> 
    <module>my-module</module> 
    </modules> 
    <profiles> 
    <profile> 
     <id>linux-x86</id> 
     <properties> 
     <someVar>some value</someVar> 
     </properties> 
     <activation> 
     <os> 
      <name>Linux</name> 
      <arch>i386</arch> 
     </os> 
     </activation> 
    </profile> 
    </profiles> 
</project> 

这是模块的POM:

<project> 
    <parent> 
    <artifactId>my-app</artifactId> 
    <groupId>com.mycompany.app</groupId> 
    <version>1.0-SNAPSHOT</version> 
    </parent> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.mycompany.app</groupId> 
    <artifactId>my-module</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <build> 
    <plugins> 
     <plugin> 
     <artifactId>maven-antrun-plugin</artifactId> 
     <executions> 
      <execution> 
      <phase>compile</phase> 
      <configuration> 
       <tasks> 
       <echo message="${someVar}"/> 
       </tasks> 
      </configuration> 
      <goals> 
       <goal>run</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

如果我从父运行Maven:

$ mvn help:active-profiles compile 
[INFO] Scanning for projects... 
[INFO] Reactor build order: 
[INFO] Unnamed - com.mycompany.app:my-app:pom:1.0-SNAPSHOT 
[INFO] Unnamed - com.mycompany.app:my-module:jar:1.0-SNAPSHOT 
[INFO] Searching repository for plugin with prefix: 'help'. 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building Unnamed - com.mycompany.app:my-app:pom:1.0-SNAPSHOT 
[INFO] task-segment: [help:active-profiles] (aggregator-style) 
[INFO] ------------------------------------------------------------------------ 
[INFO] [help:active-profiles {execution: default-cli}] 
[INFO] 
Active Profiles for Project 'com.mycompany.app:my-app:pom:1.0-SNAPSHOT': 

The following profiles are active: 

- linux-x86 (source: pom) 



Active Profiles for Project 'com.mycompany.app:my-module:jar:1.0-SNAPSHOT': 

There are no active profiles. 



[INFO] ------------------------------------------------------------------------ 
[INFO] Building Unnamed - com.mycompany.app:my-app:pom:1.0-SNAPSHOT 
[INFO] task-segment: [compile] 
[INFO] ------------------------------------------------------------------------ 
[INFO] No goals needed for project - skipping 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building Unnamed - com.mycompany.app:my-module:jar:1.0-SNAPSHOT 
[INFO] task-segment: [compile] 
[INFO] ------------------------------------------------------------------------ 
[INFO] [resources:resources {execution: default-resources}] 
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! 
[INFO] skip non existing resourceDirectory /home/pascal/Projects/my-app/my-module/src/main/resources 
[INFO] [compiler:compile {execution: default-compile}] 
[INFO] Nothing to compile - all classes are up to date 
[INFO] [antrun:run {execution: default}] 
[INFO] Executing tasks 
    [echo] some value 
[INFO] Executed tasks 
[INFO] 
[INFO] 
[INFO] ------------------------------------------------------------------------ 
[INFO] Reactor Summary: 
[INFO] ------------------------------------------------------------------------ 
[INFO] Unnamed - com.mycompany.app:my-app:pom:1.0-SNAPSHOT ... SUCCESS [0.003s] 
[INFO] Unnamed - com.mycompany.app:my-module:jar:1.0-SNAPSHOT SUCCESS [1.256s] 
[INFO] ------------------------------------------------------------------------ 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESSFUL 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 3 seconds 
[INFO] Finished at: Thu Oct 22 18:08:16 CEST 2009 
[INFO] Final Memory: 9M/80M 
[INFO] ------------------------------------------------------------------------ 

如果我运行从模块行家:

$ cd my-module 
$ mvn help:active-profiles compile 
[INFO] Scanning for projects... 
[INFO] Searching repository for plugin with prefix: 'help'. 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building Unnamed - com.mycompany.app:my-module:jar:1.0-SNAPSHOT 
[INFO] task-segment: [help:active-profiles] (aggregator-style) 
[INFO] ------------------------------------------------------------------------ 
[INFO] [help:active-profiles {execution: default-cli}] 
[INFO] 
Active Profiles for Project 'com.mycompany.app:my-module:jar:1.0-SNAPSHOT': 

There are no active profiles. 



[INFO] ------------------------------------------------------------------------ 
[INFO] Building Unnamed - com.mycompany.app:my-module:jar:1.0-SNAPSHOT 
[INFO] task-segment: [compile] 
[INFO] ------------------------------------------------------------------------ 
[INFO] [resources:resources {execution: default-resources}] 
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! 
[INFO] skip non existing resourceDirectory /home/pascal/Projects/my-app/my-module/src/main/resources 
[INFO] [compiler:compile {execution: default-compile}] 
[INFO] Nothing to compile - all classes are up to date 
[INFO] [antrun:run {execution: default}] 
[INFO] Executing tasks 
    [echo] some value 
[INFO] Executed tasks 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESSFUL 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 4 seconds 
[INFO] Finished at: Thu Oct 22 18:09:38 CEST 2009 
[INFO] Final Memory: 10M/79M 
[INFO] ------------------------------------------------------------------------ 

正如你所看到的情景模式后(但不激活),并在父POM配置文件定义的属性是继承。