Gradle compileJava 无法从源文件中找到符号

2022-09-02 13:50:45

我是Gradle的新手,所以我有可能在这里错过了一些明显的东西。我正在努力使用Gradle来自动化构建我们的项目。我已经解决了其中的大多数问题,但有一个问题给我带来了无休止的麻烦。由于这是针对我的公司,我不能分享任何真实的代码,但我会尽我所能提供逼真的伪代码。

我正在尝试编译一个具有弹性前端和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 文件中声明。它找不到的符号“其他对象”不是来自.jar。它是存储在 处的源文件。该对象在重命名对象的顶部导入.java并且可以通过 eclipse 构建和运行,而无需任何特殊设置。这些错误发生在从终端执行后的 :compileJava 任务期间。/Users/user/Documents/eclipse/ProjectName/src/com/companyName/teamName/projectName/core/release/subProjectName/projectVersion/superTypes/OtherObject.javagradle war

有什么理由让 Gradle 在处理从这样的子包导入源代码时遇到问题吗?我只是做错了什么吗?如果有更多信息可以帮助我,请告诉我,如果可以的话,我会提供。

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

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

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


答案 1

症状

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

... .... .....

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

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

检查输出,看看它在输出中引用了哪个类名,但它无法解析。

symbol:  class <referenced_classname_here
location: class <parent_classname_here

溶液

在引用作为未解析的符号提及的类的任何位置提供完全限定域名。

在我的情况下,当我定义一个内部类时,我已经看到了这一点,该内部类扩展了我在build.gradle中声明为依赖项的库中的类。

附言:

我看到,OP已经提到了解决这个问题的办法,作为对这个问题的评论。

我找不到这个问题,因为它没有正确的关键字谷歌,也没有公认的解决方案,这进一步降低了它的可见性。

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

我已经尝试了Sun下与依赖关系解析远程相关的所有内容,以解决此“依赖关系问题”,这在我的代码库中从来都不是问题。

希望Gradle团队在更多人拔头发之前尽快解决这个问题。

顺便说一句...我爱格雷德尔。:)


答案 2

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

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。


推荐