以编程方式创建,加载和运行java文件

时间:2017-03-20 18:01:32

标签: java class junit classloader javac

目前我有一个名为TestSuite.java的现有JUnit测试套件。

然后我使用BufferedWriter并生成一个名为TestSuiteMinimized.java的新Java文件。

然后,我使用一个运行带有必要类路径的javac命令的进程以编程方式编译该文件。

现在的问题是我似乎无法运行这个新创建的Java文件。

private static Map<String, String> runJavaFile(String filePath) {
    Class<?> test;
    try {
        test = Class.forName(getClassName(filePath), true, ClassLoader.getSystemClassLoader());
    } catch (ClassNotFoundException e) {
        System.err.println("Class not found in file: " + filePath);
        e.printStackTrace();
        System.exit(1);
        return null;
    }

    // Map from method name to failure trace.
    Map<String, String> runResultMap = new HashMap<String, String>();

    Result result = JUnitCore.runClasses(test);
    for (Failure failure : result.getFailures()) {
        runResultMap.put(failure.getDescription().getMethodName(), removeLineNumbersFromTrace(failure.getTrace()));
    }
    return runResultMap;
}

当我第一次运行仅存在TestSuite.java并且尚未创建TestSuiteMinimized.java的程序时,我得到一个ClassNotFoundException:

Class not found in file: C:\Users\Wayway\workspace\Project1\src\TestSuiteMinimized.java
java.lang.ClassNotFoundException: TestSuiteMinimized
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at Project1.runJavaFile(Project1.java:739)
    at Project1.mainMinimize(Project1.java:176)
    at Project1.main(Project1.java:105)

但是,如果我在编写和编译TestSuiteMinimized.java后再次运行该程序,则会加载并且ClassNotFoundException消失。但是,我在多次迭代中写入TestSuiteMinimized.java,看起来新版本的TestSuiteMinimized.java没有运行。相反,只加载了第一个版本的TestSuiteMinimized.java。

这似乎是一个ClassLoader问题,但上面的Class.forname(...)方法似乎没有加载该类。

什么是正确的方法?谢谢!

1 个答案:

答案 0 :(得分:0)

我不确定使用JUnit,但我发现这样做的最简单方法是导出您尝试作为可执行JAR文件运行的类,并通过命令行执行它,如下所示:

String cmd = "java - jar NAME OF YOUR PROGRAM.JAR";
try {
            //Execute the command
            Runtime.getRuntime().exec(cmd);
            counter++;
        } catch (IOException e) {
            e.printStackTrace();
        }

您调用的程序需要与调用它的程序位于同一目录中,或者它需要是您尝试运行的jar文件路径。

就像我说的那样,我不确定运行JUnit文件,但是如果你可以将它们导出为可执行的jar,那么它应该是同样的想法。