2009-10-22 64 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配置文件定義的屬性是繼承。