Java 移植分析
我们将介绍的最后一项功能是 Java 迁移分析,它允许您生成有关应用程序准备情况的报告,以迁移到较新版本的 JDK。所有 Oracle LTS Java 发行版以及上次发布的 Oracle JDK 都受支持。分析报告将为您提供与切换到所需 JDK 主要版本相关的努力和风险。
注意:
应用分析是在托管实例上完成的,分析期间会消耗更多资源。OCI 云控制台
- 以管理员身份登录 OCI 控制台。
- 打开导航菜单,单击可观察性和管理,然后单击 Java 管理下的组。
- 选择您的组。
- 单击托管实例,然后单击运行应用程序的托管实例。
- 单击应用程序并选择应在其上启动 Java 迁移分析的应用程序。
- Click Actions and select Start Java migration analysis.
- 单击启动。
- 完成工作请求后,单击工作请求,并在详细信息中导航到组存储桶中的 Java 迁移分析文件。
OCI CLI
- 使用以下命令创建目标有效负载模板:
ci jms fleet request-java-migration-analyses --generate-param-json-input targets
- 查找有关应用程序的详细信息,例如:
oci jms application-installation-usage-summary summarize-application-installation-usage --display-name-contains $APP_NAME --fleet-id $FLEET_OCID
- 编辑有效负载 json 文件,例如:
[ { "applicationInstallationKey": "$APP_INSTALL_KEY", "managedInstanceId": "$MANAGED_INSTANCE_OCID", "sourceJdkVersion": "$CURRENT_MAJOR_JAVA_RUNTIME_VERSION_USED_BY_APP", "targetJdkVersion": "$NEXT_JAVA_VERSION" } ]
- 执行以下命令:
oci jms fleet request-java-migration-analyses --fleet-id $FLEET_OCID --targets file://target.json
范例
JMS 迁移分析的用途很简单:帮助将应用迁移到更新的 Java 版本。在本示例中,我们将使用一个简单的 Java 8 应用程序,我们想知道我们需要在哪些方面投入精力使应用程序在 Java 21 上运行:
#!/usr/bin/env bash
# configuration variables
APP_NAME=JMigrateExampleApp
FLEET_OCID=ocid1.jmsfleet.oc1.eu-frankfurt-1.amaaaaaaptiaquqa2qxxkco6hrguz7nyug2hcpgikhe5gz4d7uy6j6ilbtta
MANAGED_INSTANCE_OCID=ocid1.instance.oc1.eu-frankfurt-1.antheljtptiaquqcrjmnu7mxbjthm2jm5qzryu7xy4w27rfo56nxf4uwv6pq
CURRENT_MAJOR_JAVA_RUNTIME_VERSION_USED_BY_APP=1.8
NEXT_JAVA_VERSION=21
# get application installation key
APP_INSTALL_KEY=$(oci jms application-installation-usage-summary summarize-application-installation-usage --display-name-contains $APP_NAME --fleet-id $FLEET_OCID | jq -r '.data.items[]."application-installation-key"')
# JMigrate payload
cat > jmigrate-payload.json << EOF
[
{
"applicationInstallationKey": "$APP_INSTALL_KEY",
"managedInstanceId": "$MANAGED_INSTANCE_OCID",
"sourceJdkVersion": "$CURRENT_MAJOR_JAVA_RUNTIME_VERSION_USED_BY_APP",
"targetJdkVersion": "$NEXT_JAVA_VERSION"
}
]
EOF
# start java migration analysis on specified managed instance
WORK_REQUEST_OCID=$(oci jms fleet request-java-migration-analyses \
--fleet-id "$FLEET_OCID" \
--targets file://jmigrate-payload.json | jq -r '."opc-work-request-id"')
echo $WORK_REQUEST_OCID
rm jmigrate-payload.json
# additionally, you can add your own logic to check if work request is finished
# sleep 600
# oci jms work-request get --work-request-id "$WORK_REQUEST_OCID" | jq .data.status
成功完成 JMigrate 工作请求后,我们可以在 JMS 中找到该报告并使用以下语句显示其内容:
#!/usr/bin/env bash
# configuration variables
FLEET_OCID=ocid1.jmsfleet.oc1.eu-frankfurt-1.amaaaaaaptiaquqa2qxxkco6hrguz7nyug2hcpgikhe5gz4d7uy6j6ilbtta
WORK_REQUEST_OCID=ocid1.jmsworkrequest.oc1.eu-frankfurt-1.aaaaaaaapqrtnlvfyltloscefazwuuoyd6pdqpsmaxfnirregqirx3b7jbva
# get the analysis id, there can be multiple ids but, in our example, we expect just one
ANALYSIS_OCID=$(oci jms java-migration-analysis-result list --fleet-id $FLEET_OCID --sort-by timeCreated --sort-order DESC | jq -r ".data.items[] | select(.\"work-request-id\"==\"$WORK_REQUEST_OCID\") | .id")
# See the result
oci jms java-migration-analysis-result get --fleet-id $FLEET_OCID --java-migration-analysis-result-id $ANALYSIS_OCID
{
"data": {
"application-execution-type": "INSTALLED",
"application-key": "38d3d5b89e9e42da00c5be9bdbee216a0e297c2ea942330e5af4051c4951b50a",
"application-name": "JmigrateExample.jar",
"application-path": "/home/opc/JmigrateExample.jar",
"bucket-name": "jms_ocid1.jmsfleet.oc1.eu-frankfurt-1.amaaaaaaptiaquqa2qxxkco6hrguz7nyug2hcpgikhe5gz4d7uy6j6ilbtta",
"fleet-id": "ocid1.jmsfleet.oc1.eu-frankfurt-1.amaaaaaaptiaquqa2qxxkco6hrguz7nyug2hcpgikhe5gz4d7uy6j6ilbtta",
"host-name": "jms-demo",
"id": "ocid1.jmsreport.oc1.eu-frankfurt-1.amaaaaaalzyjypyaa4puer7qtjn2s3zih55ir5jzma4lyiulxpy7qn3xtbhq",
"managed-instance-id": "ocid1.instance.oc1.eu-frankfurt-1.antheljtptiaquqcrjmnu7mxbjthm2jm5qzryu7xy4w27rfo56nxf4uwv6pq",
"metadata": null,
"namespace": "frmss8xk2qta",
"object-list": [
"diagsbyapi-summary-counts.json",
"diagsbyclass-p3.json",
"diagsbyapi-p1.json",
"diagsbyclass-p4.json",
"JmigrateExample.jar.zip",
"diagsbyclass-p1.json",
"diagsbyapi-p4.json",
"diagsbyapi-p4-summary.json",
"execsummary.json",
"diagsbyapi-p3-summary.json",
"diagsbyapi-p1-summary.json",
"diagsbyapi-p2-summary.json",
"diagsbyapi-p2.json",
"jarsummaries-without-classsummaries.json",
"diagsbyapi-p3.json",
"diagsbyclass-summary-counts.json",
"diagsbyclass-p2.json"
],
"object-storage-upload-dir-path": "JMS/JAVA_MIGRATION/ocid1.jmsfleet.oc1.eu-frankfurt-1.amaaaaaaptiaquqa2qxxkco6hrguz7nyug2hcpgikhe5gz4d7uy6j6ilbtta/ocid1.instance.oc1.eu-frankfurt-1.antheljtptiaquqcrjmnu7mxbjthm2jm5qzryu7xy4w27rfo56nxf4uwv6pq/2025-07-09T14:33:49.750Z_ocid1.jmsworkrequest.oc1.eu-frankfurt-1.aaaaaaaapqrtnlvfyltloscefazwuuoyd6pdqpsmaxfnirregqirx3b7jbva_JmigrateExample.jar/7adcab9b-1556-443d-9a86-a41f3e5bbb45/",
"source-jdk-version": "1.8",
"target-jdk-version": "21",
"time-created": "2025-07-09T14:41:16.353000+00:00",
"work-request-id": "ocid1.jmsworkrequest.oc1.eu-frankfurt-1.aaaaaaaapqrtnlvfyltloscefazwuuoyd6pdqpsmaxfnirregqirx3b7jbva"
}
}
分析数据存储在对象存储服务中,可以通过从分析结果获取数据来实现,例如,提供了名称空间 bucket-name
,然后在 object-list
中定义了文件列表,对于每个文件,我们可以通过从 object-list
连接 object-storage-upload-dir-path
和项来获取路径。
oci os object get --bucket-name jms_ocid1.jmsfleet.oc1.eu-frankfurt-1.amaaaaaaptiaquqa2qxxkco6hrguz7nyug2hcpgikhe5gz4d7uy6j6ilbtta --name JMS/JAVA_MIGRATION/ocid1.jmsfleet.oc1.eu-frankfurt-1.amaaaaaaptiaquqa2qxxkco6hrguz7nyug2hcpgikhe5gz4d7uy6j6ilbtta/ocid1.instance.oc1.eu-frankfurt-1.antheljtptiaquqcrjmnu7mxbjthm2jm5qzryu7xy4w27rfo56nxf4uwv6pq/2025-07-09T14:33:49.750Z_ocid1.jmsworkrequest.oc1.eu-frankfurt-1.aaaaaaaapqrtnlvfyltloscefazwuuoyd6pdqpsmaxfnirregqirx3b7jbva_JmigrateExample.jar/7adcab9b-1556-443d-9a86-a41f3e5bbb45/jarsummaries-without-classsummaries.json --file -
[ {
"url" : "jar:file:/home/opc/JmigrateExample.jar",
"archiveType" : "JAR",
"classCount" : 3,
"classesWithDiagnosticsCount" : 3,
"p1Count" : 31,
"totalDiagnosticsCount" : 31
} ]%
为了获得更好的用户体验,我们建议使用 OCI JMS 云控制台,在控制台中很好地呈现报告,以提供有关迁移的所有必要详细信息。