你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

适用于 Java 版本 7 的 Azure Migrate 应用程序和代码评估(预览版)

注意

本文适用于 Java 版本 7.x 的下一代 Azure Migrate 应用程序和代码评估。 此版本处于预览状态。 有关以前的稳定版本 6.x,请参阅 适用于 Java 的 Azure Migrate 应用程序和代码评估

本文将展示如何使用适用于 Java 的 Azure Migrate 应用程序和代码评估工具来评估和替换任何类型的 Java 应用。 借助该工具,可以评估应用程序准备情况,以便进行重新平台化并迁移到 Azure。 此工具作为命令行接口 (CLI) 提供,可评估 Java 应用二进制文件和源代码,以确定 Azure 的重新搭建和迁移机会。 它通过识别常见用例和代码模式,并提供建议的更改,帮助实现大规模 Java 应用程序的现代化和重新平台化。

该工具会通过静态代码分析发现应用程序技术使用情况,提供工作量估算,并加速代码重新搭建。 此评估可帮助设置 Java 应用的优先级并将其迁移到 Azure。 通过一组引擎和规则,工具可以发现和评估不同的技术,如 Java 11、Java 17、Jakarta EE、Spring、Hibernate、Java 消息服务 (JMS) 等。 然后,该工具可帮助将 Java 应用重新搭建到不同的 Azure 目标(Azure 应用程序服务、Azure Kubernetes 服务和 Azure 容器应用),并采用特定的 Azure 重新搭建规则。

该工具基于由 Red Hat 创建和领导的 Cloud Native Computing Foundation 项目 Konveyor 中的一组组件。

概述

该工具旨在帮助组织以降低成本并加快创新速度的方式实现 Java 应用程序的现代化。 该工具使用高级分析技术来了解任何 Java 应用程序的结构和依赖项,并提供有关如何重构应用程序并将其迁移到 Azure 的指导。

使用该工具,可执行以下任务:

  • 发现技术使用情况:快速了解应用程序使用哪些技术。 如果有包含很少文档的旧应用程序,并且想知道它们使用了哪些技术,发现功能将非常有用。
  • 将代码评估到特定目标:评估特定 Azure 目标的应用程序。 检查必须执行的工作量和修改,以便将应用程序重新平台化到 Azure。

支持的目标

该工具包含用于帮助重新平台化应用程序的规则,以便可以部署到并使用不同的 Azure 服务。

Azure Migrate 应用程序和代码评估使用的规则根据目标进行分组。 目标是应用程序运行的位置或方式,以及常规需求和期望。 评估应用程序时,可以选择多个目标。 下表对可用目标进行了介绍:

目标名称 说明 目标
Azure 应用程序服务 部署应用到 Azure 应用程序服务的最佳做法。 azure-appservice
Azure Kubernetes 服务 部署应用到 Azure Kubernetes 服务的最佳做法。 azure-aks
Azure 容器应用 (Azure Container Apps) 部署应用到 Azure 容器应用的最佳做法。 azure-container-apps
云就绪 使应用程序云 (Azure) 准备就绪的一般最佳做法。 cloud-readiness
Linux 使应用程序 Linux 准备就绪的一般最佳做法。 linux
OpenJDK 11 使用 Java 11 运行 Java 8 应用程序的一般最佳做法。 openjdk11
OpenJDK 17 使用 Java 17 运行 Java 11 应用程序的一般最佳做法。 openjdk17
OpenJDK 21 使用 Java 21 运行 Java 17 应用程序的一般最佳做法。 openjdk21

当该工具评估云就绪和相关 Azure 服务时,它还可以报告有关不同 Azure 服务的潜在使用情况的有用信息。 以下列表显示了涵盖的一些服务:

  • Azure 数据库
  • Azure 服务总线
  • Azure 存储
  • Azure 内容分发网络
  • Azure 事件中心
  • Azure Key Vault
  • Azure 前端入口 (Azure Front Door)

下载并安装

