设置: 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中运行它。
有人有想法吗?