第324期 / October 4, 2024

分享到臉書!分享到維特!分享到噗浪!分享到Google+!分享到微博!轉寄友人友善列印

[技術分享] HPE NonStop主機上的現代化開發方式(上)

作者/莊佳哲

[發表日期:2024/10/4]

作者簡歷

作者現職凌群電腦金控軟體研發總處軟體工程師,主要負責期貨系統軟體,專長為COBOL、JAVA、C#軟體開發。

前言

在 NonStop 系統環境中,除了傳統的COBOL開發,NonStop也有支援現代的開發工具,像是Java、SQL/MX等等。本期我們將介紹如何在NonStop主機上使用Java開發,依照主機系統版本不同,分別支援Java 8、Java 11、Java 17。以下說明以Java 11為例。

NSJ11

NSJ11由以下標準Java組件組成::
  • 基於OpenJDK 11.0.18的Java虛擬機。
  • OpenJDK 11.0.18核心包。
  • OpenJDK 11.0.18工具。支持所有標準工具,除了GUI,如appltviewer。
  • policytool和jconsole,以及客戶端工具,如javaws和HtmlConverter。不支持實驗工具。
  • OpenJDK 11.0.18 API包。

一、安裝NSJ11
    == Guardian環境 ==
    切換至資料夾$SYSTEM.ZOSSUTL,
    輸入指令PINSTALL -rvf /G/tsvvol/zossutl/T3066PAX
    此命令將會把T3066PAX內容安裝到/usr/tandem/nssjava/javainstall/(VPROC_STR)
    其中VPROC_STR範例為: T3066L11_17APR2023_jdk110_AAF

    == OSS環境 ==
    執行NSJ11安裝檔:
    sh /usr/tandem/nssjava/javainstall/(VPROC_STR)/NSJInstall -timezone
    為時區設定,可為:

    0 Asia/Brunei
    1 Asia/Choibalsan
    2 Asia/Chongqing
    3 Asia/Chungking
    4 Asia/Harbin
    5 Asia/Hong_Kong
    6 Asia/Irkutsk
    7 Asia/Kuala_Lumpur
    8 Asia/Kuching
    9 Asia/Macao
    10 Asia/Macau
    11 Asia/Makassar
    12 Asia/Manila
    13 Asia/Shanghai
    14 Asia/Singapore
    15 Asia/Taipei
    16 Asia/Ujung_Pandang
    17 Asia/Ulaanbaatar
    18 Asia/Ulan_Bator
    19 Australia/Perth
    20 Australia/West
    21 CTT
    22 Etc/GMT-8
    23 Hongkong
    24 PRC
    25 Singapore

    執行完會將NSJ11安裝到/usr/tandem/nssjava/jdk110_l11

    若需要更改時區,輸入:
    sh /usr/tandem/nssjava/jdk110_l11/install/UpdateTimeZone

    到此完成Java安裝:
    /usr/tandem/nssjava/jdk110_l11: ls -l
    total 46
    -r--r--r-- 1 SUPER.SUPER SUPER 3750 Apr 24 12:08 COPYRIGHT
    -r--r--r-- 1 SUPER.SUPER SUPER 304 Apr 24 12:08 LICENSE
    drwxr-xr-x 1 SUPER.SUPER SUPER 4096 Jun 25 11:09 bin
    drwxr-xr-x 1 SUPER.SUPER SUPER 4096 Apr 24 12:08 conf
    drwxr-xr-x 1 SUPER.SUPER SUPER 4096 Apr 24 12:08 demo
    drwxr-xr-x 1 SUPER.SUPER SUPER 4096 Apr 24 12:08 ext
    drwxr-xr-x 1 SUPER.SUPER SUPER 4096 Apr 24 12:08 include
    drwxr-xr-x 1 SUPER.SUPER SUPER 4096 Jun 25 11:02 install
    drwxr-xr-x 1 SUPER.SUPER SUPER 4096 Apr 24 12:08 jmods
    drwxr-xr-x 1 SUPER.SUPER SUPER 4096 Apr 24 12:08 legal
    drwxr-xr-x 1 SUPER.SUPER SUPER 4096 Apr 24 12:08 lib
    drwxr-xr-x 1 SUPER.SUPER SUPER 4096 Apr 24 12:08 man
    -r--r--r-- 1 SUPER.SUPER SUPER 1219 Apr 24 12:08 release


