GradlecompileJava 无法从源文件中找到符号

问题描述 投票:0回答:8

我是 Gradle 新手,所以我可能在这里遗漏了一些明显的东西。我正在研究使用 Gradle 来自动构建我们的项目。我已经解决了其中的大部分问题,但其中一个给我带来了无尽的麻烦。由于这是为我的公司提供的,因此我无法分享任何真实的代码,但我会尽力提供真实的伪代码。

我正在尝试编译一个具有 Flex 前端和 Java 后端的 Web 应用程序。现在,我只专注于创建一个包含 java 的 .war 文件,然后我将进入 Flex 编译。当我运行以下 build.gradle 脚本时,它给了我无数“找不到符号”错误。

apply plugin: 'eclipse'
apply plugin: 'war'

sourceCompatibility = 1.6

repositories {
   mavenCentral()
}

sourceSets.main.java.srcDir 'src'
sourceSets.main.resources.srcDir 'src'

webAppDirName = "WebContent"

war.archiveName "Gradle_test.war"

dependencies {
    compile fileTree(dir: 'WebContent/WEB-INF/lib', include: '*.jar')
    providedCompile 'org.apache.tomcat:catalina:6.0.13'
    providedCompile 'org.apache.tomcat:dbcp:6.0.13'
}

发生的错误示例(使用假包和类名):

/Users/user/Documents/eclipse/ProjectName/src/com/companyName/teamName/projectName/core/release/subProjectName/projectVersion/RenamedObject.java:385: cannot find symbol
symbol  : class OtherObject
location: class com.companyName.teamName.projectName.core.release.subProjectName.projectVersion.RenamedObject
    public class InnerClass extends OtherObject implements Indexable<String>, Serializable {

InnerClass 类与 RenamedObject 类一起在 RenamedObject.java 文件中声明。它找不到的符号 OtherObject 不是来自 .jar。它是存储在

/Users/user/Documents/eclipse/ProjectName/src/com/companyName/teamName/projectName/core/release/subProjectName/projectVersion/superTypes/OtherObject.java
的源文件。该对象在 RenamedObject.java 的顶部导入,无需任何特殊设置即可通过 eclipse 正确构建和运行。从终端执行
gradle war
后,在 :compileJava 任务期间发生这些错误。

Gradle 在处理来自这样的子包的源导入时是否存在任何问题?我只是做错了什么吗?如果有更多信息可以提供帮助,请告诉我,如果可以的话我会提供。

编辑:我让它工作了。所有 130 个错误均通过一项更改得到解决。如果我将完全限定的包名称添加到扩展中的OtherObject,那么它看起来像这样:

public class InnerClass extends com.companyName.teamName.projectName.core.release.subProjectName.projectVersion.superTypes.OtherObject implements Indexable<String>, Serializable {

这一更改使一切正常,但我仍然不明白原因。这不是项目中对 OtherObject 的唯一引用,也不是内部类扩展另一个源包中定义的类的唯一位置。

java eclipse gradle war
8个回答
11
投票

症状

无法使用 Gradle 发行版 'https://services.gradle.org/distributions/gradle-2.8-bin.zip'

执行构建

………………

原因: org.gradle.api.internal.tasks.compile.CompilationFailedException: 编译失败;有关详细信息,请参阅编译器错误输出。

您应该检查编译器 Java 输出的 Gradle 构建报告。

检查输出并查看它在输出中引用了无法解析的类名。

symbol:  class <referenced_classname_here
location: class <parent_classname_here

解决方案

无论您在何处引用未解析的符号提到的类,都请提供完全限定的域名。

就我而言,当我定义一个内部类时,我看到了这一点,它扩展了我在 build.gradle 中声明为依赖项的库中的类。

附言:

我已经看到这个问题的解决方案已经被提到了 对OP的问题发表评论。

我找不到这个问题 因为它没有适合谷歌的关键字,而且也没有 接受的解决方案进一步降低了其知名度。

这样做的结果是浪费了一整天的时间,在我意识到这个愚蠢的黑客解决方案之前拔掉了几缕头发:( :(

我已经尝试了与依赖解析远程相关的所有方法来解决这个“依赖问题”,这对我的代码库来说从来都不是问题。

希望 Gradle 团队尽快修复此问题 在更多人拔头发之前。

顺便说一句...我喜欢 Gradle。 :)


1
投票

只是添加到知识库,但我遇到了同样类型的问题:

public static class GetNetworkInterfacesCallable implements java.util.concurrent.Callable<java.util.Set<java.net.InetAddress>> {
    public GetNetworkInterfacesCallable(String networkPrefix) {
        this.networkPrefix=networkPrefix;
    }
    @Override public Set<InetAddress> call() throws Exception {
        Thread.currentThread().setName(getClass().getName());
        return null; //myInetAddresses(networkPrefix);
    }
    final String networkPrefix;
}

使用 gradle 2.9 和 2.10。


1
投票

我今天也遇到了同样的问题。 如果您正在使用 gradle,请确保您的类位于 src/main/java 而不是 src/test/java 中,否则您的 IDE(例如 Eclipse)会说所有编译都找到,但是当您尝试使用 gradle 构建时,测试类默认情况下不包含(没关系!),所以它不会编译。


1
投票

几乎有同样的问题:尝试构建依赖于另一个已更改的模块的模块。在第一个模块中调用第二个模块中的方法,并且这些方法不可见。 解决方案是删除第二个模块中的文件夹“build”和“out”,重建它并构建第一个模块。


0
投票

得到了类似的东西,但这只是因为我打开了并行构建(org.gradle.parallel=true in ~/.gradle.properties)。不过很奇怪。

我得到的错误: 错误:包 com.xxx.yyy 不存在 错误:找不到符号

一旦我在 ~/.gradle.properties 中设置 org.gradle.parallel=false,世界又开始变得正常了。


0
投票

我一直收到此错误,即使您的问题可能与之前的答案有关,但对我来说,这通常只是本地缓存问题,可以通过运行

gradle clean
来解决。

尝试一下也没什么坏处。


0
投票

就我而言,我尝试使用 Kotlin 类而不是 Java 类。


0
投票

就我而言,删除构建文件夹并重新运行应用程序解决了我的问题。

© www.soinside.com 2019 - 2024. All rights reserved.