Java 类路径上的类文件的ClassNotFoundException

Java 类路径上的类文件的ClassNotFoundException,java,classpath,Java,Classpath,我有以下代码: // Test TODO remove try { System.out.println(System.getProperties().getProperty("java.class.path")); this.getClass().getClassLoader().loadClass("mypackage.MyClass"); } catch (ClassNotFoundException e) { //

我有以下代码:

    // Test TODO remove
    try {
        System.out.println(System.getProperties().getProperty("java.class.path"));
        this.getClass().getClassLoader().loadClass("mypackage.MyClass");
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
现在,输出显示该类位于类路径上,即:

/...some/path.../workspace/project/target/test-classes:/rest/of/the/classpath
java.lang.ClassNotFoundException: mypackage.MyClass
        ...here be stacktrace...
我还确保类文件acutaly位于给定位置,即此文件存在:

/...some/path.../workspace/project/target/test-classes/mypackage/MyClass.class

也许以下几点很重要:显示的代码是在连接到jUnit测试的javaagent中执行的,我以编程方式启动它(通过Runtime.execute(…)-因此,可能会有一些不明显的东西在后台出错。。。但是仍然:如果类路径包含包含类的文件夹,为什么它不能被加载?

您假设如果目标字节码保留在类路径上,则当前类的类加载器可以加载相应的类。但是,如果当前类是由棘手的/有缺陷的类装入器装入的,则情况并非如此

我建议做以下几点:

  • 检查使用的类加载器:

    System.out.println(this.getClass().getClassLoader());
    System.out.println(ClassLoader.getSystemClassLoader() == this.getClass().getClassLoader());
    this.getClass().getClassLoader().loadClass("mypackage.MyClass");
    
  • 提供说明问题的最小但完整的可复制测试用例


  • Java代理在启动JVM的早期加载(出于明显的原因),并且有自己的“类路径”,因此它实际上不是由(历史上命名的)系统类加载器加载的。这就是为什么命令行参数中有一个“jarpath”


    因此,您将需要类似于
    System.getSystemClassLoader
    URLClassLoader.newInstance
    (使用
    java.class.path
    )或
    Thread.getContextClassLoader
    ,具体取决于您的情况。

    对于所有感兴趣的人: 我不知道问题出在哪里

    我稍微修改了一下,结果发现Runtime.exec(…)执行的命令字符串如果在shell中执行,效果很好

    我做了更多的修改,但最终放弃了寻找“真正”的原因。而不是

    Runtime rt = Runtime.getRuntime();
    Process proc = rt.exec(command);
    
    我现在使用apache exec:

    CommandLine commandLine = CommandLine.parse(command);
    DefaultExecutor executor = new DefaultExecutor();
    int exitValue = executor.execute(commandLine);
    

    使用完全相同的命令字符串,它突然工作了

    你好!!谢谢你的想法,输出:sun.misc.Launcher$AppClassLoader@24480457true和一个ClassLoader.getSystemClassLoader().loadClass(“mypackage.MyClass”);也没用。。。不过还是谢谢你。如果没有其他帮助,我将不得不选择测试用例。。。由于我的努力,我避免了这一点。这在直觉上和瞬间都是有意义的!已经谢谢了,我会调查这个方向并陈述结果。。。