二、驗證Java安裝
  • 在OSS中將Java加入環境變數
    export PATH=/usr/tandem/nssjava/jdk110_l11/bin:$PATH

  • 確認安裝路徑
    /usr/tandem/nssjava/jdk110_l11: 輸入指令whence java
    /usr/tandem/nssjava/jdk110_l11/bin/java

  • 確認安裝的NSJ版本
    /usr/tandem/nssjava/jdk110_l11: 輸入指令 vproc /usr/tandem/nssjava/jdk110_l11/bin/java
    VPROC - T9617H01 - (03 MAY 2016) SYSTEM \NSX Date 18 SEP 2024, 11:30:24
    Copyright 1986-2016 Hewlett Packard Enterprise Development LP

    /usr/tandem/nssjava/jdk110_l11/bin/java
    Binder timestamp: 24MAY2023 15:49:56 LCT, 24MAY2023 07:49:56 GMT
    Version procedure: T3066L11_17APR2023_jdk110_AAF_24May2023
    Version procedure: T8432L01_01FEB2017_CCPMAINX_24JAN2017_ACE
    TNS/X Native Mode: runnable file

  • 確認Java Runtime Environment及VM
    /usr/tandem/nssjava/jdk110_l11: 輸入指令java -version
    openjdk version "11.0.18" 2023-01-17 LTS
    OpenJDK Runtime Environment (build 11.0.18+0-LTS)
    OpenJDK 64-Bit Server VM (build 11.0.18+0-LTS, mixed mode)


執行Java

一、新增Java程式碼

    在OSS環境中建立檔案HelloWorld.java並新增內容
    /java/test: 輸入指令touch HelloWorld.java
    /java/test: ls -l
    -rw-rw-rw- 1 JAVA.JJ JAVA 121 Sep 18 13:49 輸入指令HelloWorld.java

    新增HelloWorld.java內容:
    public class HelloWorld
    {
    public static void main(String[] args)
    {
    System.out.println("Hello World!");
    }
    }

二、編譯Java,產生可執行程式
    產出.class檔
    /java/test: 輸入指令 javac HelloWorld.java
    -rw-r--r-- 1 JAVA.JJ JAVA 426 Sep 18 14:19 輸入指令HelloWorld.class
    -rw-rw-rw- 1 JAVA.JJ JAVA 121 Sep 18 13:49 HelloWorld.java

三、執行程式
  • 第一種方式,直接執行
    /java/test: 輸入指令 java HelloWorld
    Hello World!

    若出現
    Error: Could not find or load main class HelloWorld
    Caused by: java.lang.ClassNotFoundException: HelloWorld

    改為使用:
    /java/test: 輸入指令 java -cp . HelloWorld
    Hello World!

  • 第二種方式,使用run指令,可指定process name和執行cpu:
    run [-name=/G/] [-cpu=] java
    /java/test: 輸入指令 run -name=/G/appj -cpu=1 java -cp . HelloWorld
    Hello World!

  • 第三種方式,打包成jar檔執行:
    jar cfe
    /java/test: 輸入指令 jar cfe Hello.jar HelloWorld *.class

    -rw-r--r-- 1 JAVA.JJ JAVA 784 Sep 18 15:09 Hello.jar
    -rw-r--r-- 1 JAVA.JJ JAVA 426 Sep 18 14:19 HelloWorld.class
    -rw-rw-rw- 1 JAVA.JJ JAVA 121 Sep 18 13:49 HelloWorld.java

    /java/test: 輸入指令java -jar Hello.jar
    Hello World!

Java Debug

一、啟用Debug模式


    java -Xdebug -Xnoagent -agentlib:jdwp=transport=dt_socket,server=y,address=[ip]:[port],suspend=y

    可為:
    1. class_name,例如HelloWorld
    2. -jar Hello.jar

    範例:
    /java/test: java -Xdebug -Xnoagent -agentlib:jdwp=transport=dt_socket,server=y,a
    ddress=*:8181,suspend=y -cp . HelloWorld
    Listening for transport dt_socket at address: 8181

    到此Debug模式啟用完成,再來可選擇使用Command Line或IDE進行Debug。


二、Command Line Debug

    開啟另一個視窗進入OSS環境。

    輸入jdb -attach :
    /java/sam: 輸入指令jdb -attach 127.0.0.1:8181
    Set uncaught java.lang.Throwable
    Set deferred uncaught java.lang.Throwable
    Initializing jdb ...
    >
    VM Started: No frames on the current call stack

    main[1]

    開始Debug,詳細操作指令可輸入help查看。


三、IDE Debug

    可以在個人電腦上使用Java IDE執行遠端Debug,比Command Line模式更方便。
    將NonStop上的Java Source Code下載到電腦並用IDE開啟,再依照啟用Debug模式時輸入的參數,填入IDE的Remote Debug設定。

    下圖為使用IntelliJ IDEA遠端Debug畫面:



(待續)

參考資料