RPG调用Java,Java.lang.NoClassDefFoundError

RPG调用Java,Java.lang.NoClassDefFoundError,java,jar,jvm,ibm-midrange,rpg,Java,Jar,Jvm,Ibm Midrange,Rpg,我的目标是从Java调用一个Web服务,该服务由RPG函数启动。(我知道,路途遥远,但这正是我们需要的) 我在AS400上创建了一个/JavaLib文件夹,并复制了我们需要的所有外部JAR 使用静态方法WebServiceCaller.Call()创建Java类以调用Web服务。每当我运行我的RPG程序时,RPG调用此方法时,一切都很好 我得到一个Java异常: 信息……:调用Java方法(C G D)时收到Java异常 F) . 原因……:程序WAL60326/WEBSERCALR中的RPG程

我的目标是从Java调用一个Web服务,该服务由RPG函数启动。(我知道,路途遥远,但这正是我们需要的)

我在AS400上创建了一个
/JavaLib
文件夹,并复制了我们需要的所有外部JAR

使用静态方法
WebServiceCaller.Call()
创建Java类以调用Web服务。每当我运行我的RPG程序时,RPG调用此方法时,一切都很好

我得到一个Java异常:

信息……:调用Java方法(C G D)时收到Java异常 F) .
原因……:程序WAL60326/WEBSERCALR中的RPG程序WEBSERCALR 收到Java异常“Java.lang.NoClassDefFoundError:
调用带有签名的方法“Call”时,“javax.xml.rpc.ServiceException” “(LwebService.Input;)LwebService.Output;”在课堂上
“webService.WebServiceCaller”

类路径变量:

/JavaLib:/home/WAL60326/WebServiceCaller

所以我相信我的RPG和Java类很好,我相信我已经正确地设置了CLASSPATH变量。不知道还有什么要检查的


更新 所以我需要的jar文件是我已经检查过的
jaxrpc.jar
;它确实存在于我的
/JavaLib
中。 能够在AS400
Java版本“1.5.0”
上检查我的Java版本。然后按照这些检查我的操作系统是否为V6R1

这个Jar文件是否可能是我的Java版本过时了?这有可能吗


编辑 以下是我的源代码:

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;
    }
}
请注意,中的GetBidsProxy类是由Eclipse生成的。Java端在我的Windows机器上运行良好。只是不在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

对于给定的作业,类路径只读取一次,即第一次调用java命令和JVM启动时。如果在此之后类路径发生更改,JVM将不会看到或使用新的类路径。注销和打开(要开始一个新作业),设置类路径(我在我的登录程序中这样做),然后尝试使用您正在使用的类。

如果类路径正确,那么要检查的另一件事是RPG程序中的Java原型。它需要与Java类定义完全匹配

首先,100%确保jaxrpc.jar拥有您认为应该拥有的所有类。启动QShell,然后
javatf/JavaLib/jaxrpc.jar
。确保您至少拥有以下各项:

javax/xml/rpc/Call.class             
javax/xml/rpc/ServiceFactory.class   
javax/xml/rpc/ServiceException.class 
接下来,用纯Java编写一个简单的概念验证程序,以确保所有部分都能按预期工作。注意:JAX-RPC已经过时,并在Java1.6及更高版本中消失。它已经被JAX-WS所取代。如果这是一个全新的应用程序,请考虑使用更多的当前实现。这篇2006年的文章解释了其中的一些差异


一旦您编写了一个纯Java程序,就可以使用您使用的Java类并在RPG中对它们进行原型化了。假设您已经完成了所有这些,您可以编辑您的问题以显示RPG*类原型以及用于调用它们的RPG代码吗。基本上,看看阅读此问题的人是否可以在不同的框中重新创建设置。

我在RPG代码中使用了一些Java,我发现将容器文件夹添加到类路径是不够的。我必须识别类路径中的各个JAR。

出于怀旧的原因投票,试图让RPG与Java一起工作。您可能必须在类路径中的
/JavaLib
中枚举JAR。您的异常表明并非所有的JAR(类)可用或加载失败->
java.lang.NoClassDefFoundError:javax.xml.rpc.ServiceException
检查该类
ServiceException
属于哪个JAR,并确保您的RPG可以加载它。@munyul如何查看JAR加载失败?@ZioN,我不确定您是否可以。正如上面rsp所建议的,确保所有需要的JAR都在类路径中。谢谢,这可以解释我的大多数错误,但是我已经检查了类路径变量。将其设置到我的
/JavaLib
文件夹。所需的“jaxrpc jar”就在那里。我已经在我的windows机器上测试了这个Java应用程序,它可以正常工作。我尝试了
Java tf/JavaLib/jaxrpc.jar
,但它在线程“main”Java.lang.NoClassDefFoundError:tf中给了我这个错误
异常。这是一个测试应用程序,因此我应该使用最新的JAXWS。有趣的是,我们在Java 1.6的windows机器上使用了这个过时的版本,并且可以正常工作。你会看到我已经用我的源代码更新了这个问题。目前,我正在尝试调用一个web服务,我正在测试的web服务位于我们的LAN上,但是如果您可以尝试其他服务的话。谢谢你迄今为止的帮助。