z/OSではまだまだ一般的ではありませんが、Javaプログラムを作成して、MVS上でバッチ・ジョブとして実行することもできます。JavaのコンパイルはUSS内で行う必要がありますが、できあがったクラス・ファイルはUSS内で実行するだけでなく、MVS上で直接実行することもできます。MVS上で直接実行するには、「IBM SDK for z/OS, Java Technology Edition」に含まれる「JZOS Batch Launcher」を起動して、JavaのJVM(Java virtual machine)をバッチ・ジョブとして実行します。
z/OS版Javaのはろ~わーるど
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
//jobname JOB ,CLASS=A,MSGCLASS=A,NOTIFY=&SYSUID // JCLLIB ORDER=JVB800.PROCLIB //JOBLIB DD DISP=SHR,DSN=JVB800.SIEALNKE //******************************************************************* //BUILDSRC EXEC PGM=IEBGENER //SYSPRINT DD DUMMY //SYSIN DD DUMMY //SYSUT2 DD PATHOPTS=(OWRONLY,OCREAT,OTRUNC), // PATH='/u/yourdir/HelloWLD.java',PATHMODE=SIRWXU //SYSUT1 DD *,DLM='++' /* Simple class that says hello on System.out */ public class HelloWLD { public static void main(String[] args) { System.out.println("Hello World !!"); } } ++ //********************************************************************* //BPXBATCH EXEC PGM=BPXBATCH,REGION=0M //STDOUT DD SYSOUT=* //STDERR DD SYSOUT=* //STDPARM DD *,SYMBOLS=JCLONLY SH export PATH="$PATH:/usr/lpp/java/J8.0_64/bin" ; rm HelloWLD.class ; javac HelloWLD.java /* //********************************************************************* //JAVA EXEC PROC=JVMPRC86,JAVACLS='HelloWLD',ARGS= //STDENV DD * # This is a shell script which configures # any environment variables for the Java JVM. # Variables must be exported to be seen by the launcher. . /etc/profile export JAVA_HOME=/usr/lpp/java/J8.0_64 export PATH=/bin:"${JAVA_HOME}"/bin LIBPATH=/lib:/usr/lib:"${JAVA_HOME}"/bin LIBPATH="$LIBPATH":"${JAVA_HOME}"/lib/s390x LIBPATH="$LIBPATH":"${JAVA_HOME}"/lib/s390x/j9vm LIBPATH="$LIBPATH":"${JAVA_HOME}"/bin/classic export LIBPATH="$LIBPATH": # Customize your CLASSPATH here APP_HOME=$JAVA_HOME CLASSPATH=$APP_HOME:"${JAVA_HOME}"/lib:"${JAVA_HOME}"/lib/ext # Add Application required jars to end of CLASSPATH for i in "${APP_HOME}"/*.jar; do CLASSPATH="$CLASSPATH":"$i" done export CLASSPATH="$CLASSPATH": # Set JZOS specific options # Use this variable to specify encoding for DD STDOUT and STDERR #export JZOS_OUTPUT_ENCODING=Cp1047 # Use this variable to prevent JZOS from handling MVS operator commands #export JZOS_ENABLE_MVS_COMMANDS=false # Use this variable to supply additional arguments to main #export JZOS_MAIN_ARGS="" # Configure JVM options IJO="-Xms16m -Xmx128m" # Uncomment the following to aid in debugging "Class Not Found" problems #IJO="$IJO -verbose:class" # Uncomment the following if you want to run with Ascii file encoding.. #IJO="$IJO -Dfile.encoding=ISO8859-1" export IBM_JAVA_OPTIONS="$IJO " // // |
JCLLIBステートメントでJavaのカタログ・プロシージャー・ライブラリー、JOBLIB DDステートメントでJVMのロード・モジュール・ライブラリーを定義します。JVMのライブラリーは、3番目のJAVAステップでのみ使われるので、STEPLIBに変えてもかまいません。その場合は、DD名をJAVAJVM.STEPLIBにします。JVMのバージョンによってプロシージャー内ステップ名が変わる可能性もあるので、サンプルではJOBLIBを使用しています。
JVB800は、Java 8バージョンの64ビット版を示す第1修飾子です。システムにインストールされた「IBM SDK for z/OS, Java Technology Edition」に応じた修飾子を指定します。JavaのSDKがインストールされていれば、JVBnnn(もしくはJVAnnn)の第1修飾子のデータセットが作られているはずです。
ステップBUILDSRC
JCL内に記述したJavaのソース・コードをUSSファイルとして書き込みます。IEBGENERによって、SYSUT1 DDに定義されたストリーム内データセットとしてのJavaソース・プログラムが、SYSUT2 DDに定義された/u/yourdir/HelloWLD.javaファイルとしてコピーされます。ストリーム内データセットではなく、区分データセットのメンバーとしてプログラムを作成し格納して、SYSUT1をDSN=dsname(member)で定義してもかまいません。
MVS上でJavaを動かすということで、JavaソースをCOBOLやPL/I同様の80バイト固定長レコードでのサンプルを示していますが、TSOのISHELLやOEDITコマンドなどで直接USSファイル・システム内にソース・プログラムのファイルを作成することもできます。その場合、このBUILDSRCのステップは不要です。
ステップBPXBATCH
USSをバッチで起動してUSS内のJavaコンパイラーを実行します。USSのUNIXシェルを起動して、シェル内でjavacを実行しています。;記号で区切れば、シェル内で複数のコマンドを実行できます。このサンプルではコンパイル前に古いクラスファイルを削除しています。標準またはユーザー毎のprofile等でJavaコンパイラーへのパスが追加されていなければ、exportコマンドで追加できます。
コンパイルに成功すれば、ユーザーのデフォルト・ディレクトリー(このサンプルでは/u/yourdir)にJavaのクラスファイルが作成されます。
ステップJAVA
「JZOS Batch Launcher」を実行してJVMを起動し、先行ステップでコンパイルしたクラスファイルを実行します。プロシージャー名JVMPRC86は、「JZOS Batch Launcher」の起動プロシージャーです。こちらもシステムにインストールされた「IBM SDK for z/OS, Java Technology Edition」に応じたプロシージャー名を指定します。
クラスファイルは、ユーザーのデフォルト・ディレクトリー(このサンプルでは/u/yourdir)とCLASSPATHに定義されたディレクトリーから探されます。他のユーザーや共通のディレクトリー内にあるクラスファイルを実行する場合は、必要に応じてCLASSPATHにディレクトリーを追加します。
プログラムからの出力(System.out)は、STDOUT DDステートメントでリダイレクトできます(標準ではSYSOUT)。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
: //********************************************************************* //JAVA EXEC PROC=JVMPRC86,JAVACLS='HelloWLD',ARGS= //STDENV DD * # This is a shell script which configures # any environment variables for the Java JVM. : for i in "${APP_HOME}"/*.jar; do CLASSPATH="$CLASSPATH":"$i" done export CLASSPATH="$CLASSPATH":/u/common : // |
ステップBPXBATCH以降は、Java SDKがインストールされたzFSデータセットがUSSファイル・システムにマウントされている必要があります。マウント済みかどうかは「D△OMVS,FILE,N=JV*」コマンドまたはSDSFのFSパネルで確認できます。