这可能是一个 XY 问题,因为它涉及将文件符号链接(symbolic link)到源代码树中。我有时会在开发中使用许多应用程序项目通用的库来执行此操作。更常规地,它们将(以后将)只是 .aar 进口。不这样做会简化在应用程序代码上下文中对库的 API 调整——一个选项是自动打包和导入 aar,但这仍然更像是 PITA,意味着我要么在 IDE 中运行两个项目同时(未尝试)或在它们之间切换。
通常,符号链接(symbolic link)只是目录,但目前我正在处理单个文件,并且尝试构建涉及 的应用程序时出现了一个奇怪的问题。 《重新声明》错误。目录偶尔会发生这种情况,但通常通过 gradle re-sync 或 invalidate-and-restart 解决。
需要明确的是,这个问题不应该存在,而且闻起来很像一个错误:“重新声明”指的是符号链接(symbolic link)的位置,它们是 。不是 在构建树或项目文件夹中 - 即,重新声明涉及使用不同路径处理同一文件两次。1
令人沮丧的是,invalidate-and-restart 对单个文件不起作用,所以我删除了符号链接(symbolic link),只是将文件复制进去。没有更多的符号链接(symbolic link),但奇怪的是同样的问题发生了:
./gradlew assemble
> Task :app:compileDebugKotlin FAILED
e: /home/devel/Android/lib/droidutil/src/cogware/droidutil/Plexus.kt: (5, 8): Redeclaration: Plexus
e: /home/devel/Android/template/FooDemo/app/src/main/java/cogware/droidutil/Plexus.kt: (5, 8): Redeclaration: Plexus
(使用 IDE 也一样。)这里的项目文件夹是 /home/devel/Android/template/FooDemo
. /home/devel/Android/lib/droidutil/src/cogware/droidutil/
不是它的一部分——虽然公平地说还有其他符号链接(symbolic link),但 gradle 需要做的就是遵循为它设置的显式路径。现在似乎正在发生的事情是:droidutil
中。上面的目录。有,例如。一个 /home/devel/Android/lib/listfilterstack
链接,它仍然设法在 /home/devel/Android/lib/droidutil/src/...
中找到“重新声明错误” . 唯一没有意义的事情是它随机搜索整个文件系统。
为什么它会保留这条路径,我该如何摆脱它?
无效并重新启动没有任何区别。我尝试将其添加到 app/build.gradle:
android {
...
sourceSets {
main {
java {
exclude '/home/devel/Android/lib/**'
srcDirs = [ 'app/src/main/java' ]
}
}
}
其中exclude
显然那里没有语义值(value)——同样的错误。再次无效并重新启动——同样的错误。没有删除我的硬盘驱动器并在不同时区的另一台计算机上从头开始重新启动项目,唯一有效的方法是让我真正移动
/home/devel/Android/lib
到完全不同的地方,这样路径就不再存在了。我不应该这样做。我应该能够明确设置构建工具搜索源的位置,而不是让它解开符号链接(symbolic link)并四处游荡。最佳答案
似乎这是一个错误,但不幸的是,这种错误可能永远不会完全修复:
https://github.com/gradle/gradle/issues/3982
不完全相同的上下文或症状,但对我来说,没有实现 gradle 来以智能方式处理符号链接(symbolic link),因此:
不要在 gradle 中使用符号链接(symbolic link)。
关于android-studio - 限制 Android Studio/Gradle 解析源路径(符号链接(symbolic link)问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64035536/