在 JLink 构建上从外部 url 加载图像时握手失败

Pic*_*ral 0 java javafx gradle jlink

已解决 - 请参阅我的回答

问题

我正在尝试从外部 URL 加载图像并将其设置为ImageView使用 JavaFX。在 IDE 中运行时它总是有效,但当我使用 JLink 构建项目时,只有来自几个 URL 的图像有效。

错误

javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
        at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:131)
        at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117)
        at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:313)
        at java.base/sun.security.ssl.Alert$AlertConsumer.consume(Alert.java:293)
        at java.base/sun.security.ssl.TransportContext.dispatch(TransportContext.java:186)
        at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:164)
        at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1144)
        at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1055)
        at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:395)
        at java.base/sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:567)
        at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1587)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1515)
        at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:250)
Run Code Online (Sandbox Code Playgroud)

代码

最初,我认为问题是我没有设置 a User-Agent,所以我将代码修改为以下内容:

javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
        at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:131)
        at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117)
        at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:313)
        at java.base/sun.security.ssl.Alert$AlertConsumer.consume(Alert.java:293)
        at java.base/sun.security.ssl.TransportContext.dispatch(TransportContext.java:186)
        at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:164)
        at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1144)
        at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1055)
        at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:395)
        at java.base/sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:567)
        at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1587)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1515)
        at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:250)
Run Code Online (Sandbox Code Playgroud)

在一些网站中,例如https://imgur.comthis.image = new Image(imageURL, true); ,即使使用较旧的代码,它也可以工作。但在我尝试过的大多数网站上,我都收到了相同的错误:handshake_failure。

即使更改代码后,错误仍然存​​在。我尝试搜索,但只找到与数据库相关的答案。

项目

您可以测试自己从其存储库克隆该项目。您需要将此文件loadImage(Project.java:99)上的函数更新为上面的示例,因为 GitHub 上托管的函数是旧版本。

如果您使用 IDE 在 IDE 上运行它gradlew run,它将按预期工作。要检查图像是否正在加载,请转到Projects > Use Sample Data菜单栏上的 。显示示例数据后,双击任何产品,图像应显示在右侧。所有样品产品均有图片;如果它不起作用,您将看到一个标签“该产品没有图像”。

当您从 JLink 生成的映像运行它时/build/image/bin/StockManager.bat,您将收到握手失败错误。从样本数据中提供的产品来看,唯一有效的产品是“游戏笔记本电脑”。

截至目前,我使用的“解决方法”是将所有图像托管在https://imgur.com中,因为当图像托管在那里时不会发生此错误。

Pic*_*ral 5

解决方案

事实证明我需要包含requires jdk.crypto.ec;在我的module-info.java. 添加后,它在 IDE 和 JLink 构建中都正常运行。

这个问题帮助我找到了这个解决方案