RPG appelant Java, java.lang.NoClassDefFoundError


Mon objectif est d'appeler un service Web à partir de Java, initié à partir d'une fonction RPG. (Je sais, son long chemin, mais c'est ce dont nous avons besoin)

J'ai créé un dossier /JavaLib sur l'AS400 et copié tous nos pots externes nécessaires dont nous avons besoin.

Créez une classe Java avec une méthode statique WebServiceCaller.Call() pour appeler un service Web. Quand je lance mon programme RPG, tout va bien pour que le RPG appelle cette méthode.

Je reçois une exception Java:

Message . . . . : Exception Java reçu lors de l'appel de la méthode Java (C G D F).
Causer . . . . . : Procédure RPG WEBSERCALR dans le programme WAL60326 / WEBSERCALR exception Java reçue " java.lang.NoClassDefFoundError:
javax.XML.RPC.ServiceException "lors de l'appel de la méthode "Call" avec signature "(LwebService.Entrée;)LwebService.Sortie; " dans la classe
"webService.WebServiceCaller".

Variable CLASSPATH:

/JavaLib:/home/WAL60326/WebServiceCaller

Donc Je crois que ma classe RPG et Java va bien, et je crois que j'ai configuré ma variable CLASSPATH correctement. Je ne sais pas quoi d'autre il y a à vérifier.


Mise à jour

, Donc le fichier jar dont j'ai besoin est jaxrpc.jar, j'ai vérifié; il n'existe dans mon /JavaLib. J'ai pu vérifier ma version Java sur l'AS400 java version "1.5.0". Et suivez ces instructions pour vérifier que mon système d'exploitation est V6R1.

Serait-ce ma version Java qui est obsolète, pour que ce fichier Jar soit chargé / fonctionne? C'est que même un possibilité?


Modifier

Voici mon code source:

Java: WebServiceCaller.Java

package webService;

import java.rmi.RemoteException;

import stocklistGetBids.GetBidsProxy;

public class WebServiceCaller {
    public static Output Call(Input in) { // Input Class, is just a way to hold all the input together
        Output out = null; // Output Class, holds all the output together

        try {
            GetBidsProxy getBidsProxy = new GetBidsProxy(); // GetBidsProxy generated by Eclipse 

            out = new Output(getBidsProxy.getBids(in.LogKey, in.Id));           

        } catch (RemoteException e) {
            e.printStackTrace();
            out = new Output("ERR"); 
        }

        return out;
    }
}

Notez que la classe GetBidsProxy est générée par Eclipse. Et le côté Java fonctionne bien sur ma machine Windows. Mais pas sur la machine AS400.

RPG: WEBSERCALR.RPGLE

 H DFTACTGRP(*NO)
 H thread(*serialize)

 D WebsercalInput  DS
 D   ReturnCode                   7A
 D   LogKey                      20A
 D   ID                          20A

 D jString         S               O   CLASS(*JAVA:'java.lang.String')
 D jLogKey         S               O   CLASS(*JAVA:'java.lang.String')
 D jID             S               O   CLASS(*JAVA:'java.lang.String')
 D Input           S               O   CLASS(*JAVA:'webService.Input')
 D Output          S               O   CLASS(*JAVA:'webService.Output')

 D new_Input       PR              O   EXTPROC(*JAVA:
 D                                       'webService.Input':
 D                                       *CONSTRUCTOR)
 D   LogKey                            like(jString)
 D   ID                                like(jString)

 D new_String      PR              O    EXTPROC(*JAVA:
 D                                       'java.lang.String':
 D                                       *CONSTRUCTOR)
 D  bytes                        30A    CONST VARYING

 D Call            PR                  like(Output)
 D                                     EXTPROC(*JAVA:
 D                                       'webService.WebServiceCaller':
 D                                       'Call')
 D                                     STATIC
 D  in                                 like(Input)

 D getReturnStat   PR              O   EXTPROC(*JAVA:
 D                                       'webService.Output':
 D                                       'getReturnedStatus')
 D                                     CLASS(*JAVA:'java.lang.String')

 D getBytes        PR         65535A   VARYING
 D                                     EXTPROC(*JAVA:
 D                                       'java.lang.String':
 D                                       'getBytes')

 C     *ENTRY        PLIST
 C                   PARM                    WebsercalInput

  /free
   jLogKey = new_String(LogKey);
   jID = new_String(ID);

   Input = new_Input(jLogKey:jID);

   Output = Call(Input);

   jString = getReturnStat(Output);

   ReturnCode = getBytes(jString);

   return;
  /End-Free
Author: ZioN, 2013-08-23

3 answers

Le CHEMIN de CLASSE n'est lu qu'une seule fois pour un travail donné, la première fois que vous appelez la commande java et que la JVM démarre. Si votre CHEMIN de classe change après cela, la JVM ne verra pas ou n'utilisera pas le nouveau CHEMIN de classe. Signez et activez (pour démarrer un nouveau travail), définissez le chemin de CLASSE (je le fais dans mon programme de connexion), puis essayez d'utiliser la classe avec laquelle vous travaillez.

 4
Author: Buck Calabro, 2013-08-23 14:58:20

Si le CLASSPATH est correct, l'autre chose à vérifier est le prototype Java dans votre programme RPG. Il doit correspondre exactement à la définition de la classe Java.

Tout d'abord, assurez-vous à 100% que votre jaxrpc.pot a toutes les classes que vous pensez qu'il devrait. Démarrez QShell, puis java tf /JavaLib/jaxrpc.jar. Assurez-vous que vous avez au moins:

javax/xml/rpc/Call.class             
javax/xml/rpc/ServiceFactory.class   
javax/xml/rpc/ServiceException.class 

Ensuite, faites un simple programme de preuve de concept en Java pur pour vous assurer que toutes les pièces fonctionnent comme vous le souhaitez. Remarque: JAX-RPC est obsolète et disparaît en Java 1.6 et plus. Il a été remplacé par JAX-WS. S'il s'agit d'une toute nouvelle application, envisagez d'utiliser l'implémentation la plus actuelle. Cet article de 2006DeveloperWorks explique certaines des différences.

Une fois que vous avez un programme Java pur écrit, il est temps de prendre les classes Java que vous avez utilisées et de les prototyper en RPG. En supposant que vous avez fait tout cela, pourriez-vous modifier votre question pour montrer les prototypes de CLASSE RPG *et le code RPG utilisé pour les invoquer. Fondamentalement, voir si quelqu'un la lecture de cette question peut recréer la configuration sur une boîte différente.

 1
Author: Buck Calabro, 2013-08-26 17:14:33

J'ai utilisé du Java dans mon code RPG et j'ai découvert qu'il ne suffisait pas d'ajouter le dossier conteneur au CLASSPATH. J'ai dû identifier les pots individuels dans le CLASSPATH.

 0
Author: user3137978, 2013-12-26 22:58:25