【问题标题】:Programmatically create, load and run java file以编程方式创建、加载和运行 java 文件
【发布时间】: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


【解决方案1】:

我不确定是否使用 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,那应该是相同的想法。

【讨论】:

  • 感谢您的评论。我之前确实使用过 Runtime.getRuntime().exec(cmd) 。其实我还是先用它来编译Java文件。但是,使用新方法,我需要使用 JUnitCore.runClasses(...) 以编程方式运行该类。这使我可以轻松检索失败输出。特别是问题是正确加载类...
猜你喜欢
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
  • 2011-01-18
  • 2010-12-15
  • 1970-01-01
相关资源
最近更新 更多