【发布时间】:2017-08-12 03:45:18
【问题描述】:
目前我有一个名为 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(...) 的方法似乎没有加载类。
什么是正确的方法?谢谢!
【问题讨论】:
-
您正试图从另一个 Java 程序运行一个 Java 程序,这是正确的吗?
-
是的,具体来说,它是一个在我的 Java 程序中运行的 JUnit 测试套件。
标签: java class junit classloader javac