自从我升级到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);
}
有人知道有任何变通方法吗?
答案 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
ScriptEngine engine = mgr.getEngineByName(" AppleScriptEngine");
在您的src目录中创建目录META-INF
在您的src目录中创建目录META-INF / services
创建文件META-INF / services / javax.script.ScriptEngineFactory
在此文件中有一行:
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中的内容会更加健壮。