要使用 appcat CLI,必须下载特定于环境的包,并在环境中具有所需的依赖项。 appcat CLI 可在任何环境下运行,如 Windows、Linux 或 Mac,使用 Intel、Arm 或 Apple Silicon 硬件。 对于 JDK 要求,建议使用 OpenJDK 的Microsoft版本

操作系统 体系结构 下载链接 其他文件
x64
Windows操作系统 x64 下载 sha256 / sig
macOS x64 下载 sha256 / sig
Linux x64 下载 sha256 / sig
AArch64
Windows操作系统 AArch64 / ARM64 下载 sha256 / sig
macOS Apple Silicon 下载 sha256 / sig
Linux AArch64 / ARM64 下载 sha256 / sig

先决条件

安装 AppCAT

要安装 appcat,请下载适合平台的 zip 文件。 下载文件后,根据作系统,应找到 .tar.gz (Linux/macOS)或 .zip 文件(Windows)。

从下载的文件中提取二进制文件。 应该看到以下文件夹结构:

/azure-migrate-appcat-for-java-cli-<OS>-<architecture>-<release-version>-preview/
├── appcat.exe (Windows) / appcat (Linux/macOS)
├── samples/
├── fernflower.jar
├── LICENSE
├── NOTICE.txt
├── maven.default.index
├── jdtls/
├── static-report/
├── rulesets/
├── readme.md
└── readme.html

运行 AppCAT

若要从终端中的任何位置运行 appcat ,请将存档提取到所需位置。 然后,更新 PATH 环境变量以包含提取存档的目录。

注意

appcat调用二进制文件时,它会首先在环境变量中指定的PATH可执行文件文件夹中查找其依赖项。 如果未找到依赖项,则它会回退到用户的主目录 - Linux/Mac 上的 ~/.appcat ,或在 Windows 上 %USERPROFILE%\.appcat

使用情况

子命令

AppCAT 提供了两个子命令供使用:

  • analyze:对输入源代码或二进制文件运行源代码分析。
  • transform:将以前版本(6 及更早版本)的 XML 规则转换为此版本使用的 YAML 格式。

注意

对于 macOS 用户:如果在尝试运行应用时遇到错误 Apple could not verify ,可以使用以下命令解决此错误:

xattr -d -r com.apple.quarantine /path/to/appcat_binary

例如:

xattr -d -r com.apple.quarantine $HOME/.appcat/appcat

分析子命令

使用 analyze 子命令可以运行源代码和二进制分析。

若要分析应用程序源代码,请使用以下命令:

./appcat analyze --input=<path-to-source-code> --output=<path-to-output-directory> --target=azure-appservice,cloud-readiness --overwrite

--input 标志必须指向源代码目录或二进制文件,并且 --output 必须指向存储分析结果的目录。

有关分析标志的详细信息,请使用以下命令:

./appcat analyze --help

若要检查 AppCAT 的可用目标,请使用以下命令:

./appcat analyze --list-targets

该命令生成以下输出:

available target technologies:
azure-aks
azure-appservice
azure-container-apps
cloud-readiness
linux
openjdk11
openjdk17
openjdk21

分析多个应用程序

AppCAT 支持每个命令执行中的多个应用程序分析。 可以为标志提供逗号分隔的输入路径 --input 列表,以在单个命令中分析多个应用程序。 输出目录和静态报表包括所有应用程序的合并分析结果。

若要分析多个应用程序,请使用以下命令:

./appcat analyze --input=<path-to-source-A>,<path-to-source-B>,<path-to-source-C> --output=<path-to-output-ABC> --target=<target-name>

通过 AppCAT,还可以使用 --bulk 选项以增量方式将更多应用程序分析添加到现有输出目录和静态报表。 使用 --bulk 此选项时,必须在写入到同一输出的所有命令执行中一致地使用它。

注意

提供多个输入路径时, --bulk 默认启用。

若要以增量方式向现有静态报表添加更多应用程序分析,请使用以下命令:

