Создайте многоплатформенный исполняемый файл для приложения SWT, используя maven

Мой вопрос: как я могу создать несколько исполняемых файлов Jar (включая зависимости) для приложения SWT в соответствии с целевой ОС / архитектурой одновременно, используя maven?

Я создал приложение SWT, которое должно работать на разных операционных системах и архитектурах. Проект представляет собой многомодульный проект Maven, включающий родительский POM.

project-pom.xml (packaging = pom, specify SWT dependencies)
`- application-module (inherit SWT dependencies)
   `- pom.xml (packaging = jar)
`- domain-specific-module
   `- pom.xml (packaging = jar)
`- utils-module (inherit SWT dependencies)
   `- pom.xml (packaging = jar)

В родительском ПОМ (project-pom.xml) Я включил SWT-зависимости в соответствии с моей ОС и архитектурой, используя профили maven, которые работают нормально:

<dependencies>
    <dependency>
        <groupId>org.eclipse.swt</groupId>
        <artifactId>${swt.artifactId}</artifactId>
        <version>4.3</version>
    </dependency>
</dependencies>

<repositories>
    <repository>
        <id>EclipseSwtRepository</id>
        <url>https://swt-repo.googlecode.com/svn/repo/</url>
    </repository>
</repositories>

<profiles>
    <profile>
        <id>unix-amd64</id>
        <activation>
            <os>
                <family>unix</family>
                <arch>amd64</arch>
            </os>
        </activation>
        <properties>
            <swt.artifactId>org.eclipse.swt.gtk.linux.x86_64</swt.artifactId>
        </properties>
    </profile>
    <profile>
        <id>windows-x86</id>
        <activation>
            <os>
                <family>windows</family>
                <arch>x86</arch>
            </os>
        </activation>
        <properties>
            <swt.artifactId>org.eclipse.swt.win32.win32.x86</swt.artifactId>
        </properties>
    </profile>
    <profile>
        <id>windows-x86_64</id>
        <activation>
            <os>
                <family>windows</family>
                <arch>x86_64</arch>
            </os>
        </activation>
        <properties>
            <swt.artifactId>org.eclipse.swt.win32.win32.x86_64</swt.artifactId>
        </properties>
    </profile>
</profiles>

Теперь maven выбирает правильную зависимость SWT, например, для составления приложения. Я проверил активный профиль командой mavenmvn help:active-profiles.

Теперь я хочу сгенерировать исполняемые файлы Jar для целевых платформ linux_x86_64 / amd64, windows_x86 и windows_x86_64. На первом этапе я использовалMaven-банка-плагин сгенерировать Jar и файл манифеста (application-module/pom.xml):

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>libs/</classpathPrefix>
                 <mainClass>qualified.path.to.MyApplication</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

Это отлично работает. Баночка генерируется, а манифест находится внутри. Как вы можете видеть, мое намерение состоит в том, чтобы поместить все зависимости в каталог с именемlib/, Но файл Jar не является исполняемым (библиотеки отсутствуют).

Следующий шаг (теоретически) - найти зависимости и скопировать их вlib/ каталог во времяpackage фаза. Для этого шага я (пытался) использовать плагин maven-dependency-plugin (application-module/pom.xml):

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.8</version>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/libs</outputDirectory>
                <overWriteReleases>false</overWriteReleases>
                <overWriteSnapshots>false</overWriteSnapshots>
                <overWriteIfNewer>true</overWriteIfNewer>
            </configuration>
        </execution>
    </executions>
</plugin>

Если я запускаю командуmvn package ничего не происходит (каталог не создается вtarget/ или в другом месте). Чтобы проверить, работает ли плагин, я использовал командуmvn dependency:copy-dependencies который создал каталог под названиемdependency (Я предполагаю, что этот плагин используется по умолчанию) и разместил там все зависимые файлы Jar.

Это первая проблема, которая у меня есть. Следующая проблема заключается в том, как я могу создать несколько (не только один) исполняемых Jar-файлов в соответствии с целевой ОС / архитектурой моего SWT-приложения одновременно (с помощью одной команды, такой какmvn package)? Результирующая структура каталога сборки должна выглядеть примерно так:

target/
`- linux_x86_64/
   `- application-version_linux_x86_64.jar
   `- libs/
      `- org.eclipse.swt.gtk.linux.x86_64-4.3.jar
      `- ...
`- windows_x86/
   `- application-version_windows_x86.jar
   `- libs/
      `- org.eclipse.swt.win32.win32.x86-4.3.jar
      `- ...
`- windows_x86_64/
   `- application-version_x86_64.jar
   `- libs/
      `- org.eclipse.swt.win32.win32.x86_64-4.3.jar
      `- ...

Другим решением является непосредственное размещение зависимостей в файле Jar, но в настоящее время я не знаю, как я могу это сделать.

Я читал о некоторых других плагинах в этом контексте (maven-assembly-plugin, maven-shade-plugin), но в настоящее время это слишком много информации для меня, чтобы проверить, будет ли она работать или нет. Может кто-нибудь сказать мне, какой плагин лучше всего использовать для моих целей?

После того, как это будет сделано в конце концов, я хочу использоватьlaunch4j-Maven-плагин для генерации собственных исполняемых файлов Windows (конечному пользователю не нравится ощущение не собственных исполняемых файлов), используя предыдущие генерируемые исполняемые файлы Jar для Windows.

Я надеюсь, что это достаточно информации.

Ответы на вопрос(1)

Ваш ответ на вопрос