我參與了一個項目,需要通過網絡來運行,並有機會獲得Java的編譯工具和/或JavaCC的API。我的團隊正在考慮使用Java applet來使其基於Web。我想知道在這種情況下applet可以做什麼和不可以做什麼有一定的限制。我假設,因爲訪問編譯器將在服務器上完成,而不是在客戶機上完成,所以這不會成爲問題。一個小程序是否允許我們按照所描述的將它們分開?允許Javac或其他jar訪問的Java Applet?
回答
小應用程序(甚至一個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是不支持公開發行的部分呢。
更新
我用這個答案勾畫的戰略得到了這個工作。
的圖像是允許訪問作爲一個applet或Webstart的應用給客戶機代碼編輯器的HTML頁面。圖像的頂部區域是基於WebEngine的代碼編輯區域,其中嵌入的語法高亮顯示支持Java編輯的CodeMirror JavaScript編輯器。圖像的底部區域是在客戶端機器上本地編輯編輯器中的代碼並隨後運行它的輸出。輸出包括任何編譯錯誤,任何輸出到sysout的程序輸出以及打印到syserr的任何運行時異常。該解決方案的棘手部分是:
- 瞭解如何捕獲sysout和syserr並將它們重定向到JavaFX控件。
- 查找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編譯器。
謝謝jewelsea,這有很大的幫助,正是我們正在尋找的。我正在開發使用fxml文件的JavaFX Scene Builder中的ui。我研究了使用applet/webstart的建議。我認爲我們想要使用applet,因爲它需要在瀏覽器中運行。我接下來要做的事情 - 包含.fxml文件的html代碼會有點失落。我在想,如果你不介意發佈一些你的解決方案,那麼我可以看到整個結構,從.java文件到.html文件? – Matt 2013-02-26 08:27:04
好的,我會在接下來的幾天內將它作爲GitHub項目發佈。 – jewelsea 2013-02-26 08:44:14
非常感謝,謝謝! – Matt 2013-02-27 04:28:46
呀小程序可以訪問它們,可以是一個不錯的選擇。但它有非常有限/無趣的外觀和魅力。在這裏選擇JavaFx,你可以定義你自己的StyleSheet,它會給你一個非常好的外觀和感覺,是的,它絕對會分開這兩個層。
看起來這對於我來說會很棒這樣做。我們正在設計的用戶界面中有很多拖放功能。所以我認爲JavaFX也可以基於Web? – Matt 2013-02-25 07:26:42
是的,您可以在Web瀏覽器上運行JavaFX http://mkblog.exadel.com/2009/01/running-javafx-applications-in-a-browser/ 並且使用JavaFX,您可以拖放功能也是如此。 – asifsid88 2013-02-25 07:32:14
也請閱讀http://www.oracle.com/technetwork/java/javafx/overview/faq-1446554.html – asifsid88 2013-02-25 07:32:29
- 1. 爲什麼try-catch不允許java applet中的其他元素出現?
- 2. 在Java applet中包含Javac
- 3. Apache不允許從網絡上的其他設備訪問
- 4. 允許用戶訪問couchdb中的其他用戶數據
- 5. Jailshell上的cPanel - 允許訪問其他文件夾
- 6. iOS 8:「允許完全訪問」是否允許開發人員訪問其他鍵盤的擊鍵?
- 7. 爲什麼SSRS允許訪問一些時間,但不允許其他人訪問?
- 8. Laravel - 不允許用戶訪問其他用戶數據
- 9. sitecore - 允許訪問sitemap.xml,同時禁止其他xml文件
- 10. 使用GIT第一次:允許其他用戶訪問項目
- 11. 有沒有辦法在java中使用package-private來允許其他包訪問?
- 12. 運行java applet的調用方法(來自java,C++或其他)
- 13. htaccess - 拒絕訪問某些網址,但允許其他人訪問
- 14. 允許訪問組件文件或根
- 15. 訪問其他Java進程
- 16. Java WindowBuilder - >導出爲.jar(Runnable或Applet)
- 17. 訪問控制 - 允許來源不允許訪問控制 - 允許來源
- 18. 哪個Java訪問修飾符允許成員只能被其他包中的子類訪問?
- 19. 訪問控制 - 允許來源不允許訪問源URL
- 20. 訪問 - 控制 - 允許來源不允許訪問 - >來源*
- 21. 訪問控制 - 允許來源不允許訪問http:// localhost
- 22. 訪問控制 - 允許來源不允許訪問原因
- 23. 允許訪問的目錄
- 24. JAR文件中的Java Applet
- 25. 使用JAR的Java applet?
- 26. 將Java applet轉換爲Jar的問題。也許圖像加載問題
- 27. 如何殺死或停止java applet中的其他線程
- 28. MySQL訪問 - 允許遠程訪問或通過PHP?
- 29. Git - 允許寫入訪問
- 30. 允許遠程訪問Elasticsearch
該小程序將在客戶端機器的上下文中運行,因此除非您有某種方式讓小程序與服務器交談,否則該小程序將要使用客戶端java編譯器。這引發了問題。該小程序在沙箱中運行,限制了小程序的功能。在限制列表中訪問本地文件系統時顯得很高,我很確定套接字連接也是如此。如果你可以控制客戶端安全策略文件,那麼這不太可能是一個問題 – MadProgrammer 2013-02-25 08:36:05
這就是我真正想要的。 JavaFX及其標籤或
兩者都希望在客戶機上運行。如果你想要一個胖客戶端(使用Swing或JavaFX),他們需要在客戶端上運行。儘管可以使用諸如RMI或SOAP/JSON之類的東西訪問服務器上的數據,但客戶端仍需要權限才能訪問它。一般來說,網絡部署的應用程序具有更嚴格的安全限制(這只是公平的),但您可以做些事情來緩解它,例如簽署小程序,例如 – MadProgrammer 2013-02-25 09:55:24