z/OS JCLでJavaバッチジョブを実行する方法 ― JZOS Batch LauncherとBPXBATCHの設定手順

z/OS上のジョブ制御はJCL(Job Control Language)で行い、処理本体はJavaで書きたい――このニーズに対し、z/OSはJVMをMVSバッチ・ジョブとして起動する仕組みを標準で備えている。本記事は、z/OS JCLからJavaプログラムをバッチ実行する2つの方式(BPXBATCHとJZOS Batch Launcher)を、サンプルJCL・STDENVでの環境変数・CLASSPATH設定・USSでのコンパイル・ログ確認まで手順で示す。JCLそのものの基本構文と、z/OS 3.1で選ぶべきJava(IBM Semeru Runtime)のバージョンも押さえる。

まとめ:z/OS JCLでJavaを動かす要点

  • 本番のバッチ・ジョブはJZOS Batch Launcherが標準解。JVMの戻り値をジョブのリターンコードに写せ、STDENV/STDOUT/STDERRをDDで制御できる。
  • 簡易テストや既存USSスクリプトの流用はBPXBATCHで足りる。ただし異常終了コードの伝搬とEBCDIC/ASCIIの扱いに注意。
  • JavaのソースはUSS上でjavacコンパイルし、クラスやjarはzFS上に置く。JCLからはそのパスをCLASSPATHで指す。
  • 環境変数はSTDENV DDのシェルスクリプトで設定する(JAVA_HOMEPATHCLASSPATH)。JCLのDD文だけでは足りない。
  • z/OS 3.1が機能面で依存するJavaはIBM Semeru Runtime Certified Edition for z/OS V21(2025年3月31日以降)。アプリはV21/V17/V11とJava 8が併用可能だが、Java 8は標準サポート終了が2026年9月30日(延長サービスで2030年まで)。
  • 実行結果はSDSFでJESログ・STDOUT/STDERRを確認し、JAVA_HOME未設定やCLASSPATH不一致など定番エラーを切り分ける。

z/OS JCLの基本構文とジョブ実行の流れ

JCLはz/OSにバッチ・ジョブの実行内容を指示する制御言語で、1ジョブはJOBステートメント(ジョブ全体の宣言)・EXECステートメント(実行する program/procedure)・DDステートメント(データ定義)の3種で構成される。行頭は必ず // で始める。最小のジョブは次の形になる。

//MYJOB    JOB (ACCT),'BATCH SAMPLE',CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID
//STEP1    EXEC PGM=IEFBR14
//DD1      DD DSN=MY.INPUT.DATA,DISP=SHR

投入したジョブはJES(Job Entry Subsystem)がキューに受け付け、イニシエーターがステップ単位で実行する。各ステップの成否はリターンコード(RC)で表され、後続ステップは CONDIF/THEN でRCを条件分岐に使える。Javaを動かす場合も枠組みは同じで、EXEC で「JVMを起動するプログラム」を指定する点だけが変わる。JCLの用語や記述ルール自体を体系的に押さえたい場合は、メインフレームで長く使われるCOBOL資産の背景とあわせてCOBOLが今も使われ続ける理由も参考になる。

z/OSでJavaを動かす2つの方式 ― BPXBATCHとJZOS Batch Launcher

JCLからJavaを起動する現実的な選択肢は2つ。用途で選び分ける。

観点 BPXBATCH JZOS Batch Launcher
実体 USSシェル/プログラムを起動する標準ユーティリティ JVMを構成・起動する専用ローンチャ
戻り値 伝搬が限定的(0/非0が中心) JVMの終了コードをジョブRCへ反映
入出力 USSのファイルにリダイレクト STDOUT/STDERR/STDENVをDDで制御
向く用途 簡易実行・既存USSスクリプト流用 本番の定常バッチ・ジョブ

BPXBATCH方式(USSシェル経由)

BPXBATCHは PGM=BPXBATCH にシェルコマンドを渡してUSS側でJavaを実行する。導入が軽く、USSで動いているコマンドをそのままJCL化できるのが利点。標準出力はUSSファイルへ振る。以下はEXECステップ部の抜粋で、実際にはJOBステートメントを先頭に付ける。

