我的目的是要求用户在TextArea中写下一些代码,然后查看该代码是否编译,如果是,则将结果打印到另一个TextArea,它就像一个控制台。
编辑:通过在线编译器解决这个问题是首要任务。
为了做到这一点,我尝试使用在线编译器(即compilerjava.net)并使用了库HtmlUnit,但是库中出现了很多错误,特别是在阅读JavaScript代码并返回我的页面时'警告'这增加了编译和运行时间约20秒。如果有人试图修复它,我会留下下面的代码并附上解释。
我也尝试使用JavaCompiler接口,该接口确实成功编译,但在我提供.java文件的确切位置的条件下,这是我必须使用我获得的信息创建的来自TextArea。再一次,死路一条。
我决定回到在线编译器,因为如果我能设法从编译的程序中返回数据,我就设置了。唯一的问题是我还没有找到一个允许用户通过Java代码访问其字段的在线编译器(因为它太具体了)。如果有人能提供从在线编译器发送和检索数据的方法,我将不胜感激。
以下是在网站' compilerjava.net'上使用HtmlUnit库的代码。它离工作非常接近,我只有两个问题就是,
1)运行时间过长。
2)我无法访问代码的控制台输出。推理是,当你点击“编译”时,输出文本区域的文本变成"执行"。几秒钟后,它变成代码的输出。当我尝试访问它时,我检索的数据总是"执行"而不是所需的输出。这是代码;
public class Test {
public static void main(String[] args) {
try {
// Prevents the program to print thousands of warning codes.
java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(java.util.logging.Level.OFF);
java.util.logging.Logger.getLogger("org.apache.http").setLevel(java.util.logging.Level.OFF);
// Initializes the web client and yet again stops some warning codes.
WebClient webClient = new WebClient( BrowserVersion.CHROME);
webClient.getOptions().setThrowExceptionOnFailingStatusCode( false);
webClient.getOptions().setThrowExceptionOnScriptError( false);
webClient.getOptions().setJavaScriptEnabled( true);
webClient.getOptions().setCssEnabled( true);
// Gets the html page, which is the online compiler I'm using.
HtmlPage page = webClient.getPage("https://www.compilejava.net/");
// Succesfully finds the form which has the required buttons etc.
List<HtmlForm> forms = page.getForms();
HtmlForm form = forms.get( 0);
// Finds the textarea which will hold the code.
HtmlTextArea textArea = form.getTextAreaByName( "code");
// Finds the textarea which will hold the result of the compilation.
HtmlTextArea resultArea = page.getHtmlElementById( "execsout");
// Finds the compile button.
HtmlButtonInput button = form.getInputByName( "compile");
System.out.println( button.getValueAttribute());
// Simple code to run.
textArea.setText( "public class HelloWorld\n" +
"{\n" +
" // arguments are passed using the text field below this editor\n" +
" public static void main(String[] args)\n" +
" {\n" +
" System.out.print( \"Hello\");\n" +
" }\n" +
"}");
// Compiles.
button.click();
// Result of the compilation.
System.out.println( resultArea.getText());
} catch ( Exception e) {
e.printStackTrace();
}
}
}
正如我所说,最终代码System.out.println( resultArea.getText());
打印出&#34;执行&#34;,这意味着我已成功通过代码按下网页上的编译按钮。
所以在这长篇文章之后,我要么找一种方法来修复我提供的代码,这是非常接近我的答案但不完全,或者只是一个完全不同的解决问题的方法我在开头提出。
P.S。 Maven是最后的希望。