灵活设置 IBM i Java 的系统属性

IBM Technology for Java(IT4J 又名 J9)是 IBM i 支持 Java 的重要组成部分,从 IBM i 7.1 开始,J9 将成为 IBM i 上唯一支持的 JVM。因此,如何灵活使用 J9 变得越来越重要。Java 的系统属性作为配置 JVM 工作环境的重要手段,既可以影响 JVM 的运行方式,也可以为用户程序提供所需信息。本文将介绍 J9 的系统属性设置方法,并给出各种方法的应用场景及优先级。同时,通过具体的示例,帮助开发人员轻松理解各种设置方法。

高 丽, 软件工程师, IBM

高丽,来自 IBM 中国系统与科技研发中心 IBM i J9 团队,目前主要负责 IBM i 上 JVM 的开发工作。



2012 年 3 月 26 日

IBM Technology for Java(IT4J,又名 J9) 是 IBM i 上支持的一款 Java 虚拟机,它从 IBM i 5.4 版本中开始引入,从 6.1 开始,系统默认的 JVM 是 J9,为了提供充足的时间让用户迁移到新的 JVM,仍然在 6.1 上支持 Classic JVM。从 7.1 开始,Classic JVM 不再被支持,J9 是 IBM i 上唯一的支持的 JVM。Java 的系统属性决定了 Java 程序实际运行的环境,默认情况下,JVM 启动时采用系统默认属性值,因此很多用户可能无法体会到这些属性的意义和应用。但是,如果你想要成为“更高级”的 Java 用户,就首先要搞清楚 Java 设置系统属性的方式有哪些,然后才能灵活设置和应用这些属性。本文首先给出 IBM i J9 的简单介绍,然后系统的介绍 IBM i 上设置 Java 系统属性的各种方式,接着介绍 IBM i 支持的 SystemDefault.properties 文件,最后列出一些常见的 Java 系统属性及使用时需要注意的地方。

IBM i J9 简介

J9 是 IBM 自己开发的一款 Java 虚拟机,在 IBM i 上 , 它实际是 PASE 环境中的一个应用,而 PASE 的运行环境类似于 AIX 的运行环境,因此 J9 在 IBM i QSHELL 环境下的使用与在 AIX 环境下基本相同。IBM i J9 支持的 JDK 版本如下表所示:

表 1. IBM i J9 支持的 JDK 版本
JDK1.4.2 64bitJDK50 32bitJDK50 64bit JDK60 32bitJDK60 64bit
IBM i 5.4N YN Y N
IBM i 6.1 & 7.1 Y Y Y Y Y

(注:Y 表示支持,N 表示不支持)

下面是 J9 在 IBM i QSHELL 环境下示例。

步骤 1:通过 java -version 查看当前使用的 JDK 版本,本示例中使用的 是 jdk60 32bit 版本。

图 1. 查看 JDK 版本
图 1. 查看 JDK 版本

步骤 2:通过设置环境变量 JAVA_HOME 来切换不同的 JDK 版本,本示例中将 JDK 切换为 jdk60 64bit 版本。注意,/QOpenSys/ 子目录大小写敏感。

图 2. 切换 JDK 版本
图 2. 切换 JDK 版本

步骤 3:运行 QIBMHello 来验证 JDK 是否正确安装。 QIBMHello 是 JDK 发布时自带的一个类,执行这个类会在控制台输出 QIBMHello 几个字符。

图 3. 运行 QIBMHello
图 3. 运行 QIBMHello

IBM i Java 系统属性的设置方法

