通过Java连接SAP时出现exception

能告诉我解决这个问题的解决方案—

我尝试通过Java类连接SAP相关文件时遇到此exception,即使sapjco3.jar位于我的库路径中。我在Windows XP和Windows Server 98中尝试过此操作。

java.lang.UnsatisfiedLinkError: no sapjco3 in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1682) at java.lang.Runtime.loadLibrary0(Runtime.java:823) at java.lang.System.loadLibrary(System.java:1030) at com.sap.conn.jco.rt.DefaultJCoRuntime.loadLibrary(DefaultJCoRuntime.java:441) at com.sap.conn.jco.rt.DefaultJCoRuntime.registerNativeMethods(DefaultJCoRuntime.java:307) at com.sap.conn.jco.rt.JCoRuntime.registerNatives(JCoRuntime.java:987) at com.sap.conn.rfc.driver.CpicDriver.(CpicDriver.java:948) at com.sap.conn.rfc.engine.DefaultRfcRuntime.getVersion(DefaultRfcRuntime.java:43) at com.sap.conn.rfc.api.RfcApi.RfcGetVersion(RfcApi.java:259) at com.sap.conn.jco.rt.MiddlewareJavaRfc.(MiddlewareJavaRfc.java:200) at com.sap.conn.jco.rt.DefaultJCoRuntime.initialize(DefaultJCoRuntime.java:73) at com.sap.conn.jco.rt.JCoRuntimeFactory.(JCoRuntimeFactory.java:23) at com.sap.conn.jco.rt.RuntimeEnvironment.(RuntimeEnvironment.java:40) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at java.lang.Class.newInstance0(Class.java:355) at java.lang.Class.newInstance(Class.java:308) at com.sap.conn.jco.ext.Environment.getInstance(Environment.java:121) at com.sap.conn.jco.ext.Environment.registerDestinationDataProvider(Environment.java:216) at de.vogella.sap.rfc.core.connection.Connection.(Connection.java:37) at struct.actions.GestReservaSap.(GestReservaSap.java:63) at eu.sony.com.moduloreservas.ReservasMainClass.main(ReservasMainClass.java:259) 

SAP Java Connector在内部使用本机库连接到SAP。 这个本机库不是sapjco3.jar而是sapjco3.dll(在Windows系统上)。 即dll文件必须位于Java库路径中的文件夹中。

后者是Java系统属性,您可以通过调用在应用程序中访问它

 System.getProperty("java.library.path") 

然后你可以将sapjco3.dll放入你的库路径中的一个文件夹中(在Windows上,例如C:\ WINNT \ system32),或者通过显式设置将库路径设置为特定文件夹库路径:

  • 在访问SAP JCo之前System.setProperty("java.library.path", "C:\path\to\folder\with\dll\")通过设置System.setProperty("java.library.path", "C:\path\to\folder\with\dll\")在应用程序代码中
  • 或者在使用命令行参数-Djava.library.path=C:\path\to\folder\with\dll\启动Java时

由于将dll放入特定于系统的文件夹(如winnt \ system32)可能不仅会对您的应用程序产生影响,也会对其他应用程序产生影响,因此建议将包含sapjco3.dll的文件夹添加到应用程序的库路径中。 更灵活的方法是通过命令行指定它,如上所示,所以你没有硬编码。