返回

2026/10/12

大多数迁移项目都始于一个决定:从 Oracle Java SE 迁移到 OpenJDK、替换已停止支持(EOL)的 Linux 发行版,或将服务器整合到私有云。计划在纸面上通常看起来很简单。但随后项目团队会发现无人知晓的 Java 运行时、无人负责的服务器,以及悄悄依赖旧版本的应用程序。于是工期延误,预算增加。

避免这种情况的方法是从现状调查(discovery)入手:基于事实,完整盘点实际安装了什么。本文介绍需要收集哪些信息、如何在 Windows 和 Linux 上收集、可能遇到哪些意外情况,以及如何将结果转化为迁移计划。

要点

  • 在规划任何迁移之前,先建立完整的 Java 与 Linux 资产清单。
  • 为每个运行时记录完整版本号、供应商、路径和负责人。
  • 除了软件包列表,还要搜索文件系统:许多运行时是直接解压的,或随应用程序捆绑提供。
  • 将结果分为四组(移除、替换、协调、调查),并据此制定计划。

为什么现状调查要先于迁移

迁移的质量取决于其所依据的信息。没有资产清单,就只能凭记忆、旧的电子表格和许可证记录来估算范围,而这些都无法反映当前实际运行的情况。

一份完善的资产清单能带来三方面的价值:

  • 范围:受影响的机器、运行时和应用程序数量,便于切实估算工作量和成本。
  • 风险:哪些系统运行着不受支持或未打补丁的版本,哪些系统对业务至关重要。
  • 归属:每个系统由谁负责,使测试和验收都有明确的负责人。

在许可证谈判中,它也能为您提供保障。如果供应商询问您有多少安装,一份最新的资产清单可以让您用事实而非猜测来回答。

需要收集什么:版本、供应商、路径和负责人

对于每一个 Java 安装,至少收集以下信息:

  • 主机:机器名、IP 地址,以及它是服务器、虚拟机还是桌面电脑。
  • 版本:完整的版本字符串,例如 1.8.0_202 或 17.0.10,而不仅仅是“Java 8”或“Java 17”。
  • 供应商:运行时由谁构建,例如 Oracle 或某个 OpenJDK 发行版。仅凭版本号无法判断这一点。
  • 类型和路径:是完整的 JDK 还是仅有 JRE,以及其安装目录。
  • 用途:如果能查明的话,哪些应用程序或服务在使用它。
  • 负责人:负责该机器或应用程序的团队或个人。

对于 Linux 服务器,还应收集发行版及其版本、内核版本、主要已安装软件包和正在运行的服务。这样您就能知道哪些服务器除了 Java 迁移之外,也属于 Linux 迁移的范围。

Windows、Linux 与桌面电脑:不同的方法

每种环境需要的方法略有不同。下面的命令只是起点;在实践中,团队通常会将它们封装成脚本,并借助现有的管理工具在所有机器上运行。

Windows 服务器

已安装的 Java 运行时通常会在 Windows 注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft 下注册,但并非全部如此。搜索文件系统更为可靠:

Get-ChildItem -Path C:\ -Filter java.exe -Recurse -ErrorAction SilentlyContinue |
  Select-Object FullName, @{n='Version'; e={$_.VersionInfo.ProductVersion}}

请检查所有驱动器,而不仅仅是 C:,因为应用服务器通常安装在单独的数据驱动器上。

Linux 服务器

在 Linux 上,应将包管理器与文件搜索结合使用,因为许多 Java 运行时是从压缩包解压而来,而不是以软件包形式安装的:

cat /etc/os-release
rpm -qa | grep -i -E 'jdk|jre|java'
find / -xdev -type f -name java -perm -u+x 2>/dev/null

在 Debian 或 Ubuntu 上,请使用 dpkg -l | grep -i -E 'jdk|jre' 代替 rpm。对找到的每个 java 可执行文件加上 -version 参数运行,即可显示版本,通常还会显示供应商。大多数 JDK 目录中还有一个 release 文件,其中注明了实现方(implementor)。

桌面电脑

桌面电脑是资产清单中最常被遗忘的部分。开发人员会自行安装 JDK,业务应用程序有时也会静默安装 Java 运行时。由于桌面电脑数量众多,应尽可能使用终端管理工具的软件清单,仅在缺少相关信息时才运行轻量级脚本。

常见的意外情况(捆绑的 JRE、被遗忘的服务器)

几乎每个现状调查项目都会发现一些出乎意料的东西。最常见的有:

  • 捆绑的运行时:许多商业应用程序会在其安装目录中自带专用的 Java 运行时。它可能不会出现在注册表或任何软件包列表中。
  • 一台机器上有多个版本:安装新运行时时,旧版本很少被删除,因此一台服务器上可能有三四个运行时。
  • 被遗忘的服务器:从未下线的测试机、旧的批处理服务器和虚拟机,往往运行着过时且未打补丁的版本。
  • 负责人不明:无人认领的机器。即使最终决定是关停,也需要在迁移开始前做出决定。

提示:捆绑的运行时通常需要通过应用程序供应商来处理,而不能直接替换,因此请将其与您自行管理的运行时分开记录。

从资产清单到迁移计划

数据收集完成后,将其汇总到一处,并与各系统负责人一起审核。然后将这些安装分为以下几类:

分组包含内容处理方式
移除已不再使用的运行时立即卸载,以降低风险和许可证风险敞口
替换您自行管理的运行时经过测试后迁移到受支持的 OpenJDK 构建版本
协调与第三方应用程序捆绑的运行时先获取应用程序供应商的支持声明
调查任何没有负责人或用途不明的项目找到负责人,或决定将其关停

根据这些分组,您可以制定切实可行的时间表:先从低风险系统开始以验证流程,然后在具备经过测试的回滚方案的前提下,再推进到关键业务系统。

提示:在最终切换之前,请再次运行现状调查扫描。在长期项目中,环境会发生变化,也会出现新的安装。

LOGIQ 如何提供帮助

LOGIQ 为 Java 和 Linux 环境开展现状调查与迁移项目,所使用的脚本和流程已在 Windows 服务器、Linux 服务器和桌面电脑上的真实客户项目中不断完善。如果您需要帮助建立资产清单或将其转化为迁移计划,请联系 LOGIQ。