Мультиплатформенные многомодульные сборки с Maven - PullRequest
0 голосов
/ 22 октября 2009

У меня есть большой проект, который использует SWT на нескольких разных платформах, таких как Windows (32 и 64 бит), Linux-GTK (32 и 64 бит) и т. Д. Проект имеет несколько модулей в простой структуре:

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

Я бы хотел иметь возможность запускать свой код из Eclipse на всех поддерживаемых платформах. Например. если я посмотрю на модуль swt-bridge на 32-разрядной машине с Windows, он должен иметь 32-разрядные зависимости SWT для Windows, а также извлечь необходимые библиотеки DLL в какой-либо каталог, который затем можно добавить в java.library.path.

Я могу указать различные зависимости, определив профили, активированные os.family и 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>

Я также могу использовать maven-dependency-plugin для извлечения любых DLL, файлов .so из SWT JAR в target/swtlib и использовать их из Eclipse.

Это нормально работает, если я поместил профили в модуль swt-bridge. Но в этом случае я не вижу свойства, установленные активным профилем из других проектов, например, Я не могу использовать плагин зависимости с этими свойствами (что я хотел бы).

Я думал, что смогу решить эту проблему, перенеся профили в родительский POM, и, действительно, если я создаю весь продукт, он работает. Но таким образом я не могу просто собрать один модуль, потому что Maven будет жаловаться на отсутствующие свойства.

Я уверен, что многие люди сталкиваются с этой проблемой, поэтому должен быть способ справиться с этим должным образом в Maven. Может кто-нибудь сказать мне, что это?

1 Ответ

3 голосов
/ 22 октября 2009

Наследование проекта должно работать здесь: properties наследуются, если вы помещаете их в родительский pom и , если профиль активирован. Обратите внимание, что я сказал активирован , а не активен для текущего проекта (см. MNG-3228 для различий между обоими терминами).

Я установил простую сборку из нескольких модулей, демонстрирующую наследование свойств из профиля в родительском pom с помощью maven 2.2.1. Проект имеет следующую структуру:

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

А это пом модуля:

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

А если я запускаю maven из модуля:

$ 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, наследуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...