Erstellen Sie mit maven eine plattformübergreifende ausführbare Datei für eine SWT-Anwendung

Meine Frage ist: Wie kann ich mit maven mehrere ausführbare Jar-Dateien (inkl. Abhängigkeiten) für eine SWT-Anwendung entsprechend dem Zielbetriebssystem / der Zielarchitektur gleichzeitig generieren?

Ich habe eine SWT-Anwendung erstellt, die auf verschiedenen Betriebssystemen und Architekturen ausgeführt werden muss. Das Projekt ist ein Maven-Projekt mit mehreren Modulen und einem übergeordneten 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)

Im übergeordneten POM (project-pom.xml) Ich habe die SWT-Abhängigkeiten gemäß meinem Betriebssystem und meiner Architektur mithilfe von Maven-Profilen berücksichtigt, was gut funktioniert:

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

Nun wählt Maven die richtige SWT-Abhängigkeit, z. zum kompilieren der anwendung. Ich habe das aktive Profil mit dem Befehl maven überprüftmvn help:active-profiles.

Jetzt möchte ich die ausführbaren Jars für die Zielplattformen linux_x86_64 / amd64, windows_x86 und windows_x86_64 generieren. Im ersten Schritt habe ich dieMaven-Jar-Plugin&nbsp;ein Jar und die Manifest-Datei zu erzeugen (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>

Das funktioniert gut. Das Glas wird erzeugt und das Manifest ist in ihm. Wie Sie sehen, ist es meine Absicht, alle Abhängigkeiten in das aufgerufene Verzeichnis zu stellenlib/. Die Jar-Datei ist jedoch nicht ausführbar (die Bibliotheken fehlen).

Der nächste Schritt (theoretisch) besteht darin, die Abhängigkeiten zu finden und diese in die zu kopierenlib/&nbsp;Verzeichnis während derpackage&nbsp;Phase. Für diesen Schritt habe ich das 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>

Wenn ich den Befehl ausführenmvn package&nbsp;es passiert nichts (in wird kein Verzeichnis angelegt)target/&nbsp;oder anderswo). Um zu überprüfen, ob das Plugin richtig funktioniert, habe ich den Befehl verwendetmvn dependency:copy-dependencies&nbsp;die ein Verzeichnis namens erstelltdependency&nbsp;(Ich nehme die Standardeinstellung für dieses Plugin an) und platziere alle abhängigen Jar-Dateien dort.

Dies ist das erste Problem, das ich habe. Das nächste Problem ist, wie ich mehrere (nicht nur eine einzige) ausführbare Jar-Datei entsprechend dem Ziel-Betriebssystem / der Zielarchitektur meiner SWT-Anwendung auf einmal erstellen kann (mit einem einzigen Befehl wiemvn package)? Die resultierende Struktur des Build-Verzeichnisses sollte ungefähr so aussehen:

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

Eine andere Lösung besteht darin, die Abhängigkeiten direkt in die Jar-Datei einzufügen. Derzeit ist mir jedoch nicht bekannt, wie ich dies tun kann.

Ich habe in diesem Zusammenhang einige andere Plugins gelesen (Maven-Assembly-Plugin, Maven-Shadow-Plugin), aber derzeit sind dies zu viele Informationen für mich und um zu überprüfen, ob es funktioniert oder nicht. Kann mir jemand sagen, welches Plugin für meine Zwecke am besten geeignet ist?

Nachdem dies irgendwann erledigt ist, möchte ich das verwendenlaunch4j-maven-plugin&nbsp;Um native ausführbare Windows-Dateien zu generieren (der Endbenutzer mag das Gefühl nicht nativer ausführbarer Dateien nicht), verwenden Sie die zuvor generierten ausführbaren Jar-Dateien für Windows.

Ich hoffe das sind genug Informationen.