应用程序现代化是一个旅程。没有魔法。通过几个小步骤对应用程序进行现代化是我推荐的方法。在本文中,我将介绍如何使用现代 WebSphere Liberty 运行时实现 WebSphere Traditional 应用程序的现代化。
本文是一系列文章的一部分,这些文章介绍了如何使用现代技术对 2010 年的示例 Java EE 应用程序进行现代化改造。
示例应用程序是一个简单的电子商务应用程序。所有后续现代化步骤的原始应用程序和源代码都可以在 GitHub 上以开源形式获得。
本系列的第一部分解释了如何在容器中运行 WebSphere Traditional 应用程序。本部分继续介绍如何使用针对容器优化的现代 WebSphere Liberty 运行时。
WebSphere Liberty 是一个全面、灵活且安全的 Java EE 和 MicroProfile 应用程序服务器,用于实现应用程序和云原生服务的现代化和构建。
IBM WebSphere Liberty 是一个 Java EE 应用程序服务器,具有专为云原生应用程序和微服务设计的低开销 Java 运行时环境。WebSphere Liberty 的创建具有高度可组合性、快速启动、使用更少的内存和易于扩展。
WebSphere Liberty 体系结构与开源 IBM Open Liberty(链接位于 IBM 外部)服务器运行时共享相同的代码库。这提供了额外的好处,例如低成本的实验、定制和从开源到生产的无缝迁移。
WebSphere Liberty 映像
需要做的第一件事是定义应用程序的运行时。有许多不同的 WebSphere Liberty 映像可用,它们具有不同的优点和缺点。它们以多种方式区分:JVM、JDK 版本、Java 版本、UBI 映像等。在 DockerHub 上查看这些图像的标签:
这是我用过的 Dockerfile:
FROM ibmcom/websphere-liberty:20.0.0.12-kernel-java8-openj9-ubi
USER root
COPY ./liberty/server.xml /config
COPY ./liberty/server.env /config
COPY ./liberty/jvm.options /config
ARG SSL=false
ARG MP_MONITORING=false
ARG HTTP_ENDPOINT=false
COPY ./CustomerOrderServicesApp/target/CustomerOrderServicesApp-0.1.0-SNAPSHOT.ear /config/apps/CustomerOrderServicesApp-0.1.0-SNAPSHOT.ear
COPY ./resources/ /opt/ibm/wlp/usr/shared/resources/
RUN chown -R 1001.0 /config /opt/ibm/wlp/usr/servers/defaultServer /opt/ibm/wlp/usr/shared/resources && chmod -R g+rw /config /opt/ibm/wlp/usr/servers/defaultServer /opt/ibm/wlp/usr/shared/resources
USER 1001
RUN configure.sh
请注意,对于开发环境,可以忽略最后一行“RUN configure.sh”。有人告诉我,这“仅”对生产环境有用。不执行此脚本将在开发过程中为您节省大量时间。
WebSphere Liberty 配置
在下一步中,您需要定义pom.xml文件,或者在本例中定义不同的pom.xml文件。旧的 Java 项目通常使用各种子项目来生成不同的工件:耳朵、战争和罐子。我将在接下来的博客中写更多关于这方面的内容。
在pom.xml中,您应该声明对 Java EE 或现在的 Jakarta EE 的依赖关系。在许多情况下,这涵盖了大多数必要的依赖关系。
<dependency>
<groupId>javaee</groupId>
<artifactId>javaee-api</artifactId>
<version>8</version>
<scope>provided</scope>
</dependency>
接下来,需要定义 Liberty 服务器配置,以描述要使用哪些功能部件、如何访问数据库、HTTP 端点等。
这是我用过的:
<server>
<featureManager>
<feature>appSecurity-2.0</feature>
<feature>ldapRegistry-3.0</feature>
<feature>localConnector-1.0</feature>
<feature>ejbLite-3.1</feature>
<feature>jaxrs-1.1</feature>
<feature>jdbc-4.1</feature>
<feature>jpa-2.0</feature>
<feature>jsp-2.3</feature>
<feature>servlet-3.1</feature>
</featureManager>
<library id="DB2Lib">
<fileset dir="/opt/ibm/wlp/usr/shared/resources/db2" includes="db2jcc4.jar db2jcc_license_cu.jar"/>
</library>
<dataSource id="OrderDS" jndiName="jdbc/orderds" type="javax.sql.XADataSource">
<jdbcDriver libraryRef="DB2Lib"/>
<properties.db2.jcc databaseName="${env.DB2_DBNAME}" password="${env.DB2_PASSWORD}" portNumber="${env.DB2_PORT}" serverName="${env.DB2_HOST}" user="${env.DB2_USER}"/>
<connectionManager agedTimeout="0" connectionTimeout="180" maxIdleTime="1800" maxPoolSize="10" minPoolSize="1" reapTime="180"/>
</dataSource>
<httpEndpoint host="*" httpPort="9080" httpsPort="9443" id="defaultHttpEndpoint">
<tcpOptions soReuseAddr="true"/>
</httpEndpoint>
<application id="customerOrderServicesApp" name="CustomerOrderServicesApp-0.1.0-SNAPSHOT.ear" type="ear" location="CustomerOrderServicesApp-0.1.0-SNAPSHOT.ear">
<classloader apiTypeVisibility="spec, ibm-api, third-party" />
</application>
</server>
代码更改 - WebSphere Application Server Migration Toolkit
最具挑战性的部分是进行必要的代码更改。WebSphere Application Server Migration Toolkit 是一个很大的帮助!
您可以在 Eclipse 中安装该工具包并创建“软件分析器配置”。
选择选项“WebSphere Application Server 版本迁移”。
选择源和目标。
在此示例中,需要执行三个代码更改。结果可以在“软件分析器配置”视图中找到,尤其是在“Java 代码审阅”选项卡下。
第一个必要的更改是替换“org.codehaus.jackson”的用法。Eclipse 的 “Help” 视图很容易描述需要更改的内容。
下一个需要的更改是将 ‘com.ibm.json’ 替换为 Java EE 中的开源包。
第三个更改是 EJB 查找(在最新的 Liberty 版本中可能不再需要查找)。
转型顾问
除了 Eclipse Migration Toolkit 之外,Transformation Advisor 还显示其中一些结果。查看我之前的文章如何运行此工具。
以下是 Transformation Advisor 的结果:
之所以没有显示所有三个必要的代码更改,是因为 Transformation Advisor 试图使现代化尽可能简单。因此,该工具建议升级到 Open Liberty with Java EE 7,而不是显示升级到 Java EE 8 的 WebSphere Liberty 的结果,因为需要的更改较少。
下一步是什么?
在下一篇文章中,我将介绍如何将前端与业务逻辑分开。
本系列的所有文章都可以在 repo 中找到。