Für meinen aktuellen Job musste ich eine ausführbare Jar liefern, die Gläser in sich laden und eine zweite main() ausführen konnte. Im Grunde ein Bootstrap main() und eine Anwendung main().
Schritt 1 im Manifest „Hauptklasse“ Sie setzen Ihre Bootstrap-Klasse
Schritt 2. Wenn der Bootstrap-Klasse läuft unjar sein eigenes Glas ist und alle Gläser im Inneren in ein temporäres Verzeichnis. Verwenden Sie etwas wie die Zeile unten, um Ihr eigenes Glas zu bekommen.
Main.class.getProtectionDomain().getCodeSource().getLocation().toURI()
Schritt 3. Ihre Bootstrap-Klasse erkennt das Betriebssystem über die „os.name“ Eigenschaft und lädt die entsprechenden Gläser aus dem temporären Verzeichnis mit diesem
private static void loadJarIntoClassloader(URL u) throws Exception
{
URLClassLoader sysLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Class<URLClassLoader> sysclass = URLClassLoader.class;
Method method = sysclass.getDeclaredMethod("addURL", URL.class);
method.setAccessible(true);
method.invoke(sysLoader, new Object[]{u});
}
Schritt 4. Nun sollten Sie in der Lage sein, um Ihre Anwendung zu starten, indem Sie die Anwendung main() aufrufen.
HINWEIS: Dieser kleine Hack hängt von Ihrer JVM ab und verwendet URLClassLoader
als SystemClassLoader, was für Sun JVMs gilt, nicht für andere.
Auf diese Weise können Sie nur ein einziges Glas liefern, und es wird sich selbst auspacken und mit den richtigen Gläsern laufen.
Warum Sie verteilen nicht mehrere ausführbare Dateien für jede Plattform (a la Eclipse)? –
Da SWT nur einen kleinen Teil der App braucht: Das Ganze ist derzeit 30MB. So kann ich entweder Leute bitten, 32MB für jede Plattform herunterzuladen oder eine einzelne 40MB (für sechs Plattformen) Datei herunterzuladen, die überall läuft. –
Im Fall der Finsternis haben wir 10+ Downloads, jedes> 100MB und der einzige Unterschied zwischen ihnen ist das SWT-Glas. Ich möchte entweder einen einzelnen Download oder einen großen Hauptdownload und einen kleinen Download pro Plattform, der automatisch heruntergeladen wird, wenn ich die App das erste Mal benutze. –