---
title: "z/OS JCLでJavaバッチジョブを実行する方法 ― JZOS Batch LauncherとBPXBATCHの設定手順"
url: "https://www.issoh.co.jp/tech/details/4366/"
published: 2024-12-02
updated: 2026-09-27
categories: ["Java"]
publisher: "株式会社一創"
---

# 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が今も使われ続ける理由](https://www.issoh.co.jp/column/details/1937/)も参考になる。

## 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ベースライン導入とその影響](https://www.issoh.co.jp/tech/details/4364/)が参考になる。

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

ジョブの成否は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ベースラインの導入とその影響](https://www.issoh.co.jp/tech/details/4364/) ― オープン系でモダンなJavaバッチを組む際の設計指針。
- [COBOLはなぜ廃れたと言われるのか？「オワコン」説の真相と、いまも使われ続ける理由](https://www.issoh.co.jp/column/details/1937/) ― メインフレーム資産をJava化する背景として。
- [クライアントサーバモデルの仕組み：基本原理と通信の流れ](https://www.issoh.co.jp/tech/details/9655/) ― メインフレームからの発展とシステム構成の位置づけ。

---

出典: [z/OS JCLでJavaバッチジョブを実行する方法 ― JZOS Batch LauncherとBPXBATCHの設定手順](<https://www.issoh.co.jp/tech/details/4366/>)（株式会社一創）
