java - para - ¿Por qué NetBeans ejecuta mi programa en OS X, pero no lo construye en un JAR?
jdk para mac (3)
tl; dr
¿Qué dependencia me falta que permite que NetBeans ejecute el programa integrado con OS X perfectamente internamente, pero no para poder limpiarlo y compilarlo en un JAR?
Intento crear un programa Java que se integre en OS X, pero también espero lanzarlo a Windows y Linux. Para hacer esto, estoy usando las com.apple.eawt
de utilidad del paquete com.apple.eawt
.
Hasta ahora, ha sido genial. Tengo mi barra de menús integrada en OS X, tengo Preferences Handlers y About Handlers y todas esas cosas divertidas y está funcionando muy bien ... cuando solo estoy haciendo clic en Ejecutar en NetBeans. ¡Sin embargo! Cuando hago clic en Limpiar y compilar , recibo muchos, muchos errores como estos:
/my/source/path/MenuBarManager.java:3: error: package com.apple.eawt does not exist
import com.apple.eawt.AboutHandler;
/my/source/path/MenuBarManager.java:62: error: cannot find symbol
private static class MyAboutHandler implements AboutHandler {
^
symbol: class AboutHandler
location: class MyMenuBarManager
/my/source/path/MyMenuBarManager.java:68: error: package AppEvent does not exist
@Override public void handleAbout(AppEvent.AboutEvent ae) {
^
/my/source/path/MyMenuBarManager.java:67: error: method does not override or implement a method from a supertype <br/>
@Override public void handleAbout(AppEvent.AboutEvent ae) {
^
¿Por qué puedo ejecutarlo en el IDE sin problemas, pero no puedo decirle al IDE que lo compile en un JAR?
Intento de solución
Intenté la solución de Ajith John de recrear completamente el proyecto haciendo un nuevo proyecto NetBeans, copiando todos los archivos fuente y haciendo clic en "Limpiar y compilar". Obtuve el mismo resultado, así que esto no funcionó.
NetBeans tiene una función de ejecución duramente organizada. Si lo hice bien, esta función compila y ejecuta su aplicación en el proceso de NetBeans (y su ruta de clases). Para resolver el problema con la compilación mediante el comando "compilar", debe asegurarse de que su agente de compilación tenga todas las dependencias necesarias:
- Para Maven, solo debes agregar la dependencia en pom.xml,
- Para ant: debe especificar classpath para agregar .jar necesario en él.
El paquete PS com.apple.eawt es el único paquete de Apple. Si desea iniciar la aplicación en otras plataformas, debe usar AWT simple (no Apple EAWT) u otro marco de interfaz de usuario común (por ejemplo, Swing).
Mi solución actual es limpiar y ejecutar el programa ( no compilar), y luego colocar los archivos .class
en una carpeta .zip
con una carpeta META_INF
formato META_INF
y el archivo manifest.MF
. ¡Luego renombro la extensión .zip
a .jar
, y utilizo este jarfile pirateado!
Aunque el paquete com.apple.eawt
está en el jar de ejecución rt.jar
(si está en OS X), el compilador busca el paquete en un archivo de símbolos llamado ct.sym
. El archivo de símbolos solo contiene los paquetes estándar de Java y no las extensiones de Apple.
Una solución es usar la opción javac -XDignore.symbol.file
como se muestra a continuación. Sin embargo, las opciones de -XD no son estándar ni están documentadas, consulte aquí y aquí .
Una mejor solución puede ser reescribir el código de una manera que no use las extensiones Apple no estándar.