Capitulo 3 - Java

Só um Hello Worls, nem mesmo um breve crash course... e olha lá!

A linguagem java roda no mainframe! Porém é considerada lenta (antes fosse só no mainframe que acontecesse isso) tanto que existia até um processador especifico para JAVA no mainframe que é o zAAP (z/OS Application Assist Processor) ele nada mais é do que é um processador adicional mais barato e especifico para execucao de aplicativos escritos em java para o mainframe, e isso em 2006, me jogaram essa informação logo no meu curso de formação, depois nunca mais ouvi falar, Nunca tive acesso, a IBM é mestre em evoluir as solucoes, mas nao sabe vender, ai o cliente nao usa puf, projeto sunsetado, ideia boa, muito boa, nem cobrava igual o processamento 'real' do mainframe, mas isso é historia pra outra conversa.

Mesmo existindo suporte e hardware especifico para rodar Java ele foi durante o periodo 1990-2010 (juntamente com toda plataforma WEB, aplicativos de baixa plataforma ou simplesmente "não-mainframe") sistematicamente implementado em servidores (computadores) high-end que rodavam desde linux, passando por OS/2 e mesmo um clássico windows server os quais realizavam um processamento previo das requisições enviando ao mainframe solicitações (das mais variadas formas uma sequencia de dados) para que a transacao fosse processado em algum aplicativo no mainframe, digamos por exemplo em COBOL, e esse por sua vez retornava ao servidor da baixa plataforma para ter seu processamento concluido.

Criou-se com esse procedimento uma programação em camadas que roda em plataformas distintas e quem estava no meio desse processo em meados da decada de 1990 não consegue com tanta facilidade rodar o JAVA no mainframe. Vale a frase "deixa como esta".

Exemplo do processo que você via encontrar em quase todas as instalações (os gringos chamam de shops, acho que já devo ter citado isso antes) que você um dia for trabalhar.

Uma consulta de saldo de seu internet banking via smartphone.

Suponha que o cliente já logou na conta e selecionou a consulta de saldo, quando ele clicar em consultar ocorre - de maneira extremamente simplista - o seguinte:

  • o aplicativo que o usuario baixou na apple store (que foi desenvolvido em linguagem objective c ou swift com auxilio do iOS SDK da apple) ou na google play (esse daqui foi feito em java) envia para o banco (via web mesmo) a solicitação de saldo, o programa do banco que recebe esse pedido roda em algum servidor “high-end” do proprio banco ou em algum provedor de servico e esse programa deve por sua vez vai enviar essa solicitação ao sistema de consulta de saldo que roda no mainframe.

comentário do autor - maio 2025 - negocio era tao antigo que nem nuvem tinha direito quando escrevi o texto!

Não indague o porque dessa consulta de saldo não ocorrer direto com o mainframe, as razoes são além de historicas, tais como a tecnologia à época não permitia esse tipo de consulta ou já existia uma solução que se encaixava "perfeitamente" para essa situação, são culturais e dependendo do seu local de trabalho esse tipo de pergunta pode ser mal interpretada.

Entenda que o, “deixa como esta” é muito forte na maioria das pessoas que trabalham com mainframes, lembre que eles trabalham com isso há decadas. Evite que esse tipo de comportamento acometa você, tente mostrar alternativas sutilmente, não desista nunca! Tente sempre, na medida do possivel melhorar como "as coisas" estão !

Em virtude disso pode ser dificil encontrar o java rodando no mainframe.

Embora o java nao consiga executar instruções no sistema operacional do mainframe o seu programa "compilado" roda sem grandes dificuldades debaixo do Z/OS Unix, o programa java "compilado" em bytecode (class file) é executado na maquina virtual java do Unix.

Afinal esse é a grande vantagem do java, rodar em qualquer lugar ! Nas versoes mais recentes do CICS (creio que a pertir da 5) foram disponibilizadas API´s para chamada direta por programas JAVA, isto é, existem metodos que podem ser utilizados através de classes que existam no JCICS que basicamente executam comandos nativos do CICS “direto no mainframe” à partir do seu . No Manual do CICS esta escrito assim “You can write Java™ application programs that use CICS® services and run under CICS control. Using the CICS Explorer® SDK, you can develop applications that use the JCICS class library to access CICS resources and interact with programs that are written in other languages. You can also connect to your Java programs by using various protocols and technologies, such as web services or CICS Transaction Gateway.” Esse infelizmente eu só ouvi falar mesmo, nunca vi rodando. Se você tiver manda pra mim que tenho bastante curiosidade de ver como que funciona!

Voltando ao Java em si, para verificar se sua empresa tem o java instalado no Z/OS entre no OMVS (recomendo via ISPF 6 -Command- OMVS).

