Java Applet允许Javac或其他jar访问?

时间:2013-02-25 07:08:07

标签: java javafx compiler-construction applet client

我参与了一个需要通过web运行的项目,并且可以访问java的编译器工具和/或javacc api。我的团队正在考虑使用Java applet使其基于Web。我想知道applet在这种情况下能做什么和不能做什么都有一些限制。我认为,由于访问编译器将在服务器上完成,而不是客户端的机器,这不会是一个问题。 applet是否允许我们按照描述将两者分开?

2 个答案:

答案 0 :(得分:1)

是的applet可以访问它们,可以是一个不错的选择。但它的外观非常有限/枯燥乏味。在这里使用JavaFx你可以定义自己的StyleSheet,这样它会给你一个非常好的外观和感觉,是的,它肯定会将这两个层分开。

JavaFx Oracle Documentation

答案 1 :(得分:1)

如果applet是signed,applet(甚至是JavaFX applet)可以在这种情况下工作。小程序存在许多微妙的陷阱,因此在提交该技术之前,我会建议原型设计。按照JavaFX deployment guide查看如何部署基于JavaFX的小程序。

我原本以为要编译Java,你需要安装完整的Java Development Kit(在applet部署情况下确保这一点很棘手)。但似乎编译API包含在标准Java Runtime Environment附带的javax.tools API中。因此,这可能意味着您可以开发解决方案,包括基于客户端的部署和Java代码的编译,而无需用户安装完整的Java Development Kit。

您可以选择考虑可以在服务器上执行编译的客户端/服务器解决方案。这种方法的一个例子(使用基于Java WebStart的解决方案)是TopCoder Algorithm Competition Application。这是运行此应用程序的jnlp文件(http://apps.topcoder.com/wiki/display/tc/The+Algorithm+Competition+Arena)。我建议您使用该应用程序在TopCoder注册一个ID,并尝试使用它编写和编译一些代码。 TopCoder实现使用普通的Swing,因为它是在JavaFX存在之前编写的,但如果您愿意,可以同样使用JavaFX进行实现。

如果您还需要一个编辑器(具有语法识别文本样式)来编译您将要编译的代码,您可以使用嵌入在JavaFX中的基于CodeMirror的编辑器。基于CodeMirror的解决方案将编辑器包装在基于html的WebView控件中。对于JavaFX 8,您可能可以使用syntax highlighting text editor的新TextFlow控件,但该API尚未支持公开发布。


<强>更新

我使用本答案中概述的策略来完成这项工作。

javaappletusingjavac

该图像是一个html页面,允许作为applet或webstart应用程序访问客户端代码编辑器。图像的顶部区域是代码编辑区域,该区域基于WebEngine,其嵌入式语法突出显示支持Java编辑的CodeMirror JavaScript编辑器。图像的底部区域是在客户端计算机上本地编译编辑器中的代码并随后运行它的输出。任何编译错误的输出结果,输出到sysout的任何程序,以及打印到syserr的任何运行时异常。解决方案的棘手部分是:

  1. 了解如何捕获sysout和syserr并将它们重定向到JavaFX控件。
  2. 查找Java编译器。
  3. 默认的Oracle Java运行时环境提供程序仅提供Java编译器实现的通用接口,但它本身不提供Java编译器实现 - 该实现仅包含在jdk附带的tools.jar中。因此,当我打包我的applet时,我将tools.jar包含在applet的包装中。我在获取服务提供程序接口以获取javac编译器的实例时遇到了一些困难,所以最后我只是使用以下行实例化它:

    JavaCompiler compiler = new com.sun.tools.javac.api.JavacTool();
    

    上面有点脆弱,因为太阳可能随时改变他们的私人com.sun课程 - 但至少它在这种情况下起作用。

    另一件需要注意的事情是,如果您使用比您的系统可用的运行时环境更早的javac编译器发布tools.jar,那么您可能会收到一些警告,如下所示:

    warning: C:\Program Files\Java\jre8\lib\rt.jar(java/lang/Object.class): major version 52 is newer than 51, the highest major version supported by this compiler.
      It is recommended that the compiler be upgraded.
    

    出现上述警告是因为我发布了带有java 7 tools.jar的applet并使用java 8运行时运行applet(请注意,无论这些警告如何,applet都能正常工作)。

    <强>更新

    我将此解决方案的代码放在github repository (project name conception)中。更新的解决方案使用Eclipse Compiler for Java而不是Oracle Java编译器。主要是因为,对于Eclipse编译器,它是一个单独的jar(只有1.8meg而不是oracle发行版的14meg工具jar),许可更加清晰。由于Java编译器接口是可插拔的,因此如果将tools.jar放在类路径上,仍然可以使用Oracle编译器。