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

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

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

project-pom.xml (packaging = pom, указать зависимости SWT)
`- application-module (наследовать SWT-зависимости)
   `- pom.xml (упаковка = банка)
`- предметный модуль
   `- pom.xml (упаковка = банка)
`- utils-module (наследовать SWT-зависимости)
   `- pom.xml (упаковка = банка)

В родительском ПОМ (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, например, для компиляции приложения. Я проверил активный профиль командой maven mvn help:active-profiles,

Теперь я хочу сгенерировать исполняемые файлы Jar для целевых платформ linux_x86_64/amd64, windows_x86 и windows_x86_64. На первом этапе я использовал maven-jar-plugin для генерации 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-plugin для генерации собственных исполняемых файлов Windows (конечному пользователю не нравится ощущение не собственных исполняемых файлов), используя предыдущие генерируемые исполняемые файлы Jar для окон.

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

1 ответ

Я сделал это с помощью Maven, изучив настройки JackRabbit. JackRabbit поставляется во всех видах форм (автономно, OSGi-пакет, веб-приложение и т. Д.), И все это делается из одного агрегатора.

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

Затем я создал проект "общие ресурсы сборки", который создает jar со всеми ресурсами (например, readme, руководство, рисунки и т. Д.), Которые используются во всех сборках для платформы. Каждый проект сборки платформы извлекает этот jar, а затем копирует извлеченные файлы в нужное место. Насколько я вижу, JackRabbit не делает этого, поэтому вы, вероятно, можете пропустить этот шаг.

Наконец, для каждой платформы создается отдельный подмодуль сборки платформы. В сборке платформы вы можете указать, какие зависимости вы хотите и не хотите. Подмодуль может содержать файлы, специфичные для платформы (например, batch-файлы для Windows,.sh-файлы для Linux). Форма сборки может быть сделана специально для платформы (например,.zip для Windows и.tar.gz для Linux). Для Windows я также включил NSIS для создания setup.exe (который вы также можете собрать на Linux с установленным NSIS-пакетом).

В этой настройке я много использовал плагин maven-dependency-plugin с разными фазами. Я часто использую фазу process-resources, вы можете попробовать это вместо фазы package,

Другие вопросы по тегам