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”);也没用。。。不过还是谢谢你。如果没有其他帮助,我将不得不选择测试用例。。。由于我的努力,我避免了这一点。这在直觉上和瞬间都是有意义的!已经谢谢了,我会调查这个方向并陈述结果。。。