如何在RMI和Java 11 + Openwebstart中使用java.sql.Timestamp

设置: 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.sql
--add-exports=java.sql/java.sql=ALL-UNNAMED,java.rmi
"/>

但这不起作用。

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

有人有想法吗?

wxj343302733 回答:如何在RMI和Java 11 + Openwebstart中使用java.sql.Timestamp

可以使用以下定义吗?

$(data).find('div.container-wrap')

通过使用<j2se version="1.8.*" .../> 而不是*,您不允许使用高于1.8的版本。也许通过使用Java11运行应用程序会遇到问题。

本文链接:https://www.f2er.com/3015495.html

大家都在问