我的目标是从 Java 调用 Web 服务,从 RPG 函数启动。 (我知道,这还有很长的路要走,但这是我们需要的)
我在 AS400 上创建了一个 /JavaLib
文件夹,并复制了我们需要的所有外部 Jar。
使用静态方法 WebServiceCaller.Call()
创建一个 Java 类来调用 Web 服务。每当我运行我的 RPG 程序时,一切都很好,因为 RPG 会调用此方法。
我得到一个 Java 异常:
Message . . . . : Java exception received when calling Java method (C G D F).
Cause . . . . . : RPG procedure WEBSERCALR in program WAL60326/WEBSERCALR received Java exception "java.lang.NoClassDefFoundError:
javax.xml.rpc.ServiceException" when calling method "Call" with signature "(LwebService.Input;)LwebService.Output;" in class
"webService.WebServiceCaller".
CLASSPATH 变量:
/JavaLib:/home/WAL60326/WebServiceCaller
所以我相信我的 RPG 和 Java 类没问题,而且我相信我已经正确设置了 CLASSPATH 变量。不知道还有什么要检查的。
更新
所以我需要的jar文件是jaxrpc.jar
我查过了;它确实存在于我的 /JavaLib
中。
能够在 AS400 java 版本“1.5.0”
上检查我的 Java 版本。并关注这些 instructions检查我的操作系统是否为 V6R1。
会不会是我的 Java 版本过时了,这个 Jar 文件无法加载/工作?这有可能吗?
编辑
这是我的源代码:
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 机器上。
角色扮演游戏: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
最佳答案
对于给定的作业,CLASSPATH 只读一次,即您第一次调用 java 命令和 JVM 启动时。如果在那之后您的 CLASSPATH 发生了变化,JVM 将看不到或使用新的 CLASSPATH。注销和登录(开始一项新工作),设置 CLASSPATH(我在我的登录程序中这样做)然后尝试使用您正在使用的类。
关于java - RPG调用Java,java.lang.NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18398170/