./appcat analyze --input=<path-to-source-A>,<path-to-source-B>,<path-to-source-C> --output=<path-to-output-ABC> --target=<target-name>
./appcat analyze --bulk --input=<path-to-source-D> --output=<path-to-output-ABC> --target=<target-name>
./appcat analyze --bulk --input=<path-to-source-E> --output=<path-to-output-ABC> --target=<target-name>

转换子命令

通过 transform 该子命令,可以将 6.x 版本中使用的以前的 appcat XML 规则转换为此版本 7.x 使用的新 YAML 格式。

若要转换规则,请使用以下命令:

./appcat transform rules --input=<path-to-xml-rules> --output=<path-to-output-directory>

--input 标志应指向包含 XML 规则的文件或目录,--output 标志应指向转换后的 YAML 规则的输出目录。

示例

注意

确保提取文件夹中脚本的文件权限设置为允许执行。

示例 目录中,可以找到以下脚本来运行不同类型的分析:

  • 运行评估:提供代码评估和将 Airsonic 迁移到 Tomcat 上的 Azure 应用服务的步骤的报告。
  • run-assessment-transform-rules:将 Windup XML 规则转换为与 analyzer-lsp 兼容的 YAML 规则。
  • run-assessment-custom-rules:使用自定义规则提供代码评估报告(将 XML 转换为 YAML)。
  • run-assessment-openjdk21:生成包含代码评估和将 Airsonic 迁移到 OpenJDK 21 的步骤的报告。
  • 仅运行评估包:通过评估特定包生成报告。

这些脚本旨在与 Airsonic-Advanced 示例项目一起使用,该项目是一种基于社区驱动的基于 Web 的媒体流式传输程序,可用于访问和共享音乐集合。

可以使用以下命令手动克隆应用程序存储库:

git clone https://github.com/airsonic-advanced/airsonic-advanced.git

克隆后,在运行评估脚本时提供克隆文件夹的路径。 根据操作系统,运行相应的脚本,如下例所示:

注意

在运行脚本之前,请确保已将 Airsonic Advanced 项目克隆到本地路径。

./samples/run-assessment <path-to-airsonic-advanced>

报告会自动生成并启动。 可以在 ../samples/report-* (Linux/macOS) 或 ..\samples\report-* (Windows) 下找到该报告。

分析摘要

报表的登陆页显示所有已分析应用程序的摘要视图。 在此处,可以导航到各个应用程序报表,以浏览详细的发现结果。

appcat 摘要报表的屏幕截图。

右上角的 “Ask Copilot ”按钮将你重定向到 Visual Studio Code 中用于 Java 的 GitHub Copilot 应用现代化扩展。 此扩展提供应用评估和代码修正,作为将 Java 应用程序迁移到 Azure 的关键功能-由 AppCAT 和 GitHub Copilot 的 AI 功能提供支持。

评估报告

评估报告提供了 Azure 就绪情况、云原生和 Java 现代化的各个方面的分类问题列表,需要解决这些问题,以便成功将应用程序迁移到 Azure。

每个 问题 按严重性( 强制可选潜在 )分类,包括受影响的代码行数。

依赖项和技术”选项卡显示应用程序中使用的库和技术。

AppCAT 评估报告的屏幕截图。

特定问题的详细信息

对于每个问题,只需选择它即可获取详细信息(问题详细信息、规则的内容等)。 还可以获取受此问题影响的所有文件的列表。

AppCAT 问题详细信息报告的屏幕截图。

然后,对于受问题影响的每个文件或类,可以跳转到源代码中以突出显示创建问题的代码行。

AppCAT 问题代码报告的屏幕截图。

发行说明

7.6.0.6

此版本包含以下修复内容和增强功能。

  • 默认 的 .appcat-ignore 文件现在包含在发布包中。 此文件会导致该工具排除不需要分析的指定文件夹或路径。
  • 修复了使用 full 模式(使用 --mode 指定)时报告中缺少依赖项的问题。
  • 当未指定目标时,将分析范围限定为 AppCAT 支持的特定目标。
  • 在分析中忽略了注释行。
  • 修复了 XML 规则的错误位置。

