从JDK6迁移到JDK7后,下一个代码将失败,并显示ClassNotFoundException

CompilationTask task = cSysCompiler.getTask(null, cFileManager, cDiagnosticCollector, null, null, cUnitsToCompile);
boolean mSuccess = task.call();
Analyzer mAnalyzer = new Analyzer(); // Throws ClassNotFoundException


解决:

ClassLoader mSystemClassLoader = ClassLoader.getSystemClassLoader();
mSystemClassLoader.loadClass("ft.jopc.com.JavaBytecodeObject");
mSystemClassLoader.loadClass("ft.jopc.com.analyzer.Analyzer");
mSystemClassLoader.loadClass("ft.jopc.opccl.ClassLoaderListener");
…
ompilationTask task = cSysCompiler.getTask(null, cFileManager, cDiagnosticCollector, null, null, cUnitsToCompile);
boolean mSuccess = task.call();
Analyzer mAnalyzer = new Analyzer(); // No ClassNotFoundException


有谁知道为什么在找不到task.call()类之后?看起来systemclassloader被编译任务以某种方式更改了吗?

最佳答案

最近,我们在重新定义JavaFileManager的自定义实现时遇到了类似的问题(除其他事项外)

public ClassLoader getClassLoader(final Location location)
{
    return getClass().getClassLoader();
}


不知道为什么要这样做,但是就像您的情况一样,在jdk6下可以正常工作。我们将jdk7问题精确定位到了此功能,部分原因是它在单元测试期间失败(为此,类加载器为Launcher $ AppClassLoader),但在“生产模式”(由自定义类加载器加载类)下运行良好。更改此函数以使用StandardFileManager版本,甚至将其封装在空的URLClassloader中,例如

return new URLClassLoader(new URL[]{}, getClass().getClassLoader());


解决了这个问题。

显然,它与介绍URLClassloader有关,因此与AppClassLoader有关,它在jdk7中为“ Closeable”,如下所示:

Thread [main] (Suspended (breakpoint at line 282 in URLClassLoader))
Launcher$AppClassLoader(URLClassLoader).close() line: 282 [local variables unavailable]
JavacProcessingEnvironment.close() line: 1257
JavaCompiler.initProcessAnnotations(Iterable<Processor>) line: 1004
JavaCompiler.compile(List<JavaFileObject>, List<String>, Iterable<Processor>) line: 821
Main.compile(String[], String[], Context, List<JavaFileObject>, Iterable<Processor>) line: 439
JavacTaskImpl.call() line: 132


然后,我必须承认,在这个主题上我并没有找到真正的javadoc,而是查看jdk6 DefaultFileManager以及jdk7 BaseFileManager,似乎很清楚,期望是提供一个临时文件管理器(因此需要关闭“可能”),而不是“通用”。

(无论如何,我很乐意了解有关该主题的其他/最佳实践参考)

关于java - CompilationTask.call()引入了ClassNotFoundException。在JDK6中工作,不在JDK7中工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13495625/

10-10 06:34