【问题标题】:Handshake failure when loading images from external url on JLink build [duplicate]在 JLink 构建中从外部 url 加载图像时握手失败 [重复]
【发布时间】:2021-01-15 14:30:48
【问题描述】:

已解决 - 查看我的答案

问题

我正在尝试从外部 URL 加载图像并使用 JavaFX 将它们设置为 ImageView。在 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)

代码

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

public boolean loadImage() {

        if (!imageURL.isBlank() && image == null) {

            try {

                URLConnection conn = new URL(imageURL).openConnection();
                conn.setRequestProperty("User-Agent", "Wget/1.13.4 (linux-gnu)");
                InputStream stream = conn.getInputStream();
                this.image = new Image(stream);

                //original code
                //this.image = new Image(imageURL, true); 

            } catch (Exception e) {
                e.printStackTrace();
            }

        }

        return image != null && image.isError();
    }

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

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

项目

您可以测试自己克隆项目from its repository。您需要将 this file (Project.java:99) 上的 loadImage 函数更新为上述示例,因为托管在 GitHub 上的是旧版本。

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

当您从/build/image/bin/StockManager.bat 的 JLink 生成的图像运行它时,您将收到 handshake_failure 错误。从样本数据中可用的产品中,唯一可以使用的是“游戏笔记本电脑”。

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

【问题讨论】:

标签: java gradle javafx jlink


【解决方案1】:

解决方案

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

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

【讨论】:

    猜你喜欢
    • 2017-12-30
    • 2015-01-13
    • 1970-01-01
    • 2014-05-07
    • 2020-03-24
    • 2016-07-17
    • 2014-05-06
    • 1970-01-01
    • 2016-03-24
    相关资源
    最近更新 更多