7.6.0.5

此版本包含以下修复内容和增强功能。

  • 标志 --input 现在接受多个值,使你可以在单个命令执行中分析多个应用程序。
  • 静态报表对其问题列表进行分类,以提高可读性。
  • 用户现在可以在用户主目录以外的目录中安装 AppCAT。
  • 修复了运行analyze--bulk--skip-static-report组合时未能生成多个输出文件的问题。
  • 解决了在没有启动 Java 提供程序时,使用 --bulk--rules 进行分析时出现的故障。
  • 修复了在使用 --packages 标志时找不到指定包时分析失败的问题。
  • 标志 --exclude-paths 已弃用。 若要排除文件或目录,请使用放置在输入目录或安装目录中的 .appcat-ignore 文件(支持 glob 模式)。

7.6.0.4

此版本包含以下修复内容和增强功能。

  • 支持遥测数据的收集。 使用 --disable-telemetry 标志禁用遥测。
  • 重构 CLI 命令格式以提高清晰度。
    • 更新--source标志,将其从--source <source1> --source <source2> ...更改为--source <source1>,<source2>,...
    • 更新--target标志,将其从--target <target1> --target <target2> ...更改为 --target <target1>,<target2>,...
    • 更新--rules标志,将其从--rules <rule1> --rules <rule2> ...更改为--rules <rule1>,<rule2>,...
    • --maven-settings 标志更新为 --custom-maven-settings
    • --limit-code-snips 标志更新为 --code-snips-number
    • 删除 --json-output 标志,使用 --output-format 标志,选择输出格式:“yaml”或“json”。 (默认为 yaml)
    • 删除--provider--override-provider-settings--list-providers--dependency-folders标志
  • --exclude-paths 标志:指定应在分析中忽略的路径。 对多个值使用逗号分隔的列表: --exclude-paths <path1>,<path2>,... 默认值是 []
  • --packages 标志:指定要评估的应用程序类包。 对多个值使用逗号分隔的列表: --packages <package1>,<package2>,... 默认值是 []
  • --dry-run 标志:仅检查标志是否有效,而不实际运行分析。 默认值是 false
  • 删除azure-spring-apps从 appcat --list-targets中。

7.6.0.3

此版本包含以下修复内容和增强功能。

  • --limit-code-snips 标志:控制规则评估期间的代码片段限制(0=无限制,-1=禁用代码段)。
  • 修复了批量分析模式下因缺少依赖文件导致的失败:对于非 Java 项目或使用--mode=source-only的 Java 项目,该工具在批量分析过程中不再中止。

7.6.0.2

此版本包含以下修复。

  • java-removals-00150 规则现已正确触发。

7.6.0.1

此版本包含以下修复内容和增强功能。

  • --analyze-known-libraries 标志:现在适用于 Windows。
  • 目录清理:现在会自动清理 Windows 上在分析期间创建的额外目录。
  • --json-output 标志:现在可正常运行。
  • 规则分析错误:已解决此错误 unable to parse all the rules for ruleset
  • “见解”选项卡说明:现已存在缺失的规则说明。
  • Internet 连接依赖项:在没有 Internet 连接的情况下,分析不再失败。
  • --context-lines 标志:现在在设置为 0 时的表现将符合预期。
  • 运行该工具不再需要 Python。

7.6.0.0

此版本基于 Konveyor 项目的一组不同组件。

常规更新

6.3.9.0

此版本包含以下修复以及一组新规则。

常规更新

  • 集成了 Windup 上游存储库的更改 (6.3.9.Final Release)。
  • 解决了规则说明和帮助文本中链接损坏的问题。

