使用 JDK 1.8 java 编译:无法访问 class 文件... class 未找到文件

Compiling with JDK 1.8 java: cannot access class file... class file not found

虽然相同的代码在 JDK 1.6 版本中编译成功,但在升级到 JDK 1.8 后它无法编译,说 java cannot access ....class file ...as class file not found though it exists

我正在 IntelliJ Idea 13 IDE 中编译它,同时尝试使用重建选项和配置的 ANT 构建 - 结果相同。

非常感谢任何帮助。

cannot access IDispatchRequest
class file for com.abc.xyz.orchestrator.dispatch.IDispatchRequest not found
1 error


Compile failed; see the compiler error output for details.
    at org.apache.tools.ant.taskdefs.Javac.compile(Javac.java:1079)
    at org.apache.tools.ant.taskdefs.Javac.execute(Javac.java:882)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:357)
    at org.apache.tools.ant.Target.performTasks(Target.java:385)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1337)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1306)
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
    at org.apache.tools.ant.Project.executeTargets(Project.java:1189)
    at org.apache.tools.ant.Main.runBuild(Main.java:758)
    at org.apache.tools.ant.Main.startAnt(Main.java:217)
    at org.apache.tools.ant.Main.start(Main.java:179)
    at org.apache.tools.ant.Main.main(Main.java:268)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.ant.execution.AntMain2.main(AntMain2.java:30)

此问题现已解决:)。它基本上与 class 路径设置有关,仅适用于 JDK 1.8。

例如:如果 class 'A' 引用了 class B 并且 class B 正在实现一个接口 say 'C' 那么 javac in JDK 1.8 在 class 路径上同时需要 class B 和接口 C,而在 1.8 之前,在 class 路径上只有 class B 就足够了。

更多信息请参考https://bugs.openjdk.java.net/browse/JDK-8055048

我在执行一个返回 class 的函数时遇到了这个问题,而我在 class 路径中没有,但我只是想访问他的内部字段。 例如: container.getContent().getField() 我必须导入内容 class 才能使其正常工作。

你可以使用gradle来解决这个问题。

添加"transitive = true"到依赖项。就像这样:

    compile('com.***.android:***sdk:1.0.2.6@aar') {
        transitive = true
    }

构建 -> 重建项目对我有用

对我来说,这意味着我下载了一个我认为已损坏的 jar。 Nuke ~/.m2/repository 然后重试...

对我来说,无法访问的 class 位于外部 JAR 中。 该场景适合此处接受的答案。

我通过将 JAR 作为依赖项添加到引发错误的模块来解决我的问题。 这意味着如果错误是从 class A 抛出的,并且未访问 class C,我将包含 class C 的 JAR 作为依赖项添加到包含 pom.xml 的模块中15=] A.