Deve aparecer algo assim:

IBM
Licensed Material - Property of IBM
5694-A01 (C) Copyright IBM Corp. 1993, 2018
(C) Copyright Mortice Kern Systems, Inc., 1985, 1996.
(C) Copyright Software Development Group, University of Waterloo, 1989.
All Rights Reserved.
U.S. Government users - RESTRICTED RIGHTS - Use, Duplication, or
Disclosure restricted by GSA-ADP schedule contract with IBM Corp.
IBM is a registered trademark of the IBM Corp.
BUGA:/u/buga: >




===>
INPUT ESC=¢ 1=Help 2=SubCmd 3=HlpRetrn 4=Top 5=Bottom 6=TSO
7=BackScr 8=Scroll 9=NextSess 10=Refresh 11=FwdRetr 12=Retrieve

Caso não tenha acesso deve dar um erro parecido com o abaixo

FSUM2059I No session was started. This TSO/E user ID is in a group that does n ot have access to OpenMVS.+
FSUM2060I Function = sigprocmask, return value = FFFFFFFF, return code = 000000 9C, reason code = 0B0C00FA

Solicite acesso e tente novamente ! Se deu tudo certo informe o comando

java -fullversion

se aparecer algo do tipo "java full version" é porque ele existe e esta instalado. Caso não esteja instalado

java: FSUM7351 not found

consulte o pessoal de infra estrutura/produtos de sua empresa e troque uma ideia com eles - se existir essa abertura por parte das equipes.

Legal, temos o java instalado em nosso z/OS Unix.

Mas como criar/executar um programa feito em java no mainframe ?

Simples vamos aos passos:

1 - Criar o código fonte, digamos de um hello world (programa com o unico objetivo de enviar uma mensagem "hello world" para algum dispositivo de saida).

2 - compila-lo. (apenas para não deixar ninguem boiando… esse é o passo que faz com que o programa que você escreveu - código fonte - possa ser “convertido” para uma outra forma, essa forma o computador entende e consegue fazer o que você pediu pra ele!)

3 - executa-lo.

4 - verificar o resultado.

Supondo que o leitor tenha conhecimentos parcos em Unix ou mesmo Linux, vamos utilizar o ISHELL para nos auxiliar nessa tarefa.

Execute o ISHELL (recomendo via ISPF 6 ISHELL) na tela do emulador aparecera

File Directory Special_file Tools File_systems Options Setup Help ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss UNIX System Services ISPF Shell Enter a pathname and do one of these:  - Press Enter.                                                               - Select an action bar choice.                                               - Specify an action code or command on the command line.                                                                                                 Return to this panel to work with a different pathname. More: + /u/buga ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ EUID=0 Command ===> ____________________________________________________________
ISHELL Screen

altere o

/u/buga 

