分析应用程序代码

您可以运行代码分析器来分析代码并创建源代码的检测版本。 该分析是将 Java® 单体应用程序重构为分区的第一步。

代码分析器

代码分析器从用作 AI 引擎输入的 Java 单片应用程序的应用程序代码中收集静态数据,这将生成分区建议。 此静态数据还需要作为 二进制检测器的输入,后者从已部署的应用程序收集运行时数据。 当代码分析器扫描 Java 代码时,它会生成四个文件。 JSON 文件包含有关已扫描的类和 Binary Instrumenter 配置的元数据。 元数据包括类名称、其类型化成员属性、构造函数、具有输入参数和返回类型的方法以及类的源文件位置等信息。

代码分析器还可以检测 Java 单片应用程序的源代码,以便在这些应用程序运行时收集运行时跟踪。 代码分析器扫描应用程序的所有 Java 类,以在所有类方法 (包括构造函数) 中插入 System.err.println("Entering...")System.err.println("Exiting...") 格式的检测语句。 使用代码分析器完成代码检测后,重新构建并重新部署 Java 整体式应用程序。

源代码检测是代码分析器不推荐使用的功能。 二进制检测者是在运行业务用例时收集运行时跟踪的建议选项,因此不需要重新构建和重新部署 Java 整体式应用程序。

先决条件

确保满足 系统需求

过程

  1. Java 单片应用程序的二进制归档文件放在目录结构中。

    有效的 Java 归档文件格式包括 .cba.class.ear.eba.jar.war。 同样有效的还有包含 Java 归档二进制文件的 .rar.zip 文件。

  2. 针对应用程序的二进制文件运行代码分析器。

    运行 analyze 命令。 要获取命令帮助,请添加 -h 选项。

    mono2micro analyze -a <binary-file-path>

    以下信息解释了该命令的语法:

    • <binary-file-path> 变量是要分析的应用程序的二进制文件的路径名。 缺省情况下, analyze 命令会在具有多个 JSON 文件的用户工作目录上创建名为 binary-file-mono2micro 的目录。

      您可以添加 -o 选项以指定生成的 JSON 文件的输出目录路径。 运行代码分析器的用户必须对 /<output-dir-path>/ 目录具有读写访问权。

      mono2micro analyze -a <binary-file-path> -o <output-dir-path>
    • 您可以为将跟踪发送到标准输出流的二进制检测程序生成配置。 缺省情况下,二进制检测器使用 System.err.println() 语句来检测 Java 代码,以在标准错误流中生成 IBM Mono2Micro 运行时跟踪。 如果使用了 mono2micro instrument 命令,那么将 --instrumentation-target 选项设置为 out 值也适用于源检测。

标准错误和标准输出流的示例

对于标准错误流,请运行以下命令:

mono2micro analyze -a /apps/daytrader-ee7.ear

对于标准输出流,请运行以下命令:

mono2micro analyze -a /apps/daytrader-ee7.ear --instrumentation-target out

控制用于二进制分析的 Java 包列表

二进制分析器检查二进制文件中的所有 Java 类 (缺省情况下排除的包除外)。 您可以使用 -h 选项来检查已排除的包的缺省列表。

以下选项专门用于控制要使用二进制分析器进行分析的 Java 包。 由于分析器未保存任何列表或用户首选项,因此没有任何选项持久存在。 因此,必须为每个执行指定所需的选项。 对于选项,请指定不带空空格的逗号分隔列表,例如:
com.test.app,org.xyz.lib,edu.abc
--add-to-exclude-packages
将包添加到要排除的包的缺省列表中。 二进制分析会排除缺省列表包,还会排除此选项指定的包的列表。
--exclude-packages
从二进制分析中排除此选项指定的包的列表。 将分析除用户指定的这些包中的类以外的所有类,这意味着将忽略缺省包列表。
--include-packages
在二进制分析期间仅分析此选项指定的包的列表。 因为仅分析这些包中的类,所以将忽略缺省包列表。
--analyze-all
强制分析所有类和包。

结果

成功完成分析时,如果未指定输出目录,那么代码分析器将在具有多个文件的用户工作目录上创建名为 binary-file-mono2micro 的目录,其中 binary-file 是已分析的 Java 二进制文件的名称。 例如,如果二进制文件为 daytrader-ee7.ear,那么代码分析器将在用户工作目录中创建名为 daytrader-ee7-mono2micro 的目录。 如果指定了输出选项,那么 JSON 文件将放置在提供的目录中。

分析后,目录包含以下文件:

  • symTable.json
  • refTable.json
  • instrumenter-config.json
  • recommender-config.properties

symTable.jsonrefTable.json 文件包含有关已扫描的类的元数据,例如其名称、位置、属性名称、构造函数和方法。 instrumenter-config.json 文件提供二进制检测程序的配置。 recommender-config.properties 文件指定 Java 应用程序归档在磁盘上的位置以及在分析期间排除或包含的包。

如果在代码分析器上启用了源代码检测,那么对等目录还包含使用 System.err.println() 语句检测的源代码的副本,稍后将使用这些语句来生成 IBM Mono2Micro 运行时跟踪。

代码分析器检测从不打印应用程序的任何变量的值。 检测的目的是记录流经类的各种方法和构造函数的时间流,而不是在运行时期间记录任何变量的值。

当前限制

  • 当您编译由代码分析器检测的代码时,可能会迂到unreachable code编译错误。 在某些边缘情况下,代码分析器检测可能会插入检测语句, Java 编译器会将这些语句检测为不可访问。

    要解决此问题,请除去或注释掉这些不可访问的语句。 删除它们对生成运行时跟踪不会有任何影响。

  • 运行代码分析器时,可能会迂到来自 Java 进程的内存不足错误。 为了解决该问题,请通过为最大堆大小指定较大的值来设置 --java-opts 环境变量。

    例如,要指定最大 Java 堆大小为 512 兆字节,请运行以下任一命令。

    mono2micro analyze -s <src-dir-path>  --java-opts "-Xmx512m"
    mono2micro instrument -s <src-dir-path>  --java-opts "-Xmx512m"
  • 当二进制分析器找到多个具有相同名称和相同包名的 Java 类时,它会分析标识的第一个类,并忽略具有完全相同名称和相同包名的其他类。 如果同一个类打包在二进制归档中的多个二进制文件中,那么可能会出现重复的名称。 在此情况下,将记录警告以报告找到的重复项。 对于大多数情况下,这不是问题,尤其是在找到的类相同时。 但是,如果找到的类在其结构上存在差异,那么这可能是一个问题。

下一步操作

如果要根据应用程序中的业务逻辑获取分区建议,请使用检测来运行 Java 单片应用程序,以生成运行时跟踪文件。 如果您想纯粹根据应用程序的静态分析更快地获得建议,可以检查收集到的数据 ,然后运行人工智能引擎。 您可以使用来自代码分析器以及可选的二进制仪器用例记录器的信息作为 AI 引擎的输入,从而生成分区建议。 请务必将 Java 应用程序归档文件保留在磁盘上的同一位置,以便 AI 引擎可以在分区建议步骤中对其进行进一步分析。

如果您选择通过源检测来收集运行时跟踪文件,那么在代码分析器成功完成检测过程之后,可以在非生产但具有代表性的环境中构建和部署受检测应用程序。 请遵循用于构建和部署原始应用程序的确切过程。 根据环境的不同,应用程序及其检测版本可以在裸机、虚拟机或容器上。