Java 的系统属性直接决定了 JVM 的运行方式,即 Java 应用的实际运行环境。下面将详细的介绍 IBM i 上 Java 系统属性的几种设置方法。(注:下文所有实例都是 J9 在 IBM i QSHELL 环境下的使用示例,关于 J9 在 IBM i ILE 环境下的使用,请参考 IBM i 信息中心)

  1. 通过命令行或者 JNI(Java Native Interface) 调用方式设置 Java 系统属性。
    • 命令行方式是指在调用 Java 命令的时候,通过 Java 提供的命令选项 -D<name>=<value> 方式来设置系统属性的值。

      name - 将要设置的 Java 系统属性的名字

      value - 对应得 Java 系统属性值

      下面是通过这种方式设置 Java 系统属性 java.library.path 的示例,该属性用来确定 native library 的搜索路径,包括应用程序和 JVM 内部需要使用的 library 路径,该属性的默认值为 IBM i library list 和 通过环境变量 LIBPATH 设置的路径的并集。下面示例中使用的 QPropDump 和 QIBMHello 类似,是 JDK 发布时自带的一个类,用来输出当前 Java 系统属性的值。

      步骤 1:运行 QPropDump 查看当前环境下 java.library.path 的值,从下面输出中可以看出,该属性值包括 IBM i 一些系统 library path 及 JVM 内部需要的一些 library path。

      图 4. 运行 QPropDump 察看环境变量的值
      图 4. 运行 QPropDump 察看环境变量的值

      步骤 2:通过命令行方式将 java.library.path 设置为 /home/usr1/lib32, 从下面输出中可以看出,该属性的值已经被修改。第一行输出的 os400.vm.inputargs 是运行 Java 命令接收的所有 property 参数。

      图 5. 通过命令行方式设置属性 java.library.path 的值
      图 5. 通过命令行方式设置属性 java.library.path 的值

      上例中,通过 -D 的方式每次只能设置一个属性的值,下面我们介绍一个特殊的属性 os400.property.file, 该属性的值可以指向一个 property 文件。这样,通过 -D 的方式设置这个属性的值,它指向的文件中所有的 property 都会传送给 Java 命令,从而实现一次设置多个属性的功能。下面是具体示例:

      步骤 1:在 /tmp 目录下创建名为 mytest.properties 文件,如下所示,该文件只有一句对 java.library.path 属性赋值的语句 .

      图 6. property 文件例子
      图 6. property 文件例子

      步骤 2:通过命令行方式将 os400.property.file 设置为 /tmp/mytest.properties, 从下面输出中可以看出,该属性的值仍然会被修改。

      图 7. 通过命令行方式设置属性 os400.property.file 的值
      图 7. 通过命令行方式设置属性 os400.property.file 的值
    • JNI 方式是指通过显示调用 JNI API 函数 JNI_CreateJavaVM 来启动 JVM,而上文描述的命令行方式是由系统自动启动 JVM。JNI 方式启动 JVM,同样可以通过命令行参数来设置 Java 系统属性。由于 JNI 方式较为复杂,本文将不做具体介绍。
  2. 通过设置环境变量 QIBM_JAVA_PROPERTIES_FILE 指向一个特定的 property 文件来实 Java 系统属性的设置。这种方式类似于上文描述的 os400.property.file 设置方式,下面是具体示例:

    步骤 1:/tmp 目录下创建名为 mytest1.properties 文件,如下所示,该文件只有一句对 java.library.path 属性赋值的语句。

    图 8. property 文件例子
    图 8. property 文件例子

    步骤 2:将 QIBM_JAVA_PROPERTIES_FILE 设置为 /tmp/mytest1.properties, 从下面输出中可以看出,该属性的值已经被修改。

    图 9. 设置环境变量 QIBM_JAVA_PROPERTIES_FILE 的值
    图 9. 设置环境变量 QIBM_JAVA_PROPERTIES_FILE 的值
  3. 通过在 user.home 目录下创建一个名为 SystemDefault.properties 文件来实现对 Java 系统属性的设置。关于 SystemDefault.properties 文件后面会有详细介绍,下面是一个简单的例子。

    步骤 1:查看当前 user.home 属性的值,可以看出其值为 /home/xj9。

    图 10. 察看 user.home 属性的值
    图 10. 察看 user.home 属性的值

    步骤 2:在 /home/xj9 目录下创建名为 SystemDefault.properties 文件,如下所示,该文件只有一句对 java.library.path 属性赋值的语句。

    图 11. property 文件例子
    图 11. property 文件例子

    步骤 3:运行 QPropDump,从输出可以看出,java.library.path 已经被修改。

    图 12. 察看修改后的属性值
    图 12. 察看修改后的属性值

    SystemDefault.properties 文件中可以设置多个系统属性的值。这种方式是一种 user level 的设置方式,它会影响通过下面两种方式启动的 JVM。

    • 当前登录用户,在没有重新设置 user.home 属性的情况下启动的所有 JVM。
    • 其他用户在设置 user.home=/YourUserHome/ 后,启动的所有 JVM。

    这种方式是优先选择的方式,因为它不会影响其他用户启动的 JVM 的运行方式。

  4. 通过在 /QIBM/userdata/java400/ 目录下创建 SystemDefault.properties 文件来实现对 Java 系统属性的设置。这种方式不同于方式 3,它是一种 System level 的设置方式,即运行在当前 IBM i 系统上的所有 JVM 都会使用该文件中设置的系统属性值。这种方式影响面较大,使用时需要注意。

