2012-08-15 15 views
8

Desde que me actualicé a Mountain Lion, no puedo ejecutar mi código AppleScript a través del Java ScriptEngineManager.Java ScriptEngineManager ya no funciona con Apple Lion's AppleScript

El código de ejemplo encontrado en la página de Apple (link) devuelve nulo para el objeto engine.

public static void main(String[] args) throws Throwable { 
    String script = "say \"Hello from Java\""; 

    ScriptEngineManager mgr = new ScriptEngineManager(); 
    ScriptEngine engine = mgr.getEngineByName("AppleScript"); 
    engine.eval(script); 
} 

¿Alguien sabe de alguna solución?

+0

¿Tiene Java instalado? Apple ya no envía una versión de Java con MacOSX. En la Terminal intenta ... java -version. Eso le dirá si necesita instalar Java. – regulus6633

+0

Sí, Java está instalado. – dejuknow

Respuesta

4

Lo obtuve trabajando agregando un archivo llamado "javax.script.ScriptEngineFactory" en la carpeta "META-INF/services" de mi jar como se indicó.

También tengo que cambiar un poco de código: el lenguaje ya no es "AppleScript" sino "AppleScriptEngine". Así que esto debería funcionar:

public static void main(String[] args) throws Throwable { 
     String script = "say \"Hello from Java\""; 

     ScriptEngineManager mgr = new ScriptEngineManager(); 
     ScriptEngine engine = mgr.getEngineByName("AppleScriptEngine"); 
     engine.eval(script); 
    } 

Al menos esto funciona en mis MacOS X Mavericks con JDK 1.7.45 ...

+3

Olvidó mencionar que debe agregar la siguiente línea dentro del archivo "META-INF/services/javax.script.ScriptEngineFactory": apple.applescript.AppleScriptEngineFactory –

+0

Tiene usted razón Saeid – Alban

3

Esto funcionó al copiar AppleScriptEngine.jar y libAppleScriptEngine.jnilib de/System/Library/Java/Extensions/en Mac OS X 10.7 (Lion) y agregarlo a mi classpath.

No estoy seguro de por qué Apple eliminó estas extensiones en Mountain Lion. He preguntado sobre esto en sus foros de desarrolladores aquí: link.

+0

¿Recibió alguna respuesta en el foro? (El enlace parece estar muerto ahora.) – qerub

+2

Recibí una respuesta en su sistema de seguimiento de errores. He agregado su respuesta como una respuesta separada. – dejuknow

4

He publicado este problema en bugreport.apple.com (id de error: 12692742). Recibí esta respuesta:

20-Feb-2013 04:21 PM Apple Developer Bug Team de informes: Creemos que tenía una instalación de Lion con JavaDeveloper. Se actualizó a Mountain Lion, que eliminó (por diseño) todos los rastros de Java SE 6 instalado anteriormente en/System. Esto dejó un paquete SE 6 JDK funcional en/Library/Java/JavaVirtualMachines, pero los contenidos de/System/Library/Java/Extensions desaparecieron.

Puede resolver este un par de maneras:

1) Vuelva a instalar el paquete JavaDeveloper en el sistema del león de montaña.

2) Reinstale Java para OS X eliminando los paquetes JDK en/Library/Java/JavaVirtualMachines y/System/Library/Java/JavaVirtualMachines y ejecutando 'java-version' o '/ usr/libexec/java_home - -request 'para iniciar la instalación bajo demanda.

3) Instale Java 7 desde Oracle, que agrupa AppleScriptEngine.

De las 3 opciones, la # 3 es la recomendada, ya que los desarrolladores deberían moverse a Java 7 de todos modos.

2

La clase AppleScriptEngine ya está en rt.jar (Java 7 para Mac OS X). Si sigue la información aquí (http://docs.oracle.com/javase/7/docs/api/?javax/script/package-summary.html) para que sea 'detectable' colocando un archivo llamado javax.script.ScriptEngineFactory en META-INF/services, entonces puede funcionar sin depender de AppleScriptEngine.jar en/System/Library/Java/Extensions /. Personalmente, creo que es más robusto usar lo que ya está en rt.jar.

2

En Mac OS Yosemite, java -version: 1.7.0_40-ea

  1. En lugar de ScriptEngine engine = mgr.getEngineByName ("AppleScript"); debe usar:

ScriptEngine engine = mgr.getEngineByName ("AppleScriptEngine");

  1. En su directorio src crear directorio META-INF

  2. En su directorio src crear directorio META-INF/services

  3. Crear archivo META-INF/servicios/javax.script.ScriptEngineFactory

  4. en este archivo es una línea:

apple.applescript.AppleScriptEngineFactory

¡Genera y ejecuta la aplicación! (BTW no es más Java, es mágico)

Cuestiones relacionadas