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

时间:2014-04-23 10:29:16

标签: java maven applet

我遇到了像Not able to resolve JSObject in a java applet project这样的问题:

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

编译器插件:

<plugin>
 <artifactId>maven-compiler-plugin</artifactId>
 <configuration>
  <compilerArguments>
   <endorseddirs>${project.build.directory}/endorsed</endorseddirs>
  </compilerArguments>
 </configuration>
</plugin>

(如果您将plugin.jar作为maven依赖项:)

<plugin>
  <artifactId>maven-dependency-plugin</artifactId>
  <executions>
   <execution>
    <id>copy-endorsed-dependencies</id>
    <phase>generate-sources</phase>
    <goals>
     <goal>copy-dependencies</goal>
    </goals>
    <configuration>
     <includeArtifactIds>plugin</includeArtifactIds>
     <outputDirectory>${project.build.directory}/endorsed</outputDirectory>
    </configuration>
   </execution>
    ...
 </plugin>

答案 1 :(得分:0)

另一个对我有用的选择是包含plugin.jar并通过反思调用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();
}