我一直在创建一个编写和运行java类的程序。到目前为止,我已经能够编写一个" Runable.java"类但无法运行它。我试过运行一个" runjava.bat"并获取.bat来运行" Runable.java"但是我一直得到一个" 错误:无法找到或加载主类application.Runable.class "。我想知道我做错了什么,或者是否有更好的方法从java程序中运行java类?
这是我的代码(稍微简化):
Main.java:
package application;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Platform;
import javafx.stage.FileChooser;
public class Main {
final static String Program =
"package application;\n"
+ "public class Runable {\n"
+ "public static void main(String[] args) {\n"
+ "System.out.println(\"Hello\");\n"
+ "}\n"
+ "}\n";
public static void main(String[] args) throws IOException {
Scanner s = new Scanner(System.in);
while(true){
System.out.println("State a comand.");
String Command = s.nextLine();
if (Command.equalsIgnoreCase("Write") || Command.equalsIgnoreCase("Save")){
FileChooser fileChooser = new FileChooser();
//Set extension filter
FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("TXT files (*.txt)", "*.txt");
fileChooser.getExtensionFilters().add(extFilter);
//Show save file dialog
File file = new File("src/application/Runable.class");
if(file != null){
SaveFile(Program, file);
}
}
else if (Command.equalsIgnoreCase("Run") || Command.equalsIgnoreCase("Play")){
ProcessBuilder builder = new ProcessBuilder(
"src/runjava.bat");
builder.redirectErrorStream(true);
Process p = builder.start();
BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while (true) {
line = r.readLine();
if (line == null) { break; }
System.out.println(line);
}
}
else if (Command.equalsIgnoreCase("End") || Command.equalsIgnoreCase("Exit")){
Platform.exit();
}
else{
System.err.println("Command not recognized.");
System.err.println("Please try again.");
}
}
}
private static void SaveFile(String content, File file){
try {
FileWriter fileWriter = null;
fileWriter = new FileWriter(file);
fileWriter.write(content);
fileWriter.close();
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
runjava.bat:
javac "src\application\Runable.java"
java application.Runable.class
和 Runable.java ,如果你没有从Main.java中获取它:
package application;
public class Runable {
public static void main(String[] args) {
System.out.println("Hello");
}
}
答案 0 :(得分:2)
java
命令需要一个类名,而不是文件名。除非你的类在“application.Runable”包中被称为“class”(它不是),你可能想要使用:
java application.Runable
答案 1 :(得分:1)
因为你不能像那样执行.java文件。您必须首先编译它以获取.class文件,并将执行该类的代码更改为指向Runable.class
它未运行的原因是因为.java文件是您键入的代码,而.class文件是Java虚拟机执行的代码的编译版本。
答案 2 :(得分:1)
与执行.bat文件相比,编译和运行程序的另一个解决方案是使用javax.tools API或基于它的其他库。我找到了InMemoryJavaCompiler库,可以很容易地编译和运行程序。这种方法意味着程序将在与UI相同的JVM上运行,这可能会有所帮助。
以下代码显示了如何使用库调用程序。
try{
Class<?> clazz = InMemoryJavaCompiler.compile("apllication.Runable", Program);
clazz.getMethod("main", String[].class).invoke(null, new String[0]);
}catch(Exception e){
e.printStackTrace();
}
答案 3 :(得分:1)
在Main.java
的“运行”区块中,您应该
ProcessBuilder builder = new ProcessBuilder("runjava.bat");
在你的runjava.bat
中,你应该(如immibis所说)
javac -d . src/application/Runable.java
java application.Runable
**不是第二行的Runable.class。
并且runjava.bat
应与application\
的父文件夹并行放置,而不是src\application
文件夹。换句话说,您应该拥有classes\runjava.bat
,classes\application\Main.class
和classes\application\Runable.class
之类的内容。希望它有所帮助。