//JAVAB    EXEC PGM=BPXBATCH,
//         PARM='SH java -cp /u/app/classes com.example.MyBatch arg1'
//STDOUT   DD PATH='/tmp/myapp.out',
//         PATHOPTS=(OWRONLY,OCREAT,OTRUNC),PATHMODE=SIRWXU
//STDERR   DD PATH='/tmp/myapp.err',
//         PATHOPTS=(OWRONLY,OCREAT,OTRUNC),PATHMODE=SIRWXU

ただし異常終了時のコード伝搬がJZOSほど素直でなく、ジョブネットでRCによる後続制御をかけたい定常バッチには不向き。テストや単発実行に留めるのが現実的な判断だ。

JZOS Batch Launcher方式(本番推奨)

JZOS Batch LauncherはJVMをMVSバッチ・プログラムとして構成・起動する仕組みで、IBMのz/OS向けJava SDK(Semeru Runtime Certified Edition for z/OS)に同梱される。JVMの戻り値をジョブのRCに写せるため、スケジューラでの後続制御と相性が良い。定常バッチはこちらを標準にすべきだ。次章でセットアップとサンプルJCLを示す。

JZOS Batch LauncherのセットアップとサンプルJCL

JZOSは3つの部品で構成される。(1)PDSEに配置するロードモジュール、(2)PROCLIBに置くカタログドプロシージャ、(3)SAMPLIBに置くサンプルJCL。IBMはこれらをSDK同梱で提供し、ファイル名は JVMLDMxx(ローンチャ)・JVMPRCxx(プロシージャ)・JVMJCLxx(サンプルJCL)の形をとる(xxはSDKのバージョン。例:64bit版Java 8では JVMLDM86 / JVMPRC86)。導入済みSDKに合わせて実際のモジュール名を確認する。

実行ジョブは、SDK同梱のプロシージャを呼び出し、実行クラスを JAVACLS に、環境変数を STDENV のシェルスクリプトに書く。最小構成は次のとおり。

