Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Java8项目迁移到Java11_Java_Java 8_Java 11 - Fatal编程技术网

将Java8项目迁移到Java11

将Java8项目迁移到Java11,java,java-8,java-11,Java,Java 8,Java 11,我们有一个使用Java8构建的存储库。存储库中有多个rest服务。我们想迁移到Java11,并试图找出实现这一点的最佳方法。我们正在考虑一个模块一个模块地做。例如,将一个服务更改为Java11,而其余服务仍然是Java8。我们不确定Maven是否支持这一点?我的建议是升级整个项目。尝试使用一些Java8和Java11模块可能非常困难。正如您已经知道的,从Java9开始出现模块。答案非常笼统,因此很难给出详细的答复。我想: 您的项目由maven管理 你有很多手工艺品(罐子) 您正在使用某个库或框

我们有一个使用Java8构建的存储库。存储库中有多个rest服务。我们想迁移到Java11,并试图找出实现这一点的最佳方法。我们正在考虑一个模块一个模块地做。例如,将一个服务更改为Java11,而其余服务仍然是Java8。我们不确定Maven是否支持这一点?

我的建议是升级整个项目。尝试使用一些Java8和Java11模块可能非常困难。正如您已经知道的,从Java9开始出现模块。答案非常笼统,因此很难给出详细的答复。我想:

  • 您的项目由maven管理
  • 你有很多手工艺品(罐子)
  • 您正在使用某个库或框架(谁说的是Spring?)
  • 您正在使用源代码版本控制(例如Git或Subversion)
  • 你有一个多模块的项目
  • 您编写的代码适用于Java8和Java11平台
我建议的计划:

  • 在svcforjava11项目的版本上创建一个分支并开始工作
  • 为通用定义创建父模块
  • 将maven插件和所有库升级至最新版本。对于Maven编译器,设置Java11目标(只有最新版本的Maven编译器插件才支持Java11)
  • 对于每个模块,定义导出的包(并指定需要哪些包)
  • 如果有许多模块,则从其中的几个模块开始,然后包括剩余模块
  • 如果它能帮助您,让我们看看这个(它以Java11为目标,是一个多模块Maven项目)


    希望有帮助。

    免责声明:这不是答案,只是我最近经历的部分报告。如果您觉得这个答案不符合SO标准,请随意标记它

    Maven支持这一点吗

    可以,使用编译器插件3.8.0/3.8.1

    但是,这种迁移需要额外小心

    最近,我们通过从OracleJDK8迁移到OpenJDK11完成了类似的工作。由于我们有许多不同任务的存储库,我们面临着各种各样的问题。我在我的邮箱中找到了一些标记为[jdk11_migration]的信息:

    • 很明显,但我想强调的是,为了从Java8迁移到Java11,我们还必须满足Java9和Java10的要求

    • 一些maven插件,比如cobertura,不支持Java11,我想他们永远不会支持它。在某些情况下,这些插件已经达到了废弃的生命周期阶段。解决方案是以个案的方式寻找替代方案。例如,我们用Jacoco取代了cobertura

    • rt.jar和tools.jar已被删除!你从他们那里明确提到的一切都可能会破裂

    • 一些我们不应该在Java9或更少版本中使用的类现在在Java11中不再存在。我说的是访问sun.*、sun.misc等包中的类。解决方案是寻找一对一的替换或重构代码以避免使用

    • 反射通常是最后一个要使用的项目符号,对于这些情况,在java 9及以上版本中,我们会收到如下警告消息:

      WARNING: An illegal reflective access operation has occurred
      WARNING: Illegal reflective access by ...
      WARNING: Please consider reporting this to the maintainers of ...
      WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
      WARNING: All illegal access operations will be denied in a future release
      
    虽然这并不是一个确切的解决方案,但是有一个标志可以消除这个警告——非法访问=许可。这在使用surefire maven插件时尤为重要

    • Java9引入了模块系统,然后“现在”出现了包冲突的现象。例如,诸如“包org.w3c.dom可以从多个模块访问:,java.xml”。解决方案是找到冗余包含的来源(特别是重复的maven依赖项或依赖项的依赖项)并将其删除
    虽然这对我们来说不是问题,但我只是注意到您的存储库大部分由REST组件组成。您可能会遇到一些包(如javax.xml.bind)的ClassNotFound问题,这些包基本上是从java标准版中删除的。可以通过将它们明确地包含在pom.xml中来修复它


    幸运的是,您可以在SO或internet上的迁移过程中找到关于每个问题的好问题和答案。在野外有一些迁移指南,它们是很好的起点。具体问题,如混淆和IDE集成,可能需要一点时间,但至少在我的经验中,这次迁移比我想象的要轻松。

    我遇到了同样的问题。Maven支持除部署部分之外的所有迁移。这是由详细日志引起的如果你有一个模块级pom,你可以在编译阶段控制特定模块的JAVA版本。试着就你在迁移过程中遇到的问题发布具体的示例,根据具体情况回答会更容易。您可以尝试使用IBM的应用程序二进制文件迁移工具包-也许这将有助于您获得良好的测试覆盖率?