Maven / Java8 build中的编译错误:找不到符号JSObject.getWindow

我有同样的问题,这里不能解决Java applet项目中的JSObject :

  • JSObject取自jdk中的jfxrt.jar(JavaFX)而不是plugin.jar,因此没有JSObject.getWindow方法,编译失败。

这里的问题是我使用java 8和maven进行构建,因此我无法从构建路径中删除jfxrt.jar,并且似乎无法更改JDK和maven依赖项的顺序。

那么有没有办法以某种方式排除JavaFX或者是否有替代JSObject.getWindow来从托管网站调用一些JavaScript?

最后找到了一个解决方案(主要来自http://apache-geronimo.328035.n3.nabble.com/Maven-compiler-endorsed-libraries-tp693448p702566.html ):

  • java编译器有一个选项“endorseddirs”来覆盖引导类
  • 如果将plugin.jar放在其中一个文件夹中,它将从JavaFX覆盖JSObject
  • 在您的maven poms中,您必须告诉编译器插件要搜索哪些文件夹,您可以使用依赖项插件将依赖项/工件复制到该文件夹

编译器插件:

 maven-compiler-plugin   ${project.build.directory}/endorsed    

(如果你有plugin.jar作为maven依赖:)

  maven-dependency-plugin   copy-endorsed-dependencies generate-sources  copy-dependencies   plugin ${project.build.directory}/endorsed   ...  

另一个对我plugin.jar选择是包含plugin.jar并通过reflection调用getWindow

 public JSObject getJSObject() { try { Method m = JSObject.class.getMethod("getWindow", Applet.class); return (JSObject)m.invoke(null, Applet.this); } catch (Exception e) { // do something return null; } } 

不需要更改依赖项的顺序。

编辑:它在Eclipse中运行时工作,但在浏览器中运行时有NoSuchMethodException

但我找到了另一种选择:

包含plugin.jar ,请勿更改顺序。 然后,在类中包含此方法。

 public static JSObject getWindow(Applet applet) { if (applet != null) { AppletContext context = applet.getAppletContext(); if (context instanceof JSContext) { JSContext jsContext = (JSContext)context; JSObject jsObject = jsContext.getJSObject(); if (jsObject != null) { return jsObject; } } } throw new JSException(); }