使用 WebSphere Application Server 实现构建时 JPA 增强

Comments

简介

JPA 增强是修改实体类,添加监视它们之中的更改并持久保存这些更改的能力的过程。在使用 IBM WebSphere Application Server 所提供的 OpenJPA 时,此增强过程使用了一种称为字节码编织 (byte-code weaving) 的技术。通常,对于 WebSphere Application Server,JPA (Java™ Persistence API) 实体的增强是在初始化 Java EE 应用程序期间执行的。

尽管不需要使用构建时增强,但它确实提供了一定的优势:

  • 因为该增强不需要在每个服务器启动期间完成,所以减少了服务器的启动时间。
  • 如果 JPA 实体传递到 Java EE 应用程序外部,构建时增强可确保序列化或外部化的实体类与客户端中定义的类兼容。

尽管 JPA 一般会在将实体传递到客户端应用程序时将其序列化,但 JPA persistence.xml 文件中的一些设置(比如使用 openjpa.DetachState 属性的 loaded(DetachedStateField=true) 值)会导致 JPA “外部化” 该实体,而不是将它序列化。使用运行时增强时,这些实体只能供同样在实现运行时增强的客户端使用。这意味着客户端必须包含一个 persistence.xml 文件,支持同一个 JPA 运行时,而且在支持运行时增强的环境中运行。使用构建时增强是一种更好的解决方案。

本文将介绍在使用 IBM Rational Application Developer 和 IBM WebSphere Application Server 时,配置 JPA 构建时增强所需执行的步骤。尽管也有其他教程介绍构建时 JPA 增强的设置,但大部分或所有这些教材似乎都要下载额外的 OpenJPA 库才能执行该功能。如果两个 OpenJPA 版本不是完全相同,则可能导致出现问题。这里描述的步骤使用了 WebSphere Application Server 提供的库,所以它们将始终兼容。

配置构建时增强

构建时增强的设置可通过 3 个主要步骤轻松完成,下面几节将会介绍这些步骤。

1. 创建 WebSphere Application Server 安装的引用

第一步是创建一个 classpath 变量来定义 WebSphere Application Server 的安装目录。

  1. 在 Rational Application Developer 中,从菜单栏导航到 Windows > Preferences
  2. 在 Preferences 面板中,选择 Java > Build Path > Classpath Variables
  3. 单击 New 按钮。对于 Name 字段,输入 WAS_HOME。使用 Folder... 按钮找到 WebSphere Application Server 安装目录并单击 OK。(WebSphere Application Server 安装目录通常以 “AppServer” 结尾。)现在单击 New Variable Entry 面板中的 OK(参见图 1)。
    图 1. New Variable Entry
    New Variable Entry
    New Variable Entry

2. 创建 build.xml 文件

build.xml 文件定义增强 JPA 实体所需的过程和引用。

  1. 右键单击 JPA 项目中的 src 文件夹并选择 New > Other...
  2. 在 New 面板中的 General 文件夹下,选择 File 并单击 Next(参见图 2)。
    图 2. 选择一个向导
    选择一个向导
    选择一个向导
  3. 输入 build.xml 作为文件名,然后单击 Finish(参见图 3)。
    图 3. 创建一个新文件资源
    创建一个新文件资源
    创建一个新文件资源
  4. 将清单 1 中所示的代码插入到 build.xml 文件中,以用作起点。
    清单 1. build.xml
    <project  name="MyProject" default="defaultBuild">
       <!-- set global properties for this build -->
       <property  name="src" location="src"/> 
          <!-- Location of JPA entity .java files in relation to project -->
       <property  name="bin" location="src"/> 
          <!-- Location of JPA entity .class files in relation to project -->
    
       <target  name="enhance">
          <path  id="enhance.classpath">
             <pathelement  location="${was.home}/dev/JavaEE/j2ee.jar"/>
             <pathelement  location="${was.home}/plugins/com.ibm.ws.jpa.jar"/>
             <pathelement  location="${was.home}/plugins/com.ibm.ws.prereq.commons-collections.jar"/>
             <pathelement  location="${bin}"/>
                 <!-- Where the entity .class files are -->
             <pathelement  location="${src}/../../<project>/"/> 
                <!-- Use for reference to class outside this project if needed -->
          </path>
          <property  name="cp" refid="enhance.classpath"/>
          <echo  message="Classpath: ${cp}"/>
          <echo  message="Source:    ${src}"/>
          <echo  message="Bin:       ${bin}"/>
          <java  classname="org.apache.openjpa.enhance.PCEnhancer" 
                logError="true" failonerror="false" fork="true">
             <classpath  refid="enhance.classpath"/>
             <arg  value="-properties" />
             <arg  value="${src}/META-INF/persistence.xml" />
          </java>
       </target>
    
       <target  name="defaultBuild" depends="enhance"/>
    
    </project>
  5. 尽管上面的 build.xml 文件内容应适合大部分 JPA 项目,但您可能仍然需要修改一些地方。例如:
    • src 属性位置值应指向项目中包含 Java 源文件的目录,该目录通常是 src 文件夹。
    • bin 属性位置值应指向项目中存储类文件的目录。在这个示例中,它们和 Java 源文件一起存储在 src 目录中。如果将类文件存储在不同的目录中,可能需要将该位置设置为 bin
    • 如果从您的实体中引用了 JPA 项目外部的类,则需要为每个项目引用包含一个 pathelement。在下一步中,您将看到一个已提供的条目,可将其中的 <project> 替换为您引用的项目。您可能需要附加一个额外的目录,比如 bin/,具体情况取决于该项目的类文件的位置。如果没有 JPA 项目外部的引用,那么删除该 pathelement 行即可。
  6. 保存文件。

