尝试在 Windows 上的 FTPS 中连接时 Talend 作业失败“模块 java.base 不会“打开 sun.security.ssl”到未命名的模块”

问题描述

我有一个 Talend 7.3 作业,它在本地创建一些 .csv 文件,然后将它们发送到 990 端口上的 FTPS 服务器。在 IDE 中一切正常,但是当我导出作业(右键单击 -> 构建作业)时,.bat 文件给了我这个异常:

java.lang.reflect.InaccessibleObjectException: Unable to make field private final sun.security.util.Cache sun.security.ssl.SSLSessionContextImpl.sessionHostPortCache accessible: module java.base does not "opens sun.security.ssl" to unnamed module
        at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:357)
        at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
        at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:177)
        at java.base/java.lang.reflect.Field.setAccessible(Field.java:171)
        at org.talend.ftp.SSLSessionReuseFTPSClient._prepareDataSocket_(SSLSessionReuseFTPSClient.java:29)
        at org.apache.commons.net.ftp.FTPSClient._openDataConnection_(FTPSClient.java:628)
        at org.apache.commons.net.ftp.FTPClient._openDataConnection_(FTPClient.java:785)
        at org.apache.commons.net.ftp.FTPClient.listNames(FTPClient.java:2905)
        at org.apache.commons.net.ftp.FTPClient.listNames(FTPClient.java:2956)
        at --------------.--------------_0_1.--------------.tFTPPut_1Process(--------------.java:14760)
        at --------------.--------------_0_1.--------------.runJobInTOS(--------------.java:15224)
        at --------------.--------------_0_1.--------------.main(--------------.java:14993)
Exception in component tFTPPut_1 (--------------)
javax.net.ssl.SSLProtocolException: Received close_notify during handshake
        at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:129)
        at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117)
        at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:356)
        at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:312)
        at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:303)
        at java.base/sun.security.ssl.Alert$AlertConsumer.consume(Alert.java:250)
        at java.base/sun.security.ssl.TransportContext.dispatch(TransportContext.java:202)
        at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:171)
        at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1501)
        at java.base/sun.security.ssl.SSLSocketImpl.readApplicationRecord(SSLSocketImpl.java:1466)
        at java.base/sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:1048)
        at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:297)
        at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
        at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
        at java.base/java.io.InputStreamReader.read(InputStreamReader.java:178)
        at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
        at java.base/java.io.BufferedReader.readLine(BufferedReader.java:329)
        at java.base/java.io.BufferedReader.readLine(BufferedReader.java:396)
        at org.apache.commons.net.ftp.FTPClient.listNames(FTPClient.java:2916)
        at org.apache.commons.net.ftp.FTPClient.listNames(FTPClient.java:2956)
        at --------------.--------------_0_1.--------------.tFTPPut_1Process(--------------.java:14760)
        at --------------.--------------_0_1.--------------.runJobInTOS(--------------.java:15224)
        at --------------.--------------_0_1.--------------.main(--------------.java:14993)

我认为问题出在 Windows 中,因为我无法使用 ftp open <host> 从终端打开连接。

解决方法

您正在使用的库/工具似乎使用此 hack 来允许连接到需要 TLS 会话重用的 FTPS 服务器:
How to connect to FTPS server with data connection using same TLS session?

黑客需要反射访问。您的运行时似乎不允许什么。我不是 Java 专家,但这个问题似乎涵盖了这个问题:
How to solve InaccessibleObjectException ("Unable to make {member} accessible: module {A} does not 'opens {package}' to {B}") on Java 9?

(也许有更多 Java 经验的人可以根据这些信息进行构建)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...