Java 11 and jacorb. ClassNotFoundException: javax.rmi.CORBA.



>我正在尝试使用 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 客户端。尝试解析命名服务的初始引用时崩溃

这个问题似乎已经在项目邮件列表中提出过。一种解决方法是在 jacorb-3.8 旁边添加类路径.jar sfl4j jar jar 这 2

  • jacorb-omgapi-3.8.jar - 来自JacORB分布
  • jboss-rmi-api_1.0_spec-1.0.6.Final.jar - 来自 https://github.com/jboss/jboss-rmi-api_spec。该库提供了Java RMI API,该API最初由JRE中的JacORB使用。(马文(

按照 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
{
}

对 JacOrb 库的认可和类名替换在 JDK 8 之后已经过时。