能否用Java 17编译器编译调用JSObject.getWindow()的Java Applet?
关于Java 17编译Applet时JSObject.getWindow()方法缺失的问题
背景说明
- Applet已不再被官方支持,遗留代码可通过IE11/Edge兼容模式或Webswing在任意浏览器运行
- 我的Applet依赖
netscape.javascript.JSObject实现与页面JavaScript的实时交互 - Java 11可正常编译该代码,但Java 17中
JSObject.getWindow()方法已被移除,编译时会报错
示例Applet代码
package your.package.name; import javax.swing.JApplet; public class SimpleApplet extends JApplet { private static final long serialVersionUID = 1L; public void init() { System.out.println("SimpleApplet.init()"); netscape.javascript.JSObject win = netscape.javascript.JSObject.getWindow(this); } public void start() { System.out.println("SimpleApplet.start()"); } public void destroy() { System.out.println("SimpleApplet.destroy()"); } }
编译命令与报错信息
编译命令
"C:\Program Files\Java\jdk-17\bin\javac.exe" "C:\Users\userId\your\package\name\SimpleApplet.java"
报错输出
SimpleApplet.java:5: warning: [removal] JApplet in javax.swing has been deprecated and marked for removal public class SimpleApplet extends JApplet { ^ SimpleApplet.java:10: error: cannot find symbol netscape.javascript.JSObject win = netscape.javascript.JSObject.getWindow(this); ^ symbol: method getWindow(SimpleApplet) location: class JSObject 1 error 1 warning
已尝试的解决方法
将jaws.jar(与plugin.jar基本一致)加入类路径编译,命令如下:
"C:\Program Files\Java\jdk-17\bin\javac.exe" -cp "C:\Users\userId\jaws.jar" "C:\Users\userId\your\package\name\SimpleApplet.java"
但得到完全相同的错误,编译器似乎没有读取jaws.jar中的类实现。
补充信息
在Eclipse中,只要将jaws.jar置于Java 17类库之前(通过项目属性->Java构建路径->顺序与导出选项卡调整顺序),测试Applet不会报错;若调换顺序则会标记getWindow()为错误,因此推测javac也应该能实现类似的优先级调整效果。
问题
能否用Java 17编译该Applet?有没有办法强制编译器使用jaws.jar中的netscape.javascript.JSObject实现?
内容的提问来源于stack exchange,提问作者ForceRs
相关产品推荐
相关产品推荐

