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

适用于 Java 的 Azure Migrate 应用程序和代码评估

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

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

该工具为开放源代码且基于 WindUp,这是一个由 Red Hat 创建并发布在 Eclipse 公共许可证下的项目。

概述

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

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

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

支持的目标

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

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

目标 说明 ID
Azure 应用程序服务 部署应用到 Azure 应用程序服务的最佳做法。 azure-appservice
Azure Kubernetes 服务 部署应用到 Azure Kubernetes 服务的最佳做法。 azure-aks
Azure Container Apps 部署应用到 Azure 容器应用的最佳做法。 azure-container-apps
云就绪 使应用程序云 (Azure) 准备就绪的一般最佳做法。 cloud-readiness
发现 标识库和框架等技术使用情况。 discovery
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 Front Door

下载

若要使用 appcat CLI,必须下载下一部分所述的 ZIP 文件,并且计算机上安装有兼容的 JDK 11 或 JDK 17。 appcat CLI 可在任何与 Java 兼容的环境(如 Windows、Linux 或 Mac)上运行,同时也支持 Intel、Arm 和 Apple Silicon 硬件。 建议使用 Microsoft 版 OpenJDK

有关详细信息,请参阅“发行说明”部分

已知问题

分析特定 Lambda 表达式时,可能无法触发某些规则。 有关详细信息,请参阅相应 GitHub 问题

在具有复杂双字节字符的非 unicode 环境中运行 appcat 将导致损坏。 如需了解应变方法,请参阅相应 GitHub 问题

以前的版本

以下早期版本也可供下载:

开始使用

若要运行 appcat,请确保已安装受支持的 JDK。 该工具支持以下 JDK:

  • Microsoft Build of OpenJDK 11
  • Microsoft Build of OpenJDK 17
  • Eclipse Temurin™ JDK 11
  • Eclipse Temurin™ JDK 17

安装有效的 JDK 后,请确保在 JAVA_HOME 环境变量中正确配置其安装目录。

若要继续,请下载包并将其解压缩到所选的文件夹中。 然后获取以下目录结构:

appcat-cli-<version>    # APPCAT_HOME
  ├── README.md
  ├── bin
  │   ├── appcat
  │   └── appcat.bat
  ├── docs
  │   └── appcat-guide.html
  └── samples
      ├── airsonic.war
      ├── run-assessment
      ├── run-assessment-custom-rules
      ├── run-assessment-exclude-packages
      ├── run-assessment-no-code-report
      ├── run-assessment-openjdk21
      ├── run-assessment-zip-report
      └── run-discovery
  • docs:此目录包含 appcat 的文档。
  • bin:此目录包含 appcat CLI 可执行文件(适用于 Windows/Linux/Mac)。
  • 示例:此目录包含一个示例应用程序和多个脚本,用于针对示例应用程序运行 appcat

若要运行该工具,请打开终端会话,并从 $APPCAT_HOME/bin 目录中键入以下命令:

./appcat --help

若要从计算机中的任何位置运行该工具,请将目录 $APPCAT_HOME/bin 配置为 PATH 环境变量,然后重启终端会话。

文档

以下指南提供了适用于 appcat 的 Java 的主要文档:

在不考虑 Azure 服务的情况下,发现技术使用情况和云就绪情况

发现技术和云就绪目标有助于深入了解应用程序的重新平台化以及迁移到云的现代化改造。 该工具会扫描应用程序及其组件,全面了解其结构、体系结构和依赖项。 它还会发现在云环境中可能具有挑战性的潜在问题。 特别是 discovery 目标用于创建应用程序及其组件的详细清单。 此清单是进一步分析和规划的基础。 有关详细信息,请参阅发现报告部分。

使用以下命令启动发现和云就绪:

./appcat \
    --input ./<my-application-source-path or my-application-jar-war-ear-file> \
    --target discovery cloud-readiness

当你还没有决定要将应用程序部署到哪一种具体的 Azure 服务时,这种类型的报告非常有用。

