2009-10-22 7 views
0

J'ai un grand projet qui utilise SWT sur plusieurs plateformes différentes comme windows (32 et 64 bits), linux-gtk (32 et 64 bits) etc. Le projet a plusieurs modules en une structure simple:Constructions multi-plateformes multi-plateformes avec Maven

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

J'aimerais pouvoir exécuter mon code depuis Eclipse sur toutes les plateformes supportées. Par exemple. si je regarde le module swt-bridge sur une machine Windows 32 bits, il devrait avoir les dépendances Windows SWT 32 bits, et aussi avoir les DLL requises extraites dans un répertoire que je peux ensuite ajouter à java.library.path.

Je peux spécifier différentes dépendances en définissant des profils activés par os.family et os.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> 

Je peux aussi utiliser le maven-dependency-plugin pour extraire toutes les DLL, fichiers .so du SWT JAR target/swtlib, et de les utiliser d'Eclipse.

Cela fonctionne très bien si je mets les profils dans le module swt-bridge. Mais de cette façon, je ne peux pas voir les propriétés définies par le profil actif d'autres projets, par exemple. Je ne peux pas utiliser le plugin de dépendance avec ces propriétés (ce que je voudrais). Je pensais que je pouvais résoudre ce problème en déplaçant les profils vers le POM parent, et en effet, si je construis le produit entier, cela fonctionne. Mais de cette façon, je ne peux pas construire un seul module, car Maven se plaindra des propriétés manquantes.

Je suis sûr que beaucoup de gens sont confrontés à ce problème, donc il doit y avoir un moyen de gérer cela correctement dans Maven. Quelqu'un peut-il me dire ce que c'est?

+0

Ai-je raison de supposer que vous avez un véritable héritage de projets maven (c.-à-d.sous-projet pom contient élément avec les coordonnées du projet parent correspondant) et dit que le module enfant unique ne peut pas être construit en raison de propriétés manquantes? –

+0

Oui, il y a les pointeurs appropriés à . Est-ce que quelque chose dit que je ne suis pas autorisé à construire un module de cette façon? –

+0

Eh bien, la documentation Maven dit ce qui suit: 'Lorsqu'un projet spécifie un parent, il hérite des informations contenues dans le POM du projet parent. Il peut ensuite remplacer et ajouter aux valeurs spécifiées dans ce POM parent '. C'est à dire. votre projet enfant est supposé voir les propriétés du projet parent. Je viens de vérifier que si le projet parent définit un profil activé et qu'il est activé, le projet maven build for child en voit les propriétés correctes. –

Répondre

3

L'héritage du projet devrait fonctionner ici: properties sont héritées si vous les placez dans le pom parent et si le profil est activé. Veuillez noter que j'ai dit activé et non actif pour le projet en cours (voir MNG-3228 pour la différence entre les deux termes).

J'ai configuré une construction multi-modules simple démontrant l'héritage des propriétés d'un profil dans le pom parent avec maven 2.2.1. Le projet a la structure suivante:

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

Le pom.xml parent est défini comme suit (adapté à ma plate-forme):

<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> 

Et ceci est la pom du module:

<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> 

Si je lance Maven du parent:

$ 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] ------------------------------------------------------------------------ 

Et si je lance Maven à partir du module:

$ 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] ------------------------------------------------------------------------ 

Comme vous pouvez le voir, le profil est activé (mais non actif) et la propriété définie dans le profil de la pom-mère est héritée.

Questions connexes