Создание приложения с несколькими архитектурами SWT с Maven

Я создал проект Maven для приложения SWT. Это приложение работает на нескольких платформах (OS X, Windows 64-bit, Windows 32-bit, Linux 64-bit и Linux 32-bit), и я настроил его так, чтобы платформа была обнаружена, когда Maven запущен и упакован приложение отправляется в разные целевые каталоги. Ниже приведены соответствующие части из pom.xml для этого:

<profiles>
  <profile>
    <id>linux_x86_64</id>
    <activation>
      <os>
        <name>linux</name>
        <arch>amd64</arch>
      </os>
    </activation>
    <build>
      <directory>${project.basedir}/target/${project.version}/linux_x86_64</directory>
    </build>
  </profile>

  <profile>
    <id>win32_x86_64</id>
    <activation>
      <os>
        <name>linux</name>
        <arch>i386</arch>
      </os>
    </activation>
    <build>
      <directory>${project.basedir}/target/${project.version}/win32_x86_64</directory>
    </build>
    </profile>
  ...
</profiles>

И зависимость, используемая для SWT, такова:

<dependencies>
  <dependency>
    <groupId>org.eclipse</groupId>
    <artifactId>swt</artifactId>
    <version>3.7.2.v3740</version>
  </dependency>
...
</dependencies>

Чтобы все было ясно, я установил в своем локальном репозитории пакет фиктивного SWT (org.eclipse.swt_3.7.2.v3740f.jar) и все связанные с платформой (org.eclipse.swt.gtk.linux. x86_64_3.7.2.v3740f, org.eclipse.swt.win32.x86_64_3.7.2.v3740f и т.д.).

Как я устанавливаю зависимости с папкой "lib", используя плагин maven-dependency, и Maven достаточно умен, чтобы скопировать пакет SWT-манекена и платформенный пакет, на котором я упаковываю приложение, Пока что так хорошо...

Проблема в том, что я хотел бы скомпилировать приложение для разных платформ с одной машины. Как я могу это достичь?

Я попытался настроить свойство в каждом профиле с помощью контейнера SWT, необходимого для каждой платформы, например (пример для Windows 64-bit):

<properties>
  <swt.artifactId>swt.win32.x86_64</swt.artifactId>
  <swt.version>3.7.2</swt.version>
</properties>

Но при таком подходе как специфичная для профиля SWT-банка, так и конкретная платформа, в которой я запускаю Maven, копируются в каталог "lib", заканчивая тремя банками:

  • свт-3.7.2.v3740.jar
  • swt.gtk.linux.x86_64-3.7.2.jar
  • swt.win32.x86_64-3.7.2.jar

Есть ли способ указать профиль, игнорирующий машину, на которой я запускаю ее, так что мне не нужно вручную удалять ее SWT-банку?

Спасибо заранее.

Ответ 1

Не знаете, как обрабатывается плагин depency, но он должен работать, если у вас есть только одна зависимость, подобная этой:

    <dependency>
        <groupId>${swt.groupId}</groupId>
        <artifactId>${swt.artifactId}</artifactId>
        <version>3.7.2</version>
        <scope>compile</scope>
    </dependency>

А затем такие профили:

<profile>
  <id>gtk_linux_x86_64</id>
  <activation>
    <os>
      <name>linux</name>
      <arch>x86_64</arch>
    </os>
  </activation>
  <properties>
    <swt.groupId>org.eclipse.swt.gtk.linux</swt.groupId>
    <swt.artifactId>x86_64</swt.artifactId>
  </properties>
</profile>

Теперь необходимая версия SWT используется автоматически, но может быть установлена ​​так, как вам нужно (например, при создании выпуска), используя:

mvn -P gtk_linux_x86_64

Примечание. При необходимости измените ваши идентификаторы groupId и artifactId.