2012-08-15 5 views
8

Da quando ho eseguito l'aggiornamento a Mountain Lion, non riesco a eseguire il codice AppleScript tramite Java ScriptEngineManager.Java ScriptEngineManager non funziona più con AppleScript di Mountain Lion

Il codice di esempio trovato sulla pagina Apple (link) restituisce null per l'oggetto 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); 
} 

Qualcuno sa di soluzioni alternative?

+0

Hai installato Java? Apple non ha più una versione di Java con MacOSX. Nel terminale prova ... java -version. Questo ti dirà se è necessario installare java. – regulus6633

+0

Sì, Java è installato. – dejuknow

risposta

4

Ho funzionato aggiungendo un file denominato "javax.script.ScriptEngineFactory" nella cartella "META-INF/services" del mio jar come indicato da ytw.

Devo anche cambiare un po 'di codice: il linguaggio sembra non essere più "AppleScript" ma "AppleScriptEngine". Quindi questo dovrebbe funzionare:

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); 
    } 

Almeno questo funziona sul mio MacOS X Mavericks con JDK 1.7.45 ...

+3

Hai dimenticato di dire che devi aggiungere la seguente riga all'interno del file "META-INF/services/javax.script.ScriptEngineFactory": apple.applescript.AppleScriptEngineFactory –

+0

Hai ragione Saeid – Alban

3

L'ho ottenuto copiando AppleScriptEngine.jar e libAppleScriptEngine.jnilib da/System/Library/Java/Extensions/su Mac OS X 10.7 (Lion) e aggiungendolo al mio classpath.

Non sono sicuro del motivo per cui Apple ha rimosso queste estensioni in Mountain Lion. Ho chiesto informazioni sui loro forum per sviluppatori qui: link.

+0

Hai avuto una risposta nel forum? (Il link sembra essere morto ora.) – qerub

+2

Ho ricevuto una risposta sul loro sistema di tracciamento dei bug. Ho aggiunto la risposta come risposta separata. – dejuknow

4

Ho postato questo problema su bugreport.apple.com (ID bug: 12692742). Ho ricevuto questa risposta:

20-Feb-2013 4:21 PM Team di segnalazione bug degli sviluppatori Apple: Crediamo che tu abbia avuto un'installazione di Lion con JavaDeveloper. Hai effettuato l'upgrade a Mountain Lion, che ha rimosso (di progettazione) tutte le tracce di Java SE 6 precedentemente installato in/Sistema. Questo ha lasciato un pacchetto JDK SE 6 funzionale in/Library/Java/JavaVirtualMachines, ma i contenuti di/System/Library/Java/Extensions erano spariti.

È possibile risolvere questo un paio di modi:

1) Ri-installare il pacchetto JavaDeveloper sul sistema di Mountain Lion.

2) Reinstallare Java per OS X rimuovendo i pacchetti JDK in/Library/Java/JavaVirtualMachines e/System/Library/Java/JavaVirtualMachines ed eseguendo 'java -version' o '/ usr/libexec/java_home - -request 'per avviare l'installazione su richiesta.

3) Installare Java 7 da Oracle, che raggruppa AppleScriptEngine.

Delle 3 opzioni, # 3 è la soluzione consigliata, in quanto gli sviluppatori dovrebbero passare a Java 7 comunque.

2

La classe AppleScriptEngine è già in rt.jar (Java 7 per Mac OS X). Se si seguono le informazioni qui (http://docs.oracle.com/javase/7/docs/api/?javax/script/package-summary.html) per renderlo 'rilevabile' posizionando un file chiamato javax.script.ScriptEngineFactory sotto META-INF/services, quindi può funzionare senza fare affidamento su AppleScriptEngine.jar in/Sistema/Libreria/Java/Extensions /. Personalmente, penso che sia più robusto usare ciò che è già in rt.jar.

2

In Mac OS Yosemite, java -version: 1.7.0_40-EA

  1. Invece del motore ScriptEngine = mgr.getEngineByName ("AppleScript"); è necessario utilizzare:

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

  1. Nella directory src creare directory META-INF

  2. Nella directory src creare directory META-INF/services

  3. Creare il file META-INF/servizi/javax.script.ScriptEngineFactory

  4. in questo file è una riga:

apple.applescript.AppleScriptEngineFactory

Costruisci ed esegui l'applicazione! (BTW non è più Java, è magico)