在Java8上编译项目,然后在Java17上运行它是否可行?

3

我已经阅读了几篇文章,其中提到在jdk 9中,.* API已被删除。 "删除"是指它们完全从jdk 9中删除了还是被标记为不推荐使用?

根据上述声明,如果项目是使用jdk 8编译的,那么在jdk 17上运行是否会出现问题?这是我第一次尝试,但由于模块化更改,tomcat无法支持jdk 8而出现了问题。

我计划在jdk 8中进行编译,然后在jdk 17上运行,直到整个项目符合jdk 17的要求(通过使用更新的API而不是jdk 8中现有的不推荐使用的API)。

我走在正确的方向吗?还是应该采用不同的迁移方法?


不确定您所说的“直到整个项目符合JDK 17标准”是什么意思;如果不符合,那么您如何在JDK 17上运行它? - kaya3
@kaya3 我所指的符合JDK 17,意味着使用更新的API而非现有的废弃API。 - Sai Kumar
3
为什么要“在JDK 8中编译然后在JDK 17上运行”?如果不使用JDK 8来运行代码,则使用它进行编译没有意义。使用JDK 17进行编译将立即告诉您是否使用了已删除的API(除非涉及反射),这比在运行时偶然发现要好得多。 - Holger
在JDK 8中编译,然后在JDK 17上运行,可以实现平稳过渡,因为不需要立即更新所有实例。 - lalo
1个回答

2
这里的“removed”指的是它们是否在jdk 9中被完全删除,还是被标记为过时了?
有些已经被标记为过时。其他一些则完全被删除了,但通常不是在Java 9中。大多数删除是后来进行的,有些仍将发生。如果您查看现在被注释为@Deprecated的元素,则该注释在某些情况下将正式指示该元素将被删除。
以上说法如果项目使用jdk 8编译,那么在jdk 17上运行是否会出现问题?
不一定。另一件事是逐步关闭对“内部”Java SE API的访问。因此,如果您的应用程序使用这些API,在Java 9中,您会收到警告;在Java 11中,默认情况下会收到错误;而在Java 17中,某些访问已经变得(我认为)不可能。
因此...可能会出现“问题”。
正确的迁移方法是开始执行。并且测试、测试、测试,直到解决了所有问题。
显然,这意味着您需要一个测试服务器,并且您需要使用具有单元测试、功能测试、UI测试等自动化测试框架。但那些只是良好的软件工程实践。您应该已经在遵循它们。
我打算在jdk 8中进行编译,然后在jdk 17上运行,直到整个项目符合jdk 17的标准(我指使用更新的API而不是jdk8中现有的过时API)。这样做是否正确?
不是。正如@Holger所指出的那样,您可能会遇到很多运行时错误...由于Java 17编译器已经确定的问题。
实际上只有一种方法。在Java 17上编译,直到您已经确定了所有的编译时依赖问题;也就是说,使用已删除或关闭的API。然后在Java 17上运行和测试,测试并测试,直到找到所有其他问题为止。
开始之前,建议检查项目的所有依赖项(库等),以查看它们是否受Java 17支持。然后将它们更新到正确的(可能是最新的)版本。
Java 17仅发布了几周,因此您的一些依赖项可能还没有跟上。如果是这种情况,现阶段针对Java 11 LTS可能是更好的选择。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接