该工具始终执行 discovery,而无论你是否在 --target 参数中包括了该值。

评估 Java 应用程序

评估阶段中,appcat CLI 会分析应用程序及其组件,以确定其适合重新平台化,并确定任何潜在的挑战或限制。 此阶段涉及分析应用程序代码并检查其对所选目标的符合性。

可以使用带空格分隔的值列表和 --target 参数来选择多个目标。

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

./appcat --listTargetTechnologies

此命令会生成类似于以下示例的输出:

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

然后,可以使用其中一个可用的目标或其组合运行 appcat,如以下示例所示:

./appcat \
    --input ./<my-application-source-path or my-application-jar-war-ear-file> \
    --target cloud-readiness linux azure-appservice

还可以使用其中一个可用的 OpenJDK 目标运行 appcat,如以下示例所示:

./appcat \
    --input ./<my-application-source-path or my-application-jar-war-ear-file> \
    --target openjdk11

对于 OpenJDK (Java) 目标,建议一次只选择一个。

Azure 评估目标建议

每当评估 Azure 部署的应用程序时,建议从以下目标开始:

  • discovery
  • cloud-readiness

此外,请指定用于部署的 Azure 服务,例如 azure-appserviceazure-container-apps

如果打算将应用程序从 Windows 环境移动到 Linux VM 或容器中,建议另外添加 linux 目标。

如果打算将应用程序从旧版 JDK 移动到较新版本,我们建议选择下一个主要版本,而不是应用程序正在使用的上一个版本。 例如,当应用程序当前使用 Java 8 进行部署时,请使用 openjdk11

从 appcat 获取结果

发现和评估阶段的结果是一份详细的报告,提供 Java 应用程序的重新平台化和现代化路线图,包括针对 Azure 服务和重新平台化方法的建议。 该报告是重新平台化过程的下一阶段的基础。 它可帮助组织了解此类转换所需的工作量,并做出有关如何实现应用程序现代化以获得最大好处的决定。

appcat 生成的报告全面概述了应用程序及其组件。 可以使用此报表来深入了解应用程序的结构和依赖项,并确定其是否适合进行重新平台化和现代化。

以下各节介绍了有关该报告的详细信息。

分析摘要

报告的登陆页面列出了应用程序中使用的所有技术。 仪表板提供分析摘要,其中包括转换事件数、事件类别或故事点。

appcat 摘要报表的屏幕截图。

放大“按类别划分的事件”饼图,可以看到按类别划分的事件数量:必需可选潜在信息

仪表板还会显示故事点。 故事点是敏捷软件开发中常用的抽象指标,用于估算实现功能或更改所需的工作量级别。 appcat 使用故事点来表达迁移特定应用程序所需的工作量级别。 故事点不一定会转换为工作时间,但该值应在任务之间保持一致。

AppCAT 摘要事件报告的屏幕截图。

发现报告

发现报告是在发现阶段生成的报告。 它显示应用程序在“信息”类别中使用的技术列表。 此报告只是告知你 appcat 发现的技术使用情况。

appcat 发现报告的屏幕截图。

评估报告

评估报告概述了将应用程序迁移到 Azure 时需要解决的转换问题。

这些问题(也称为事件)具有严重性(必需可选潜在信息)、工作量级别,以及指示故事点的数字。 故事点数通过计算事件数量乘以解决问题所需的工作量来确定。

AppCAT 评估报告的屏幕截图。

特定问题的详细信息

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

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

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

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

自定义规则

你可以将 appcat 视为规则引擎。 它使用规则从 Java 存档中提取文件、反向编译 Java 类、对文件类型进行扫描和分类、分析这些文件并生成报告。 在 appcat 中,规则以规则集的形式定义。 规则集是单个规则的集合,这些规则定义 appcat 可在分析期间检测到的特定问题或模式。

这些规则在 XML 中定义,并使用以下规则模式:

when (condition)
    perform (action)
    otherwise (action)

