Java ScriptEngineManager不再适用于Mountain Lion的AppleScript

时间:2012-08-15 22:44:43

标签: java applescript osx-mountain-lion

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

Apple页面(link)上的示例代码为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);
}

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

5 个答案:

答案 0 :(得分:4)

我在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下留下了一个功能性的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 - 来重新安装OS for OS X.请求'启动按需安装。

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

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

答案 1 :(得分:4)

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

我还需要改变一些代码:语言似乎不再是“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 ......

答案 2 :(得分:3)

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

不确定Apple为何在Mountain Lion中删除了这些扩展程序。我在他们的开发者论坛上问过这个问题:link

答案 3 :(得分:3)

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

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

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

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

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

    4. 在此文件中有一行:

    5. apple.applescript.AppleScriptEngineFactory

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

答案 4 :(得分:2)

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