我是 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 的唯一引用,也不是内部类扩展另一个源包中定义的类的唯一位置。
无法使用 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。 :)
只是添加到知识库,但我遇到了同样类型的问题:
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。
我今天也遇到了同样的问题。 如果您正在使用 gradle,请确保您的类位于 src/main/java 而不是 src/test/java 中,否则您的 IDE(例如 Eclipse)会说所有编译都找到,但是当您尝试使用 gradle 构建时,测试类默认情况下不包含(没关系!),所以它不会编译。
几乎有同样的问题:尝试构建依赖于另一个已更改的模块的模块。在第一个模块中调用第二个模块中的方法,并且这些方法不可见。 解决方案是删除第二个模块中的文件夹“build”和“out”,重建它并构建第一个模块。
得到了类似的东西,但这只是因为我打开了并行构建(org.gradle.parallel=true in ~/.gradle.properties)。不过很奇怪。
我得到的错误: 错误:包 com.xxx.yyy 不存在 错误:找不到符号
一旦我在 ~/.gradle.properties 中设置 org.gradle.parallel=false,世界又开始变得正常了。
我一直收到此错误,即使您的问题可能与之前的答案有关,但对我来说,这通常只是本地缓存问题,可以通过运行
gradle clean
来解决。
尝试一下也没什么坏处。
就我而言,我尝试使用 Kotlin 类而不是 Java 类。
就我而言,删除构建文件夹并重新运行应用程序解决了我的问题。