Java ScriptEngineManager不再适用于Mountain Lion的AppleScript

自从我升级到Mountain Lion后,我无法通过Java ScriptEngineManager运行AppleScript代码。

在Apple的页面( 链接 )上找到的示例代码为engine对象返回null。

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

有人知道任何变通方法吗?

我通过在ytw指示的jar的“META-INF / services”文件夹中添加一个名为“javax.script.ScriptEngineFactory”的文件来实现它。

我还需要改变一些代码:语言似乎不再是“AppleScript”而是“AppleScriptEngine”。 所以这应该工作:

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

至少这适用于我的MacOS X Mavericks JDK 1.7.45 ……

我在bugreport.apple.com上发布了这个问题(bug id:12692742)。 我收到了这个回复:

20-Feb-2013 04:21 PM Apple Developer Bug报告团队:我们认为您已经安装了Lion with JavaDeveloper。 您升级到Mountain Lion,它(根据设计)删除了/ System下先前安装的Java SE 6的所有痕迹。 这在/ Library / Java / JavaVirtualMachines下留下了一个function性的SE 6 JDK包,但/ System / Library / Java / Extensions的内容已经消失。

你可以通过几种方式解决这个问题:

1)在Mountain Lion系统上重新安装JavaDeveloper软件包。

2)通过删除/ Library / Java / JavaVirtualMachines和/ System / Library / Java / JavaVirtualMachines下的任何JDK包并运行’java -version’或’/ usr / libexec / java_home –request’来重新安装Java for OS X启动按需安装。

3)从Oracle安装Java 7,捆绑AppleScriptEngine。

在3个选项中,#3是推荐的选项,因为开发人员应该转向Java 7。

我通过从Mac OS X 10.7(Lion)上的/ System / Library / Java / Extensions /复制AppleScriptEngine.jar和libAppleScriptEngine.jnilib并将其添加到我的类路径来实现这一点。

不确定为什么Apple在Mountain Lion中删除了这些扩展。 我在他们的开发者论坛上询问过这个问题: 链接 。

AppleScriptEngine类已经在rt.jar(适用于Mac OS X的Java 7)中。 如果您按照此处的信息( http://docs.oracle.com/javase/7/docs/api/?javax/script/package-summary.html )通过放置名为javax.script的文件使其“可被发现” META-INF / services下的.ScriptEngineFactory,它可以在不依赖于/ System / Library / Java / Extensions /中的AppleScriptEngine.jar的情况下工作。 就个人而言,我认为使用已经存在于rt.jar中的内容会更加健壮。

在Mac OS Yosemite上,java -version:1.7.0_40-ea

  1. 而不是ScriptEngine engine = mgr.getEngineByName(“AppleScript”); 你必须使用:

ScriptEngine engine = mgr.getEngineByName(“AppleScriptEngine”);

  1. 在您的src目录中创建目录META-INF

  2. 在您的src目录中创建目录META-INF / services

  3. 创建文件META-INF / services / javax.script.ScriptEngineFactory

  4. 在这个文件是一行:

apple.applescript.AppleScriptEngineFactory

构建并运行应用程序! (顺便说一句,它不是Java,它是神奇的)