Создайте многоплатформенный исполняемый файл для приложения 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
,