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

时间:2015-01-27 15:47:49

标签: java eclipse gradle war

我是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个错误都通过一次更改得以解决。如果我将完全限定的包名称添加到extends中的OtherObject,那么它看起来像这样:

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

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

5 个答案:

答案 0 :(得分:11)

症状

  

无法使用Gradle分发&#39; https://services.gradle.org/distributions/gradle-2.8-bin.zip&#39;

执行构建

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

  

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

Gradle Build报告您应该检查编译器Java输出。

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

symbol:  class <referenced_classname_here
location: class <parent_classname_here

<强>解决方案

提供完全限定的域名,无论您在何处引用未提及的符号提及的类。

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

<强> P.S:

  

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

     

我找不到这个问题   因为谷歌没有合适的关键词,也没有   已接受的解决方案,进一步降低了

     

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

我已尝试在Sun下与依赖项解析远程相关的所有内容来修复此问题&#34;依赖性问题&#34;这从来都不是我的代码库的问题。

  

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

     

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

答案 1 :(得分: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。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

得到了类似的结果,但这仅仅是因为我打开了并行构建(〜/ .gradle.properties中的org.gradle.parallel = true)。不过很奇怪。

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

一旦我在〜/ .gradle.properties中设置org.gradle.parallel = false,世界便再次恢复正常。