//JAVAJOB  JOB (ACCT),'JZOS BATCH',CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID
//JAVA     EXEC PROC=JVMPRC86,
//         JAVACLS='com.example.MyBatch'
//STDENV   DD *
. /etc/profile
export JAVA_HOME=/usr/lpp/java/J8.0_64
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=/u/app/classes:$CLASSPATH
/*
//STDOUT   DD SYSOUT=*
//STDERR   DD SYSOUT=*

プログラム引数は JAVACLS の後ろに ARGS='arg1 arg2' で渡し、JVMオプション(ヒープ量など)はSTDENVの IJO="-Xms256m -Xmx512m" のように環境変数で与える。JZOSはこの戻り値をジョブRCに写すため、後続ステップの COND 判定にそのまま使える。上例は64bit版Java 8(JVMPRC86 / JAVA_HOME=J8.0_64)で版を揃えた最小構成で、Semeru 17/21で組む場合は、そのSDKに同梱される版対応のプロシージャと JAVA_HOME(例 /usr/lpp/java/J17.0_64)へ読み替える。ローンチャのモジュール版とJVMの版は揃える。

STDENVでのCLASSPATH・環境変数の設定

z/OSのJava実行で最もつまずくのが環境変数だ。JAVA_HOMEPATHCLASSPATH はJCLのDD文では設定できず、STDENV DDに書いたシェルスクリプトで与える。クラスやjarはzFS上のUSSパスで指定し(データセットではなくUSSのパス表記)、複数を並べるときは : で連結する。. /etc/profile を先頭で読み込むとサイト共通の設定を継承できる。CLASSPATH不一致は「ClassNotFound」の最頻原因なので、STDENVの値とUSS上の実配置を必ず突き合わせる。

USSでのJavaコンパイルと実行環境の準備

z/OSのJavaはUSS(Unix System Services)上で動く。ソースはUSSに置き、javac でコンパイルする。まずSDKが通っているかを確認する。

java -version
javac -d /u/app/classes /u/app/src/MyBatch.java

生成したクラス/jarはzFSデータセット上のUSSディレクトリ(例 /u/app/classes)に保管し、そのパスをJCL側のCLASSPATHで指す。日本語や固定長データを扱う場合、ソースやプロパティのエンコーディング(EBCDIC/ASCII/UTF-8)の取り違えが文字化けの原因になりやすいので、-encodingfile.encoding を明示しておくと事故が減る。

z/OSのJava環境とSemeru ― バージョン選択とJava 8サポート終了

現在のz/OS向けJavaはIBM Semeru Runtime Certified Edition for z/OSが主軸で、OpenJDKベースのEclipse OpenJ9 JVMを採用する。z/OS 3.1は機能面の依存を段階的に引き上げており、GA(2023年9月30日)時点のSemeru 11から、2024年4月1日にSemeru 17、2025年3月31日にSemeru 21へ移した。アプリケーション側はV21・V17・V11に加え64bit版Java 8も併用できるが、Java 8(31bit/64bit)は標準サポート終了が2026年9月30日とアナウンスされている(有償の延長サービスで2030年まで利用可)。

したがって新規のバッチはSemeru 17以上(できればV21)で組むのが妥当で、Java 8で動く既存資産はサポート終了前に移行計画を立てるべきだ。JVMが替わるとGC挙動やヒープ設定の最適値も変わるため、STDENVのJVMオプションは移行時に見直す。モダンなJavaバッチ基盤の設計指針はSpring Batch 5のJDK 17ベースライン導入とその影響が参考になる。

実行結果のログ確認とトラブルシューティング

ジョブの成否はSDSF(またはJESスプール)で確認する。JESMSGLGでジョブ全体のRCを、JZOSなら STDOUTSTDERR DDのSYSOUTでJavaの標準出力・スタックトレースを追う。定番の詰まりどころは次の4点に集約される。

症状 主因 対処
JVMが起動しない JAVA_HOME未設定/誤り STDENVのJAVA_HOMEと実SDKパスを一致させる
ClassNotFound CLASSPATH不一致 USS上の実配置とCLASSPATHを突合
文字化け EBCDIC/ASCII取り違え file.encoding/-encodingを明示
ABEND S878/メモリ不足 Region/ヒープ不足 REGION拡大・-Xmx調整

後続ジョブをRCで制御したい場合は、JZOSがJVM終了コードをRCへ写す性質を使い、Java側で System.exit(n)n を運用ルールに合わせて設計しておくと、JCLの CONDIF で分岐がきれいに書ける。

よくある質問

z/OS JCLとは何ですか?

z/OSにバッチ・ジョブの実行内容を指示するジョブ制御言語です。JOB(ジョブ宣言)・EXEC(実行対象)・DD(データ定義)の3ステートメントで1ジョブを記述し、行頭は // で始めます。JESがジョブを受け付け、ステップ単位で実行します。

JCLからJavaプログラムを実行するには?

2通りあります。簡易実行はBPXBATCH(PGM=BPXBATCH にシェルでjavaコマンドを渡す)、本番の定常バッチはJZOS Batch Launcher(JVMをバッチ・プログラムとして起動し、戻り値をジョブRCに反映)が標準です。

JZOS Batch Launcherとは?

JVMを構成・起動するz/OS向けのバッチ・ローンチャで、IBMのSemeru Runtime Certified Edition for z/OSに同梱されます。ロードモジュール・カタログドプロシージャ・サンプルJCLの3部品からなり、STDOUT/STDERR/STDENVをDDで制御できます。

z/OS 3.1で使えるJavaのバージョンは?

IBM Semeru Runtime Certified Edition for z/OSのV21・V17・V11、および64bit版Java 8が利用できます。z/OS 3.1の機能依存は2025年3月31日にSemeru 21へ移りました。Java 8は2026年9月30日に標準サポート終了予定(延長サービスで2030年まで)のため、新規はV17以上を推奨します。

BPXBATCHとJZOS Batch Launcherはどちらを使うべき?

スケジューラでRCによる後続制御をかける定常バッチはJZOS一択です。BPXBATCHは戻り値の伝搬が限定的なため、テストや既存USSスクリプトの単発実行に留めるのが安全です。

関連記事

資料請求

RELATED POSTS 関連記事