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_HOME・PATH・CLASSPATH)。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)で表され、後続ステップは COND や IF/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_HOME・PATH・CLASSPATH は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)の取り違えが文字化けの原因になりやすいので、-encoding と file.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なら STDOUT/STDERR 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の COND/IF で分岐がきれいに書ける。
よくある質問
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スクリプトの単発実行に留めるのが安全です。
関連記事
- Spring Batch 5におけるJDK 17ベースラインの導入とその影響 ― オープン系でモダンなJavaバッチを組む際の設計指針。
- COBOLはなぜ廃れたと言われるのか?「オワコン」説の真相と、いまも使われ続ける理由 ― メインフレーム資産をJava化する背景として。
- クライアントサーバモデルの仕組み:基本原理と通信の流れ ― メインフレームからの発展とシステム構成の位置づけ。