【发布时间】:2016-12-13 16:16:51
【问题描述】:
使用 Gradle,我们正在尝试编译遗留的 Java 代码,这些代码是使用 JDK 1.8 编译器为 JDK 1.6 开发的。 在某些时候,编译过程会因错误而退出
试图分配较弱的访问权限;是公开的
(错误的原因很明显:我们在抽象类中有一个方法,声明为public,但实现类声明为protected。 )
使用 JDK 1.6 进行编译,我们从未遇到过任何问题。 现在由于几个原因,我们不得不用 Java 8 编译我们的代码,这让我们遇到了这个问题。
我们已经在构建时尝试过项目设置-PsourceCompatibility=1.6(也可以是-PtargetCompatibility=1.8),但没有效果。
目前,重构整个产品代码(预计会出现更多类似的错误)是没有选择的,所以我们正在寻找一种解决方案,用新的 JDK 构建旧代码。
对此有什么帮助吗?
【问题讨论】:
-
“我们从来没有遇到过任何问题”。但你应该拥有它们。在每个 Java 版本中,这总是被禁止的。
-
将
public更改为protected(反之亦然)并不是重大的重构,即使您遇到更多此类错误。 -
您确定您没有针对 jar 中的不同版本的类进行编译,还是什么?这听起来更像是类路径地狱,而不是 Java 8 中修复的 Java 基础。
-
尤其是“我们从来没有遇到过任何问题”,这听起来值得研究。我会仔细看看....
-
我只记得较旧的编译器对
static方法松懈,这已得到修复,这也是-source 1.6没有帮助的原因,因为规则没有改变并且错误兼容性是没有尝试。但我从未听说过可以用protected方法覆盖public abstract方法的情况。