我们正在使用Gradle尝试编译遗留Java代码,该代码是使用JDK 1.8编译器为JDK 1.6开发的。
在某个时候,编译过程因错误而退出
(错误的原因很明显:我们在抽象类中有一个方法,该方法被声明为public,但是实现类将其声明为protected。)
使用JDK 1.6进行编译,我们从来没有遇到任何问题。
现在由于多种原因,我们不得不使用Java 8来编译代码,从而遇到这个问题。
我们已经在构建时尝试了项目设置-PsourceCompatibility=1.6
(也为-PtargetCompatibility=1.8
),但没有效果。
目前,重构整个产品代码(可能会遇到更多类似错误)是不可行的,因此我们正在寻找一种使用新JDK构建旧代码的解决方案。
有什么帮助吗?
最佳答案
您的系统曾经使用过Java 1.6的事实的唯一解释是,父类(super class)中的方法访问已更改为public
,而无需重新编译子类。从一开始就禁止降低子类的可访问性。
Java Language Specification 1.6在第344页提供了以下说明:
如果必须使用Java 1.8编译器重新创建确切的行为,请将父类(super class)中的可访问性更改为protected
,编译父类(super class)和子类,然后将父类(super class)中的可访问性更改为public
,仅编译父类(super class)。但是,在这一点上,我强烈建议更改子类以提供适当的可访问性。