2013-02-25 228 views
0

我参与了一个项目,需要通过网络来运行,并有机会获得Java的编译工具和/或JavaCC的API。我的团队正在考虑使用Java applet来使其基于Web。我想知道在这种情况下applet可以做什么和不可以做什么有一定的限制。我假设,因为访问编译器将在服务器上完成,而不是在客户机上完成,所以这不会成为问题。一个小程序是否允许我们按照所描述的将它们分开?允许Javac或其他jar访问的Java Applet?

+0

该小程序将在客户端机器的上下文中运行,因此除非您有某种方式让小程序与服务器交谈,否则该小程序将要使用客户端java编译器。这引发了问题。该小程序在沙箱中运行,限制了小程序的功能。在限制列表中访问本地文件系统时显得很高,我很确定套接字连接也是如此。如果你可以控制客户端安全策略文件,那么这不太可能是一个问题 – MadProgrammer 2013-02-25 08:36:05

+0

这就是我真正想要的。 JavaFX及其标签或标签仍然需要访问编译器。所以你说applet会使用客户端的编译器。我们当然希望避免访问客户端的安全策略。那么决定在客户端机器上运行什么以及决定在服务器上运行什么?或者applet/javafx都试图在客户机上运行?我们当然需要访问编译器,以及访问用户信息的数据库。当然,有一种用户信息的方式,但是对编译器的访问似乎很棘手。 – Matt 2013-02-25 09:47:42

+0

两者都希望在客户机上运行。如果你想要一个胖客户端(使用Swing或JavaFX),他们需要在客户端上运行。尽管可以使用诸如RMI或SOAP/JSON之类的东西访问服务器上的数据,但客户端仍需要权限才能访问它。一般来说,网络部署的应用程序具有更严格的安全限制(这只是公平的),但您可以做些事情来缓解它,例如签署小程序,例如 – MadProgrammer 2013-02-25 09:55:24

回答

1

小应用程序(甚至一个JavaFX小程序)可以在这种情况下工作,如果applet是signed。小程序有许多微妙的缺陷,所以我会在提交该技术之前建议进行原型设计。请按照JavaFX deployment guide了解如何部署基于JavaFX的小程序。

我原以为编译Java,您需要有安装了完整的Java开发工具包(这将是棘手的,以确保在一个applet的部署情况)。但似乎编译API包括包含在标准的Java运行时环境的javax.tools的API中。所以这可能意味着您可以开发解决方案,包括基于客户端的部署和Java代码的编译,而不需要用户安装完整的Java开发工具包。

您可以交替不妨考虑在哪里可以在服务器上进行编译,一个客户机/服务器解决方案。这种方法的示例(使用基于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,你可能能够使用新的TextFlow控制为syntax highlighting text editor,但API是不支持公开发行的部分呢。


更新

我用这个答案勾画的战略得到了这个工作。

javaappletusingjavac

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

  1. 了解如何捕获sysout和syserr并将它们重定向到JavaFX控件。
  2. 查找Java编译器。

默认的Oracle Java运行时环境提供程序仅提供Java编译器实现的通用接口,但它本身不提供java编译器实现 - 该实现仅包含在jdk包含的tools.jar中。所以当我打包applet时,我将tools.jar包含在applet的包装中。我有一些困难得到的服务提供者接口,让我javac编译器的一个实例,所以最后,我只是用下面的行实例吧:

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

以上就是有点脆如太阳可能会改变他们私人com.sun类在任何时候 - 但至少它在这种情况下工作。

另一件事要注意的是,如果你一船的tools.jar用javac编译比你有可为你的系统运行环境更早,那么你可能会得到一些警告,比如下面:

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工具包),并且授权更加清晰。由于Java编译器接口是可插入的,因此如果tools.jar放置在类路径中,则仍然可以使用Oracle编译器。

+0

谢谢jewelsea,这有很大的帮助,正是我们正在寻找的。我正在开发使用fxml文件的JavaFX Scene Builder中的ui。我研究了使用applet/webstart的建议。我认为我们想要使用applet,因为它需要在浏览器中运行。我接下来要做的事情 - 包含.fxml文件的html代码会有点失落。我在想,如果你不介意发布一些你的解决方案,那么我可以看到整个结构,从.java文件到.html文件? – Matt 2013-02-26 08:27:04

+0

好的,我会在接下来的几天内将它作为GitHub项目发布。 – jewelsea 2013-02-26 08:44:14

+0

非常感谢,谢谢! – Matt 2013-02-27 04:28:46

1

呀小程序可以访问它们,可以是一个不错的选择。但它有非常有限/无趣的外观和魅力。在这里选择JavaFx,你可以定义你自己的StyleSheet,它会给你一个非常好的外观和感觉,是的,它绝对会分开这两个层。

JavaFx Oracle Documentation

+0

看起来这对于我来说会很棒这样做。我们正在设计的用户界面中有很多拖放功能。所以我认为JavaFX也可以基于Web? – Matt 2013-02-25 07:26:42

+0

是的,您可以在Web浏览器上运行JavaFX http://mkblog.exadel.com/2009/01/running-javafx-applications-in-a-browser/ 并且使用JavaFX,您可以拖放功能也是如此。 – asifsid88 2013-02-25 07:32:14

+0

也请阅读http://www.oracle.com/technetwork/java/javafx/overview/faq-1446554.html – asifsid88 2013-02-25 07:32:29

相关问题