简体   繁体   English

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

[英]Java 11 and jacorb. ClassNotFoundException: javax.rmi.CORBA.Stub

I am trying to execute my application of java 11 (openjdk) with jacorb 3.9.The application starts executing but crashes complaining about missing :我正在尝试使用 jacorb 3.9 执行我的 java 11 (openjdk) 应用程序。应用程序开始执行但崩溃,抱怨丢失:

javax.rmi.CORBA.Stub

I have included all jacorb libraries in the CLASSPATH我已经在 CLASSPATH 中包含了所有 jacorb 库

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}

When executing , I get this:执行时,我得到这个:

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)

I have tried also to set up the JDK_JAVA_OPTIONS with:我还尝试使用以下方法设置 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

But complains about "Two versions of module slf4j.jdk14 found"但抱怨“发现两个版本的模块 slf4j.jdk14”

The command for executing the program is:执行程序的命令是:

java -classpath $CLASSPATH myprog.MYPROG 

The application was originally written for Java 8 and working OK with jacorb passing the following parameters to java command:该应用程序最初是为 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

The application does not use rmi at all.该应用程序根本不使用 rmi。 It is a 'classic' CORBA client.它是一个“经典的”CORBA 客户端。 It crashes when trying to resolve the initial reference of the naming Service尝试解析命名服务的初始引用时崩溃

It seems that the issue have been raised on the project mailing list .似乎该问题已在项目邮件列表中提出 A workaround is to add on the classpath next to jacorb-3.8.jar and the sfl4j jars these 2:一种解决方法是在 jacorb-3.8.jar 和 sfl4j jar 旁边的类路径上添加这两个:

Following JEYs suggestion to substitue the class javax.rmi.CORBA.Stub missing in JDKS 9 and later, I composed a stub component from a dozen of relevant JDK-8-classes and this worked.按照 JEY 的建议,替换 JDKS 9 及更高版本中缺少的javax.rmi.CORBA.Stub类,我从十几个相关的 JDK-8 类中组成了一个存根组件,这奏效了。 The code coverage of the javax.rmi.CORBA.Stub turned out to reduce to the Stub.toString() method, which again by context just calls the super class method. javax.rmi.CORBA.Stub的代码覆盖率结果减少到Stub.toString()方法,该方法再次通过上下文调用超类方法。

So the solution for JDK 9, 10 (and probably later) is to have an empty Java class surrogate, satisfying the class loader;所以 JDK 9、10(可能以后)的解决方案是有一个空的 Java 类代理,满足类加载器; JacOrb sources could use class ObjectImpl instead, to finally pintch off transient RMI stuff. 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
{
}

Endorsement of JacOrb libraries and class name replacement is obsolete after JDK 8.在 JDK 8 之后,JacOrb 库和类名替换的认可已过时。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM