通过 URL 数据嵌入 Java 小程序

Posted

技术标签:

【中文标题】通过 URL 数据嵌入 Java 小程序【英文标题】:Embed Java applet through URL data 【发布时间】:2012-09-09 14:49:57 【问题描述】:

我正在尝试探索嵌入 html Java 小程序的 URL 数据功能。

文档,用于实例化 java 小程序 1 的 HTML 标记,不排除此选项,但我似乎无法做到这一点。

我使用(对象和小程序)有不同的 HTML 标记值变体,我认为接近我的目标的是:

<object type="application/x-java-applet"  >
  <param name="archive" value="data:application/java-archive;base64,BASE64_OF_JAR"/>
  <param name="code" value="test.class"/>
  <h1>not working</h1>
</object>

此变体导致带有文本“名称”的 IlegalArgumentException。我点击浏览器上的错误图标来检查这个。在 Java 控制台上,整个堆栈跟踪是:

java.net.MalformedURLException: unknown protocol: data
        at java.net.URL.<init>(Unknown Source)
        at java.net.URL.<init>(Unknown Source)
        at sun.plugin.util.ProgressMonitorAdapter.setProgressFilter(Unknown Source)
        at sun.plugin2.applet.Plugin2Manager.setupProgress(Unknown Source)
        at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)

有没有人知道如何做到这一点,或者如果不可能做到这一点?

PS:Oracle here有一个如何在 HTML 中嵌入 JNLP 的示例

【问题讨论】:

不得不承认前几天我没有仔细阅读这篇文章,错过了最后一个链接。有趣的是,JNLP 可以使用 base 64 编码.. 如果将data:application/java-archivedata:application/x-java-archive 交换会发生什么? 同样的例外。插件处理程序似乎无法识别 DATA URL,如果能看到插件的源代码就好了 :) 完整的例外:pastebin.com/ddsDSTQg 您可以将堆栈跟踪编辑到问题中吗?还要使用代码格式。顺便说一句 - 我试图在这里设置一个本地测试,结果是this question。大闹天宫! ;) 好吧,您现在已经了解到“不排除”并不意味着“包含”:P 【参考方案1】:

OBJECT 元素的HTML4 specification 允许通过URL DATA 嵌入内联数据,Oracle 的Applet 实例化documentation 也允许这样做。执行的测试显示 Java 浏览器插件(来自 Oracle),以及来自 Java SE 6 的可用源代码,表明实现不支持它。

在这种情况下,浏览器是否支持似乎并不重要,因为 Object/Applet HTML 元素中资源引用的资源处理由浏览器插件执行。

另一种方法是使用小程序反序列化,通过 URL DATA 序列化,使用 APPLET element 的 OBJECT 属性。正如 HTML4 规范中提到的,没有对 APPLET 和 OBJECT 属性的积极支持,而且 JRE 似乎也不支持从 URL DATA 反序列化对象。

简而言之,JRE 不支持 CODE、OBJECT 和 ARCHIVE HTML 属性中的 base64 反序列化。

还有一个关于 JRE1.4.1 中的 URL DATA 支持的 BUG 未实现 Bug ID: 4756961。

我在 64 位 Windows 机器上使用 JRE7 的测试结果如下:

通过 URL DATA 将 JAR 传递给 ARCHIVE 属性会导致 Applet2Manager.loadJarFiles() 中出现 IllegalArgumentException; 通过 URL DATA 将类传递给 CODE 属性会导致 Applet2ClassLoader.findClass() 中出现 ClassNotFoundException; 通过 URL DATA 将序列化小程序传递给 OBJECT 属性会导致 Plugin2ClassLoader.getResourceAsResource() 中出现 FileNotFoundException。

【讨论】:

优秀的答案,通过有用的链接进行了深入研究。希望我能多次投票。【参考方案2】:

即使 HTML 标准允许,JRE 通常也不理解 base64 编码数据。

【讨论】:

以上是关于通过 URL 数据嵌入 Java 小程序的主要内容,如果未能解决你的问题,请参考以下文章

我想把我的java小程序中嵌入一个背景音乐,写出添加背景音乐代码。

嵌入式 Java Web 小程序的 Microsoft 版本是啥?

使用嵌入在 html 页面中的小程序与数据库通信

嵌入在 HTML 中的 Java Applet 导致 InvocationTargetException

占用空间小的嵌入式 Java SQL 数据库

微信小程序页面之间传参