Java 11和jacorb。 ClassNotFoundException:javax.rmi.CORBA.Stub

时间:2019-05-27 14:05:03

标签: java java-11 jacorb

我正在尝试使用jacorb 3.9执行Java 11(openjdk)应用程序。该应用程序开始执行,但因抱怨丢失而崩溃:

javax.rmi.CORBA.Stub

我已将所有jacorb库包含在CLASSPATH中

set CLASSPATH = ${JACORB_PATH}/jacorb.jar:${CLASSPATH}
set CLASSPATH = ${JACORB_PATH}/jacorb-3.9.jar:${CLASSPATH}
set CLASSPATH = ${JACORB_PATH}/jacorb-omgapi.jar:${CLASSPATH}
set CLASSPATH = ${JACORB_PATH}/slf4j-api.jar:${CLASSPATH}
set CLASSPATH = ${JACORB_PATH}/slf4j-jdk14-1.7.14.jar:${CLASSPATH}
set CLASSPATH = ${JACORB_PATH}/jacorb-services.jar:${CLASSPATH}
set CLASSPATH = ${JACORB_PATH}/picocontainer.jar:${CLASSPATH}
set CLASSPATH = ${JACORB_PATH}/wrapper.jar:${CLASSPATH}
set CLASSPATH = ${JACORB_PATH}/antlr.jar:${CLASSPATH}
set CLASSPATH = ${JACORB_PATH}/idl.jar:${CLASSPATH}

执行时,我得到了:

java.lang.reflect.InvocationTargetException
...
Caused by: java.lang.ClassNotFoundException: javax.rmi.CORBA.Stub
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)

我也尝试过通过以下方式设置JDK_JAVA_OPTIONS:

--module-path ${JACORB_PATH} --add-modules java.corba 
-Dorg.omg.CORBA.ORBClass=org.jacorb.orb.ORB -Dorg.omg.CORBA.ORBSingletonClass=org.jacorb.orb.ORBSingleton

但抱怨“找到了两个版本的模块slf4j.jdk14”

执行程序的命令是:

java -classpath $CLASSPATH myprog.MYPROG 

该应用程序最初是为Java 8编写的,可以通过jacorb将以下参数传递给Java命令来正常工作:

-Djava.endorsed.dirs=JACORB_PATH
-Dorg.omg.CORBA.ORBClass=org.jacorb.orb.ORB
-Dorg.omg.CORBA.ORBSingletonClass=org.jacorb.orb.ORBSingleton

该应用程序根本不使用rmi。它是“经典” CORBA客户端。尝试解析命名服务的初始引用时会崩溃

2 个答案:

答案 0 :(得分:2)

问题似乎已在项目mailing list上提出。一种解决方法是在jacorb-3.8.jar和sfl4j jars旁边的类路径上添加以下2:

答案 1 :(得分:0)

遵循JEY的建议,以替换JDKS 9及更高版本中缺少的类javax.rmi.CORBA.Stub,我从十几个相关的JDK-8类组成了一个存根组件,此方法有效。事实证明,javax.rmi.CORBA.Stub的代码覆盖范围减少到了Stub.toString()方法,根据上下文,该方法再次调用了超类方法。

因此,针对JDK 9、10(可能以后)的解决方案是使用一个空的Java类代理,以满足类加载器的需要; JacOrb的源代码可以改用ObjectImpl类,以最终确定瞬态RMI内容。

package javax.rmi.CORBA;

import org.omg.CORBA_2_3.portable.ObjectImpl;

/**
 * JacOrb 3.9 surrogate 
 * [Base class from which all RMI-IIOP stubs must inherit.]
 */
public abstract class Stub extends ObjectImpl implements java.io.Serializable
{
}

在JDK 8之后,不再支持JacOrb库和替换类名。