Aquí está el fondo del problema subyacente, estoy colaborando con un grupo en un proyecto que usa las bibliotecas Swt
y estoy tratando de empaquetar el software para la implementación. Como resultado, SWT
depende de la plataforma/arquitectura. Me gustaría poder empaquetar los seis jar
s (linux, mac, win y 32/64-bit) en el mismo paquete y usar la biblioteca apropiada según el sistema. Me doy cuenta de que es un desafío difícil, sin embargo, cambiar a Swing
(o cualquier otra cosa) no es realmente una opción en este momento.Problemas con la carga de recursos durante la ejecución
He encontrado una serie de hilos relevantes (@Aaron Digulla's thread y @mchr's thread) que me proporcionaron información valiosa sobre el problema en cuestión. He tratado de implementar la solución propuesta por @Alexey Romanov here. Con una diferencia, ya que el método loadSwtJar()
que él propone no es estático, instanciar el objeto, e inmediatamente después, ejecutar el método antes de hacer cualquier otra cosa al objeto.
Parece que el procedimiento de carga no funciona correctamente. Mi razonamiento para esta declaración es el siguiente:
- Si todos
Swt
frascos se retiran de la ruta de clase del archivo jar ejecutable,Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/swt/events/MouseListener
se lanza la cual es causada por:java.lang.ClassNotFoundException: org.eclipse.swt.events.MouseListener
para mí este medio que las bibliotecas no se encuentran en classpath, ¿me equivoco?
- Si
swt
jarras quedan en el classpath entonces el primer archivo jar es utilizado por el sistema durante la ejecución. Es decir, si gtk-linux-x86_64 es el primer jar swt en la lista de jar, entonces el sistema intenta usarlo, independientemente de si el sistema es win32 o Mac OSX.
He intentado añadir un poco de salida para ver si el método loadSwtJar()
es la elección de la jarra de la derecha, y la salida parece correcto en todas las plataformas que he tratado, al igual que en el paquete adecuado se selecciona (y deben existir los archivos en el jar ejecutable). Sin embargo, la biblioteca correcta no está cargada, se producen errores de ejecución: Exception in thread "main" java.lang.reflect.InvocationTargetException
causada por, por ejemplo, Caused by: java.lang.UnsatisfiedLinkError: Cannot load 32-bit SWT libraries on 64-bit JVM
(Tenga en cuenta que este es el error que obtengo en mi máquina Linux si cambio el orden de aparición de 64 bits y 32 bit swt bibliotecas en el archivo build.xml
)
Entonces, ¿cuál parece ser el problema aquí? ¿Me estoy perdiendo algunos detalles, o simplemente no es posible verificar las propiedades del sistema y cargar una biblioteca apropiada en consecuencia?
Por último, a continuación se muestra un fragmento de mi archivo de compilación, que figura que podría ayudar a encontrar el origen del problema.
Gracias de antemano,
EDIT: Después de una larga sesión de depuración con un colega, el problema se resuelve (excepto un molesto error con respecto a la gestión de rosca en MacOS como he mencionado here). Implicaba retocar con la creación de ANT, así como la forma en que se escribió la clase principal.(La clase principal, como resultado, estaba extendiendo & implementando referencias de la biblioteca SWT lo que significaba que el código no compilaría en absoluto, envolvió la clase principal con otra clase y cargó las jarras SWT de allí que parecían ser suficientes para abordar el problema)
Gracias y saludos a todos los que contribuyeron, especialmente @Aaron. ¡Muy apreciado!
Gracias Aaron. Tengo que decir que no estoy muy seguro de cómo cavar para encontrar los archivos swt, ¿tiene sus archivos Swt dentro de un gran contenedor con todas las otras dependencias o de alguna otra manera? – posdef
@ Aaron: una pregunta más, ¿ha tenido algún problema con los paquetes SWT sin firmar? o solo soy yo ... – posdef
@posdef: pongo todos los JAR normales en un directorio llamado 'lib /' y los seis JARs SWT en 'swt /'. Si los coloca en un solo directorio, es probable que el classpath del manifiesto principal de JAR intente cargar el incorrecto. –