规则

  • Azure Message Queue:已为 azure-message-queue-rabbitmqazure-message-queue-amqp 更新和添加了新规则。
  • Azure 服务总线:引入了 Azure 服务总线的检测规则。
  • MySQL 和 PostgreSQL:已优化的依赖项检测规则。
  • Azure-AWS 规则:增强和改进了现有规则。
  • S3 Spring Starter:为 S3 Spring Starter 添加了检测规则。
  • RabbitMQ Spring JMS:为 RabbitMQ Spring JMS 添加了检测规则。
  • 日志记录规则:更新和优化了与日志记录相关的规则。
  • 本地存储规则:更新和优化了本地存储规则。
  • Azure 文件系统规则:更新和优化了 Azure 文件系统规则。

图书馆

  • 更新了库以解决安全漏洞。

6.3.0.9

此版本包含以下修复以及一组新规则。

  • 解决了 localhost-java-00001 规则的问题。
  • 引入了用于识别 AWS S3、AWS SQS、阿里巴巴云 OSS、阿里巴巴云短信、阿里巴巴计划程序 X、阿里巴巴云 Seata 和阿里巴巴 Rocket MQ 等技术的新规则。
  • 更新了 azure-file-system-02000,现在支持 XML 文件扩展名。
  • 升级了各种库以解决安全漏洞。

6.3.0.8

之前,默认启用了一组目标,增加了某些客户在评估大型应用程序时的难度,其中包含了很多与不太重要的问题相关的问题。 为了减少报告中的干扰,用户现在必须使用参数 --target 来指定多个目标,这样做就可以在执行 appcat 时使用户可以仅选择重要的目标。

6.3.0.7

正式发布 Azure Migrate 应用程序和代码评估。

已知问题

7.6.0.6

  • 规则问题:
    • 未触发 azure-system-config-01000 规则。
    • azure-password-01000 规则仅检测一个冲突,即使同一文件中存在多个冲突也是如此。
  • Windows 上的“观察程序错误”通道出错:Windows system assumed buffer larger than it is, events have likely been missed。 在 Windows 上长时间运行的作业期间,此错误消息会出现在命令行上。

7.6.0.5

  • 规则问题:
    • 未触发 azure-system-config-01000 规则。
    • azure-password-01000 规则仅检测一个冲突,即使同一文件中存在多个冲突也是如此。
  • Windows 上的“观察程序错误”通道出错:Windows system assumed buffer larger than it is, events have likely been missed。 在 Windows 上长时间运行的作业期间,此错误消息会出现在命令行上。

7.6.0.4

  • 规则问题:
    • 未触发 azure-system-config-01000 规则。
    • azure-password-01000 规则仅检测一个冲突,即使同一文件中存在多个冲突也是如此。
  • Windows 上的“观察程序错误”通道出错:Windows system assumed buffer larger than it is, events have likely been missed。 在 Windows 上长时间运行的作业期间,此错误消息会出现在命令行上。

7.6.0.3

  • 不支持标志 --overrideProviderSettings
  • 规则问题:
    • 未触发 azure-system-config-01000http-session-01000 规则。
    • 未触发 FileSystem - Java IO 规则。
  • 在 Windows 上分析 WAR 文件会产生以下错误:Failed to Move Decompiled File. 在 Windows 上分析 WAR 文件时发生错误,导致在 Windows 上出现一些冗余问题。
  • Windows 上的观察程序错误通道出错:Windows system assumed buffer larger than it is, events have likely been missed。 在 Windows 上长时间运行的作业期间,此错误消息会出现在命令行上。
  • Ctrl+C 无法停止正在进行的分析。 为了解决这个问题,可以通过显式终止进程来手动终止进程。
  • 在二进制分析报告中,代码片段标题显示不正确的或不存在的文件路径。