确定 Java 系统属性值的优先顺序

上文介绍了 IBM i Java 系统属性的设置方式,在真正使用这些设置方式之前,需要先了解这些方式的优先级别,否则依然是雾里看花,似懂非懂。IBM i JVM 通过下面的优先顺序(优先级由高到低排列)来确定 Java 系统属性值,即按照该顺序来搜索 property 参数值,第一个搜索到的会有效,其他较低级别的设置方式将会被忽略。

  1. 命令行方式或 JNI 调用方式(os400.property.file 优先级低于在命令行直接设置属性值)
  2. 环境变量 QIBM_JAVA_PROPERTIES_FILE
  3. user.home 目录下的 SystemDefault.properties 文件
  4. /QIBM/userdata/java400/ 目录下的 SystemDefault.properties 文件
  5. J9 默认系统属性值

本文前面在介绍这几种设置方式的时候,都以设置 java.library.path 属性为例,但设置的值都不同。下面同时采用这几种设置方式来设置该属性的值,并通过运行 QPropDump 来查看该属性的实际使用值。如下所示,从输出可以看出,最终生效的是命令行方式设置的 property 值。

图 13. 比较 Java 系统属性设置方式的优先级
图 13. 比较 Java 系统属性设置方式的优先级

IBM i 支持的 SystemDefault.properties 文件

SystemDefault.properties 文件是一个标准的 Java property 文件,可以用来设置 Java 系统属性的默认值,文件中每一行可以设置一个 Java 属性的值。如下所示:

#Example property file

prop1=12345

prop2=value

在 IBM i 7.1 版本之前,由于 classic JVM 和 J9 JVM 并存,而 classic JVM 只支持用该 property 文件设置 Java 系统属性值,因此该 property 文件一般仅用来设置 Java 系统属性值。但是,从 IBM i 7.1 版本开始,Classic JVM 从 IBM i 的历史舞台中退出。而 J9 对该 property 文件的支持更加灵活,它不仅支持通过 property 文件设置 Java 系统属性值,而且支持设置 Java option 的值。对 Java option 的支持只需要将 property 文件的第一行设置为 #AllowOptions 即可,JVM 将会以下面的规则解析该 property 文件。

  • 以‘ - ’开始的行都会被认为是 Java option,类似于通过 Java 命令行方式设置 option 的方式。
  • 不以‘ - ’开始的行都会被认为 Java property。

下面分别给出两个不同的示例:

例 1: #Comments start with pound sign
prop1=12345
-Dprop2
-Dprop3=abcd
-Xmx200m
prop4=value
-Xnojit

对于例 1 中的 property 文件,JVM 会认为该 property 文件中包含 6 个 Java 系统属性:prop1, -Dprop2, -Dprop3, -Xms200m, prop4, and -Xnojit。但是,如果将该文件第一行设置为 #AllowOptions,如下例 2 所示,将会出现不同的结果。

例 2:#AllowOptions
prop1=12345
-Dprop2
-Dprop3=abcd
-Xmx200m
prop4=value
-Xnojit

对于例 2 中的文件,Java 属性和 option 会被正确的识别,JVM 会认为该 property 文件中包含 4 个 Java 系统属性:prop1, prop2, prop3, and prop4. JVM 堆的最大值被设置为 200 MB,Java 即时编译器 JIT(Just In Time) 将不会被使用。


常见的 Java 系统属性

表 2 中列出了一些常见的 Java 系统属性并给出了简单的功能描述,同时给出在不同 JDK 版本中的默认值及其它一些合法的值。

