你能从java程序中运行一个java类吗?

时间:2015-03-18 02:06:24

标签: java batch-file

我一直在创建一个编写和运行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");
}
}

4 个答案:

答案 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.batclasses\application\Main.classclasses\application\Runable.class之类的内容。希望它有所帮助。