appcat 提供一组全面的标准迁移规则。 由于应用程序可能包含自定义库或组件,因此 appcat 让你可以编写自己的规则,来标识现有规则集可能涵盖的组件或软件的使用。

若要编写自定义规则,请使用以 XML 表示的丰富域特定语言 (DLS)。 例如,假设你想要一个规则来标识 Java 应用程序中 PostgreSQL JDBC 驱动程序的使用,并建议改用 Azure PostgreSQL 灵活服务器。 需要一个规则来查找 Maven pom.xml 文件或 Gradle 文件中定义的 PostgreSQL JDBC 驱动程序,例如以下示例所示的依赖项:

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <scope>runtime</scope>
</dependency>

为了检测此依赖项的使用,规则会使用以下 XML 标记:

  • ruleset:规则集的唯一标识符。 规则集是与特定技术相关的一个规则集合。
  • targetTechnology:规则所面向的技术。 在这种情况下,该规则面向 Azure 应用程序服务、Azure Kubernetes 服务 (AKS) 和 Azure 容器应用。
  • rule:单个规则的根元素。
  • when:触发规则必须满足的条件。
  • perform:触发规则时要执行的操作。
  • hint:报告中会显示的信息,其类别(信息、可选或必需)以及解决问题所需的工作量,范围为从 1(易)到 13(困难)。

以下 XML 显示了自定义规则定义:

<ruleset id="azure-postgre-flexible-server"
         xmlns="http://windup.jboss.org/schema/jboss-ruleset"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://windup.jboss.org/schema/jboss-ruleset http://windup.jboss.org/schema/jboss-ruleset/windup-jboss-ruleset.xsd">
    <metadata>
        <description>Recommend Azure PostgreSQL Flexible Server.</description>
        <dependencies>
            <addon id="org.jboss.windup.rules,windup-rules-xml,3.0.0.Final"/>
        </dependencies>
        <targetTechnology id="azure-appservice"/>
        <targetTechnology id="azure-aks"/>
        <targetTechnology id="azure-container-apps"/>
    </metadata>
    <rules>
        <rule id="azure-postgre-flexible-server">
            <when>
                <project>
                    <artifact groupId="org.postgresql" artifactId="postgresql"/>
                </project>
            </when>
            <perform>
                <hint title="Azure PostgreSQL Flexible Server" category-id="mandatory" effort="7">
                    <message>The application uses PostgreSQL. It is recommended to use Azure PostgreSQL Flexible Server instead.</message>
                    <link title="Azure PostgreSQL Flexible Server documentation" href="https://learn.microsoft.com/azure/postgresql/flexible-server/overview"/>
                </hint>
            </perform>
        </rule>
    </rules>
</ruleset>

通过 appcat 执行此规则后,重新运行分析以查看生成的报告。 与其他事件一样,评估报告列出了与此规则相关的已识别问题和受影响的文件。

正在执行规则的 appcat 的屏幕截图。

azure.github.io/appcat-docs/rules-development-guide 提供了规则开发的完整指南。

发行说明

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 应用程序和代码评估。

许可证

适用于 Java 的 Azure Migrate 应用程序和代码评估是免费的开源工具,并且根据与上游 WindUp 项目相同的许可证获得许可。

常见问题解答

问:可从何处下载最新版本的 Azure Migrate 应用程序和 Java 代码评估?

可以从 aka.ms/appcat/azure-appcat-cli-latest.zip 下载 appcat

问:在哪里可以找到有关适用于 Java 的 Azure Migrate 应用程序和代码评估的详细信息?

下载 appcat 时,会获取包含入门所需的所有信息的文档目录。

问:在哪里可以找到特定的 Azure 规则?

Appcat 规则集 GitHub 存储库中提供了所有 Azure 规则。

问:在哪里可以找到有关创建自定义规则的详细信息?

请参阅适用于 Java 的 Azure Migrate 应用程序和代码评估的规则开发指南

问:创建自定义规则时,我在哪里可以获得一些帮助?

获取帮助的最佳方式是在 appcat 规则集 GitHub 存储库上创建问题