3. 创建 Ant 构建器

Ant 构建器是 Rational Application Developer 调用的一个任务,它将利用 build.xml 文件中的信息来增强 JPA 实体。

  1. 从菜单栏中选择 Project > Properties
  2. 在 Properties 面板中,选择 Builders
  3. 单击 New...按钮。在 Choose configuration type 对话框中,选择 Ant Builder 并单击 OK
  4. 更新 Edit Configuration 面板的 Main 选项卡中的以下字段(参见图 4)。(屏幕截图中的 JPA 项目称为 “TutorialJPA”。)
    • 提供一个名称,比如 AntBuilder 或任何您最喜欢的名称。
    • 对于 Buildfile,单击 Browse Workspace... 导航到您第 2 步中创建的 build.xml 文件。选择 build.xml 文件并单击 OK
    • 对于 Base Directory,单击 Browse Workspace... 来选择 JPA 项目。单击 OK
    • 在 Arguments 字段中,输入 "-Dwas.home=${WAS_HOME}"(包含引号)。这会将 build.xml 文件中使用的 was.home 变量连接到类路径变量 WAS_HOME
    • 不要单击 OK。
    图 4. 创建 Ant 构建配置
    创建 Ant 构建配置
    创建 Ant 构建配置
  5. 选择 Targets 选项卡并更新这些字段(参见图 5):
    • 在 After a "Clean" 部分中,单击 Set Targets...。取消选择 DefaultBuild [default] 目标并单击 Set Targets 面板上的 OK
    • 在 Manual Build 部分中,默认目标应已选择。如果没有,则单击 Set Targets...。选择 DefaultBuild [default] 目标并单击 Set Targets 面板上的 OK
    • 在 Auto Build 部分中,单击 Set Targets...。选择 DefaultBuild [default] 目标并单击 Set Targets 面板上的 OK
    • 在 During a "Clean" 部分中,构建器应该已经被设置为不运行。
    图 5. 目标配置参数
    目标配置参数
    目标配置参数
  6. 单击 OK 保存新构建器。
  7. 现在单击 Properties 面板上的 OK

您的构建时增强设置现在应已完成。您应在控制台窗口中看到清单 2 中所示的消息,因为 Ant Builder 增强已自动运行。

清单 2. Ant 构建器消息
Buildfile: C:\MyWorkspace\TutorialJPA\src\build.xml
Trying to override old definition of datatype description
Trying to override old definition of datatype artifact

enhance:
        [echo] Classpath: C:\Progra~2\IBM\WebSphere\AppServer\dev\JavaEE\j2ee.jar;C:
\Progra~2\IBM\WebSphere\AppServer\plugins\com.ibm.ws.jpa.jar;C:\Progra~2\IBM\WebSphere
\AppServer\plugins\com.ibm.ws.prereq.commons-collections.jar;C:\MyWorkspace\TutorialJPA.
\src;C:\MyWorkspace\ReferencedProject
        [echo] Source:    C:\MyWorkspace\TutorialJPA\src
        [echo] Bin:       C:\MyWorkspace\TutorialJPA\src
        [java] 62  testJpa  INFO   [main] openjpa.Tool - No targets were given.  Running 
on all classes in your persistent classes list, or all metadata files in classpath 
directories if you have not listed your persistent classes.  Use -help to display tool 
usage information.

defaultBuild:
BUILD SUCCESSFUL
Total time: 7 seconds

结束语

通过完成本文中描述的过程,您可以将 JPA 项目设置为在构建它时增强实体。完成该设置后,WebSphere Application Server 将不再需要在启动期间执行此操作。此外,对 JPA 实体的任何引用都会自动引用增强版本,以实现完全兼容。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere, Rational
ArticleID=970003
ArticleTitle=使用 WebSphere Application Server 实现构建时 JPA 增强
publish-date=04292014