Para mi trabajo actual necesitaba suministrar un archivo ejecutable que pudiera cargar frascos dentro de sí mismo y ejecutar un segundo main(). Básicamente una rutina de arranque() y una aplicación principal().
Paso 1. En la "clase principal" manifiesta que ponga su clase de arranque
Paso 2. Cuando la clase de arranque que se ejecuta unjar es su propio frasco y todos los frascos en su interior a un directorio temporal. Use algo como la línea de abajo para obtener su propio frasco.
Main.class.getProtectionDomain().getCodeSource().getLocation().toURI()
Paso 3. Su clase de arranque detecta el sistema operativo a través de la propiedad "os.name" y carga los frascos apropiados desde el directorio temporal con esta
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});
}
Paso 4. Ahora usted debería ser capaz ejecutar su aplicación llamando a la aplicación main().
NOTA: Este pequeño hack depende de su JVM utilizando URLClassLoader
como su SystemClassLoader, lo que es cierto para las JVM de Sun, no es seguro en otras.
De esta manera puede entregar un solo frasco solamente, y se descomprimirá y se ejecutará con los frascos correctos.
¿Por qué no distribuir varios ejecutables para cada plataforma (al estilo de Eclipse)? –
Porque SWT solo ocupa una pequeña parte de la aplicación: todo el conjunto actualmente es de 30 MB. Así que puedo pedirle a la gente que descargue 32MB por cada plataforma o descargar un archivo de 40MB (para seis plataformas) que se ejecuta en todas partes. –
En el caso de eclipse, tenemos más de 10 descargas, cada una> 100 MB y la única diferencia entre ellas es el contenedor SWT. O deseo una sola descarga o una gran descarga principal y una pequeña descarga por plataforma que se descarga automáticamente cuando ejecuto la aplicación por primera vez. –