7.6.0.2

  • 不支持标志 --overrideProviderSettings
  • 规则问题:
    • 未触发 azure-system-config-01000http-session-01000 规则。
    • 未触发 FileSystem - Java IO 规则。
  • 在 Windows 上分析 WAR 文件会产生以下错误:Failed to Move Decompiled File. 在 Windows 系统上分析 WAR 文件时发生错误,这导致在 Windows 上产生一些冗余的故障。
  • Windows 上的观察程序错误通道出错:Windows system assumed buffer larger than it is, events have likely been missed。 在 Windows 上长时间运行的作业期间,此错误消息会出现在命令行上。
  • Ctrl+C 无法停止正在进行的分析。 为了解决这个问题,可以通过显式终止进程来手动终止进程。
  • 在二进制分析报告中,代码片段标题显示不正确的或不存在的文件路径。

7.6.0.1

  • 不支持标志 --overrideProviderSettings
  • 规则问题:
    • 未触发 azure-system-config-01000http-session-01000java-removals-00150 规则。
    • 未触发 FileSystem - Java IO 规则。
  • 在 Windows 上分析 WAR 文件会产生以下错误:Failed to Move Decompiled File. 在 Windows 系统上分析 WAR 文件时发生错误,这导致在 Windows 操作系统上出现一些冗余问题。
  • Windows 上的观察程序错误通道出错:Windows system assumed buffer larger than it is, events have likely been missed。 在 Windows 上长时间运行的作业期间,此错误消息会出现在命令行上。
  • Ctrl+C 无法停止正在进行的分析。 为了解决这个问题,可以通过显式终止进程来手动终止进程。
  • 在二进制分析报告中,代码片段标题显示不正确的或不存在的文件路径。

7.6.0.0

  • 标志 --analyze-known-libraries 在 Windows 上不起作用。
  • 在 Windows 上,在分析过程中会生成以下额外文件夹,但在完成后不会自动移除。 您可能想要在分析完成后移除这些额外的文件夹。
    • .metadata
    • org.eclipse.osgi
    • org.eclipse.equinox.app
    • org.eclipse.core.runtime
    • org.eclipse.equinox.launcher
  • 不支持标志 --overrideProviderSettings
  • 不支持标志 --json-output。 在将来的版本中,它将为 output.yamldependency.yaml 文件生成 JSON 输出。
  • 规则问题:
    • 未触发 azure-system-config-01000http-session-01000java-removals-00150 规则。
    • 未触发 FileSystem - Java IO 规则。
    • 运行分析时发生错误 unable to parse all the rules for ruleset。 当工具无法分析规则集中的所有规则时,在分析过程中会发生此错误。
  • 在 Windows 上分析 WAR 文件会产生以下错误:Failed to Move Decompiled File. 在 Windows 上分析 WAR 文件时发生错误,这导致了一些在 Windows 上产生的冗余问题。
  • “见解”选项卡上缺少对某些规则的描述。一些标记规则缺少描述,导致报告的“见解”选项卡上出现空白标题。
  • Windows 上的“观察程序错误”通道出错:Windows system assumed buffer larger than it is, events have likely been missed。 在 Windows 上长时间运行的作业期间,此错误消息会出现在命令行上。
  • 此版本需要活动的互联网连接才能进行依赖项分析。
  • Ctrl+C 无法停止正在进行的分析。 为了解决这个问题,可以通过显式终止进程来手动终止进程。
  • 当标志 --context-lines 设置为数字 0 时,它不会按预期工作。 此标志使用户能够限制应在报表上显示多少源代码。 设置为值 0 可能无法按预期工作。

许可证

适用于 Java 的 Azure Migrate 应用程序和代码评估是免费的、基于开放源代码的工具。

数据收集

默认情况下,AppCAT 收集遥测数据。 Microsoft聚合收集的数据,以识别使用情况模式,以识别常见问题并改进 AppCAT CLI 的体验。 Microsoft AppCAT CLI 不会收集任何私有或个人数据。 例如,使用数据有助于识别成功率较低的命令等问题。 此信息可帮助我们确定工作的优先级。

虽然此数据提供的见解非常有用,但我们也了解并非人人都愿意发送使用情况数据。 可以使用命令禁用数据收集 appcat analyze --disable-telemetry 。 有关详细信息,请参阅我们的隐私声明