表 2:常见的系统属性
属性名功能默认值
java.ext.dirs 一个或多个扩展目录的路径,主要用于扩展 JVM 的功能。J2SE 1.4 64bit:
/QOpenSys/QIBM/ProdData/JavaVM/jdk14/64bit/jre/lib/ext
/QIBM/UserData/Java400/ext

J2SE 5.0 32bit:
/QOpenSys/QIBM/ProdData/JavaVM/jdk50/32bit/jre/lib/ext
/QIBM/UserData/Java400/ext

J2SE 5.0 64bit:
/QOpenSys/QIBM/ProdData/JavaVM/jdk50/64bit/jre/lib/ext
/QIBM/UserData/Java400/ext

Java SE 6 32bit:
/QOpenSys/QIBM/ProdData/JavaVM/jdk60/32bit/jre/lib/ext
/QIBM/UserData/Java400/ext

Java SE 6 64bit:
/QOpenSys/QIBM/ProdData/JavaVM/jdk60/64bit/jre/lib/ext
/QIBM/UserData/Java400/ext
java.library.path 加载 native library 时搜索的路径列表,包括应用程序和 JVM 内部需要使用的库IBM i library list 和 通过环境变量 LIBPATH 设置的路径的并集
java.policy 用于配置 java 安全策略J2SE 1.4 64bit: /QopenSys/QIBM/ProdData/JavaVM/jdk14/64bit/jre/lib/security/
java.policy

J2SE 5.0 32bit:
/QopenSys/QIBM/ProdData/JavaVM/jdk50/32bit/jre/lib/security/
java.policy

J2SE 5.0 64bit:
/QopenSys/QIBM/ProdData/JavaVM/jdk50/64bit/jre/lib/security/
java.policy

Java SE 6 32bit:
/QopenSys/QIBM/ProdData/JavaVM/jdk60/32bit/jre/lib/security/
java.policy

Java SE 6 64bit:
/QopenSys/QIBM/ProdData/JavaVM/jdk60/64bit/jre/lib/security/
java.policy
java.version 用于选择 Classic JVM JDK 版本,对 J9 无效1.4.2
1.5.0
1.6.0
os400.vm.inputargs 仅用于输出使用,可以显示当前 JVM 接收的所有输入参数N/A
java.home 仅用于输出使用,可以显示当前 JVM 所在目录J2SE 1.4 64bit:
/QopenSys/QIBM/ProdData/JavaVM/jdk14/64bit

J2SE 5.0 32bit:
/QopenSys/QIBM/ProdData/JavaVM/jdk50/32bit

J2SE 5.0 64bit:
/QopenSys/QIBM/ProdData/JavaVM/jdk50/64bit

Java SE 6 32bit: /QopenSys/QIBM/ProdData/JavaVM/jdk60/32bit

Java SE 6 64bit: /QOpenSys/QIBM/ProdData/JavaVM/jdk60/64bit
os400.display.properties 显示 JVM 所有属性值的开关默认值是 false。如果该属性值为 true,JVM 所有系统属性值都会输出到标准输出。
os400.child.stdio.convert 控制子进程是否开启 ACCII 码和 EBCDIC 码之间的默认转化默认值是 N

注:表 2 中列出的 java属性都是以 IBM i 7.1 为基础,其它系统请参考IBM i 信息中心


需要注意的地方

  • java.version 系统属性可以用来设置 Classic JVM 的 JDK 版本,但对于 J9 JVM,该属性仅用来输出。
  • Java 很多系统属性的默认值包含了 JVM 内部实现需要的一些值,如本文示例中设置的 java.library.path 属性的默认值就包含了 JVM library path,因此在设置 java property 时需要谨慎操作,否则可能会影响 JVM 的正常工作。建议重新设置 java property 时,保留默认的值,以追加的方式添加。

结束语

本文系统的介绍了 IBM i 上 Java 系统属性的设置方式及其优先级,希望能对 IBM i Java 开发人员带来帮助。 Java 的系统属性作为配置 JVM 工作环境的重要手段,可以直接影响 JVM 的运行方式。但是,如果使用不当,就会引起很多无法预测的问题,因此正确有效的使用 java 系统属性非常重要。

参考资料

学习

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=IBM i
ArticleID=806874
ArticleTitle=灵活设置 IBM i Java 的系统属性
publish-date=03262012