我遇到意想不到的(仅限我?)ScalaC行为。
TL; DR是以下是我在尝试将代码库从maven迁移到bazel时看到的问题。此迁移的主要重点之一是尝试最小化每个类编译所需的依赖关系,以便仅在需要时触发构建。
不幸的是,我看到的是给定ClassIndirectlyNeedingFoo
(使用) - > ClassUsingFoo
(使用) - > Supplier
如果ClassIndirectlyNeedingFoo
Supplier
的编译中断不在类路径上。
完整的详细信息在这里(https://github.com/ittaiz/scalac-troubleshooting)
如果有人知道scalac为什么会这样,我真的很感激
谢谢!
BTW,供应商不在ClassIndirectlyNeedingFoo的源代码或字节码中......
答案 0 :(得分:2)
好的简短回答是Why
对anyone并不完全清楚(见#4)。显而易见的是,scalac有时候需要的依赖性比人们想象的要多,而且很明显,有时当这种情况发生时,它是bug。
此外,在Gitter与Jason Zaugg的讨论中,他似乎认为我的上述问题仅仅是上述问题的一部分。
正如Seth在评论中所链接的那样,ScalaCenter已接受proposal(original PR)来澄清此区域。
与此问题最相关的是那里的四个提案:
- 针对存根错误的用户体验的改进,以
Statement
为中心:它们是预期的常见情况,而不是 罕见,意外或致命的情况。- 减少导致存根错误的案例数量...即,允许更多当前导致存根错误的用例 成功编译,从而允许更少的直接依赖。
- 编译器标志,要求编译期间使用的所有符号都需要
import
语句(包括那些在编译中未提及的符号) 资源)。对于-Ywarn-unused-imports
的对称性,此选项可能 可能被称为-Ywarn-undeclared-imports
。它主要是 协助从传递到直接过渡 依赖,而不是帮助维护已经构建的 使用直接依赖。 (按照建议 @posco和 @adriaanm)- 扩展Scala语言规范,列出其中必须存在来自另一个编译单元的符号的所有情况 classpath,包括:1)子类化,2)返回超类的类型' 公共方法,3)直接参考,4)等。
醇>
虽然我不知道什么时候开始工作,但是{3}才能继续#3}
共同撰写该提案的Eugeene Burmako开始对agreed进行原型设计,并在此基础上做了一个小solution。
现在,这将解决我的问题。