[英]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.