0

设置:Windows 10 openjdk-11.0.5+10 Openwebstart 1.0.0

我们有一个通过 RMI 连接到后端服务器的 Java Swing 客户端。客户端通过 JNLP 分发。

当我们启动客户端时一切正常,直到客户端通过 RMI 获得 java.sql.Timestamp 并希望它反序列化。然后我们得到以下异常:

Caused by: exceptions.unchecked.communication.ClientLoginException: java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
    java.lang.ClassNotFoundException: java.sql.Timestamp    
 at client.LoginHandler.login(LoginHandler.java:134)     
 at code.MainClient.lambda$0(MainClient.java:317)    
 at com.github.rholder.retry.AttemptTimeLimiters$NoAttemptTimeLimit.call(AttemptTimeLimiters.java:78)    
 at com.github.rholder.retry.Retryer.call(Retryer.java:160)     ... 41 more 

Caused by: java.rmi.UnmarshalException: error unmarshalling return; nested exception is:  
   java.lang.ClassNotFoundException: java.sql.Timestamp     
at java.rmi/sun.rmi.server.UnicastRef.invoke(UnicastRef.java:194)    
at java.rmi/java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:209)     
at java.rmi/java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:161)     
at com.sun.proxy.$Proxy14.login(Unknown Source)    
 at client.LoginHandler.login(LoginHandler.java:128)     ... 44 more 

Caused by: java.lang.ClassNotFoundException: java.sql.Timestamp     
at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471)     
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)     
at java.rmi/sun.rmi.server.LoaderHandler$Loader.loadClass(LoaderHandler.java:1207)    
 at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)    
 at java.base/java.lang.Class.forName0(Native Method)    
 at java.base/java.lang.Class.forName(Class.java:398)     
at java.rmi/sun.rmi.server.LoaderHandler.loadClassForName(LoaderHandler.java:1221) 

我们的 JNLP 看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<jnlp
spec="1.0+"
codebase="http://192.168..."
href="Intranet.jnlp">
<security>
<all-permissions/>
</security>
<information>
<offline-allowed/>
</information>
<resources>
<j2se version="1.8.0_25+" href="http://java.sun.com/products/autodl/j2se" java-vm-args="-XX:+UseParallelGC -XX:+CMSClassUnloadingEnabled -Xincgc -Xnoclassgc -Xms64m -Xmx1024m"/>
<property name="sun.java2d.transaccel" value="true" />
<property name="sun.java2d.noddraw" value="true" />
<property name="java.util.Arrays.useLegacyMergeSort" value="true" />
<jar href="lib/intranet-client-ei-0.0.1-SNAPSHOT.jar"/>
<!--....-->
</resources>
<application-desc main-class="xdev.Application">
<argument>-application.type=webstart</argument>
<argument>-main=start.Main</argument>
<argument>-mode</argument>
<argument>ei</argument>
</application-desc>
</jnlp>

然后我们添加了以下内容

<j2se  version="1.8.0_25+" href="http://java.sun.com/products/autodl/j2se" java-vm-args="-XX:+UseParallelGC -XX:+CMSClassUnloadingEnabled -Xincgc -Xnoclassgc -Xms64m -Xmx1024m 
--add-modules=ALL-SYSTEM,java.base,java.rmi,java.sql
--add-exports=java.base/sun.security.action=ALL-UNNAMED
--add-exports=java.rmi/sun.rmi.server=ALL-UNNAMED,java.base,java.sql
--add-exports=java.sql/java.sql=ALL-UNNAMED,java.base,java.rmi
"/>

但这不起作用。

当我们从终端(使用-classpath ./lib/*)启动客户端时,一切正常。因此该代码适用于 Java 11,但 OpenWebstart 不在 Classpathmode 下运行它。

有人有想法吗?

4

1 回答 1

2

您能否使用以下定义:

<j2se version="1.8.*" .../>

通过使用*而不是+您不允许使用比 1.8 更新的版本。也许您在使用 Java11 运行您的应用程序时遇到问题。

于 2020-06-19T14:57:44.487 回答