e insira o nome de seu codigo fonte (/HelloWorld#001.java) a ser criado, exemplo

/u/buga/HelloWorld0001.java

vá no menu File e crie um novo arquivo NEW com permissão "755" (os arquivos no unix tem essa propriedade de permissão para garantir segurança), no caso esse 755 indica que o dono possue privilegios de ler, escrever e executar e o grupo e outros apenas de leitura e execucao.

O tipo de arquivo é normal e você quer editá-lo.

ok seu arquivo foi criado. Agora precisamos edita-lo, para isso vá no menu file e editar (opcao 5), não informe (se o sistema pedir mais nenhum dado). Se deu tudo certo você estara no editor do ISHELL que segue abaixo

File Edit Edit_Settings Menu Utilities Compilers Test Help
-------------------------------------------------------------------------------- 
EDIT /u/buga/HelloWorld0001.java                          Columns 00001 00072 
Command ===>                                                 Scroll ===> PAGE 
****** ***************************** Top of Data ****************************** 
==MSG> -Warning- The UNDO command is not available until you change
==MSG> your edit profile using the command RECOVERY ON.
''''''
''''''
''''''
''''''
''''''
''''''
''''''
''''''
''''''
''''''
''''''
''''''
''''''
''''''
''''''
''''''
****** **************************** Bottom of Data ****************************

Insire seu codigo do hello world no editor, algo como

public class HelloWorld0001 {
  public static void main(String[] args) {
    System.out.println("Hello World em JAVA");
  }
}

1 - criacao da "classe" publica HelloWorld0001 (o que vira nosso programa,sic, depois de compilar nosso codigo-fonte/arquivo). 2 - declaracao da funcao principal 1 e 2 pode-se considerar padrao de mercado ! 3 "dá display" -> System.out.println com os dizeres: Hello World em JAVA o ; indica que o comando esta encerrado. { e } são delimitadores.

Caso tenha interesse em aprender java ou alguma outra linguagem de programação sugiro que você procure algum tutorial/apostila na internet, consulte o site do fabricante/distribuidor/normatizador da sua linguagem escolhida ou ainda compre algum livro sobre programação. Tem bastante video aula bem boa no youtube tambem, dificil é achar.

Existem pacotes de desenvolvimento (IDE) - Integrated Development Environment muito completos, com source codes de exemplo, menus de ajuda, verificacao de sintaxe, enfim uma maravilha pra quem trabalha em ambiente não mainframe. Esses ambientes são intuitivos, faceis de operar e auxiliam enormemente o seu aprendizado, seja qual for a linguagem que você esta aprendendo. Recomendamos tentar o eclipse.

Salve seu arquivo com o comando "save" agora já temos o código fonte e necessitamos "compila-lo" para isso de uns "F3" até voltar para a tela inicial do ISHELL e vamos ao menu Tools - 2 - Run shell command(SH)...

Insira o comando para compilar o programa "javac HelloWorld0001.java", deve ficar assim

File Directory Special_file Tools File_systems Options Setup Help s EsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssN e Enter a Shell Command e e e E e Enter a shell command and press Enter. e e e e Standard output and standard error are redirected to a temporary e e file. If there is any data in the file when the shell command e e completes, the file is displayed. e e javac HelloWorld0001.java e R e __ e e __ e e __ e e e e e e e e e E e e e e e e DsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssM Command ===> SH
...e lá vamos nós!

Caso a compilação tenha sido um sucesso nada é informado ! Para confirmar se seu programa foi "compilado" devemos verificar se foi criado um arquivo "class file", para isso retorne ao menu inicial do ISHELL (teclando PF3) e informe o seu diretorio principal, no meu caso "/u/buga/" e tecle control. Será exibido uma listagem com todos os arquivos desse diretorio, o que nos interessa é o HelloWorld0001.class, se ele estiver lá é porque a compilação deu certo.

Agora para executar o programa voltamos a tela inicial do ISHELL e executamos o comando de execucao do programa (de maneira analoga à compilacao só alterando o javac por java e retirando a extensão do arquivo) fica assim :

"java HelloWorld0001"

Se deu certo teremos o hello world exibido "em tela" conforme abaixo, no nosso caso é um arquivo temporario não uma tela propriamente dita.

Menu   Utilities   Compilers   Help
sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss 
BROWSE /tmp/buga.19:27:31.613935.ishell 
Line 00000000 Col 001 019 
Command ===>                                                 Scroll ===> PAGE 
********************************* Top of Data ********************************** 
Hello World em JAVA
******************************** Bottom of Data ********************************

Erros de execucao sao informados da mesma maneira que a execução ok em tela, digamos por exemplo que você executou

java HelloWorld001 o sistema informará

Menu   Utilities   Compilers   Help
sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss 
BROWSE /tmp/buga.19:15:33.081681.ishell
Command ===>                                                 Scroll ===> PAGE 
********************************* Top of Data ********************************** 
The java class is not found: HelloWorld001
******************************** Bottom of Data ********************************

pois o nome da "classe" esta incorreto.

Podem ocorrer erros na compilação "javac" sendo o mais comum erros devidos caracteres ilegais. O mainframe utiliza codificacao de seus caracteres em EBCDIC e dependendo de sua instalação os colchetes do java ou do C podem ser considerados caracteres ilegais.

No C não temos tantos problemas pois pode-se utilizar "trigraphs" (representação de 1 caracter por outros 3 sendo que 2 os dois primeiros sao "??" ) já no java isso não pode ser realizado facilmente. O problema é que cada instalação do mainframe possui uma "tabela" EBCDIC diferente ! o EBCDIC possui caracteres padrão em todas as tabelas A..Z 1..9 e alguns caracteres nacionais, fora isso é tudo diferente. Cada tabela é chamada de codepage ou codeset e ai que vem a zona toda, evite em mainframe utilizar cedilha, acentuacao e outros pois caso sua instalação tenha o codeset alterado muitas aplicacoes podem parar de funcionar.

O erro dos colchetes, por exemplo, será listado apos a compilacao algo como:

programa.java.linha illegal character: \abc

sendo programa o nome do seu fonte, java fixo e linha o numero da linha onde o erro foi detectado, \abc o numero em decimal do caracter ilegal em sua instalação.

Caso o erro seja parecido com isso tente converter seu arquivo para algum outro codepage. O codepage padrão que deve estar instalado é o IBM-037 com codificacao para acentos e tal, seria o padrão "portugues BR", tente converter para o IBM-1047 (English - United States (USS)) atraves do "comando" iconv.

Para isso vá no menu principal do ISHELL aba TOOLS executa comando SH e informe:

iconv -f ibm-037 -t ibm-1047 HelloWorld0001.java > Hello.java

Se deu certo será criado um arquivo em seu diretorio com o nome Hello.java no qual os colchetes foram alterados ! Compile esse novo arquivo e o execute, deve funcionar !

Rodando diretamente no OMVS.

IBM
Licensed Material - Property of IBM
5650-ZOS Copyright IBM Corp. 1993, 2017
(C) Copyright Mortice Kern Systems, Inc., 1985, 1996.
(C) Copyright Software Development Group, University of Waterloo, 1989.
U.S. Government Users Restricted Rights -
Use,duplication or disclosure restricted by
GSA ADP Schedule Contract with IBM Corp.
IBM is a registered trademark of the IBM Corp.
Z02236:/z/z02236 > java HelloWorld0001
Hello World em JAVA
Z02236:/z/z02236 >
Execução direta via console

Agora rodando via JCL atraves do BPXBATCH

//HELLO JOB 1,REGION=0M
//CALLJAVA EXEC PGM=BPXBATCH
//STDOUT DD SYSOUT=*
//STDERR DD SYSOUT=*
//STDPARM DD *
sh java HelloWorld0001
/*

A sysout do job

Display    Filter    View    Print    Options    Search    Help
SDSF OUTPUT DISPLAY HELLO JOB04490 DSID 2 LINE 0                 COLUMNS 02- 81
COMMAND INPUT ===>                                              SCROLL ===> PAGE
********************************* TOP OF DATA **********************************
               J E S 2  J O B  L O G  --  S Y S T E M  S 0 W 1  --  N O D E 
                                                                            
08.16.58 JOB04490 ---- TUESDAY, 06 NOV 2018 ----
08.16.58 JOB04490 IRR010I USERID Z02236 IS ASSIGNED TO THIS JOB.
08.16.59 JOB04490 ICH70001I Z02236 LAST ACCESS AT 08:15:20 ON TUESDAY, NOVEMB 
08.16.59 JOB04490 $HASP373 HELLO STARTED - INIT 2 - CLASS A - SYS 
08.17.01 JOB04490 - -----TIMINGS (MINS.)--
08.17.01 JOB04490 -STEPNAME PROCSTEP RC EXCP CONN TCB SRB C 
08.17.01 JOB04490 -CALLJAVA 00 67 2 .00 .00
08.17.01 JOB04490 -HELLO ENDED. NAME- TOTAL TCB CPU TIM 
08.17.01 JOB04490 $HASP395 HELLO ENDED - RC=0000
------ JES2 JOB STATISTICS ------
06 NOV 2018 JOB EXECUTION DATE
          7 CARDS READ
         48 SYSOUT PRINT RECORDS
          0 SYSOUT PUNCH RECORDS
          6 SYSOUT SPOOL KBYTES
       0.03 MINUTES EXECUTION TIME
******************************** BOTTOM OF DATA ********************************
Execucao via JCL

Verificando os DD’s gerados

Display     Filter     View     Print     Options     Search     Help
--------------------------------------------------------------------------------
SDSF JOB DATA SET DISPLAY - JOB HELLO (JOB04490) DATA SET DISPLAYED
COMMAND INPUT ===> _                                           SCROLL ===> PAGE 
PREFIX=* DEST=(ALL) OWNER=Z02236 SYSNAME=
NP  DDNAME    StepName ProcStep DSID Owner  C Dest          Rec-Cnt Page 
    JESJCLIN                       1 Z02236 X                     5
    JESMSGLG  JES2                 2 Z02236 X LOCAL              18
    JESJCL    JES2                 3 Z02236 X LOCAL               5
    JESYSMSG  JES2                 4 Z02236 X LOCAL              20
    $INTTEXT  JES2                 5 Z02236 A                     5
    EVENTLOG  JES2                 8 Z02236 A                     4
    STDPARM   CALLJAVA           101 Z02236 X                     1
    STDOUT    CALLJAVA           102 Z02236 X LOCAL               1
Cartoes DD na sysout

E no STDOUT temos nossa mensagem da execução

Screen Shot da STDOUT com o "Hello World em JAVA" no mainframe

Texto alternativo à figura acima.

Display  Filter  View  Print  Options  Search  Help
SDSF OUTPUT DISPLAY HELLO     JOB04490   DSID     102 LINE 0     COLS 02- 81

COMMAND INPUT ===> _                                        SCROLL ===> PAGE

********************************* TOP OF DATA **********************************

Hello World em JAVA

******************************** BOTTOM OF DATA ********************************

Last updated