在JLink构建中从外部URL加载图像时握手失败 问题错误代码项目

问题描述

已解决-查看我的答案

问题

我正在尝试使用JavaFX从外部URL加载图像并将其设置为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上托管的是较旧的版本。

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

/build/image/bin/StockManager.bat的JLink生成的映像中运行它的那一刻,您将收到handshake_failure错误。从示例数据中可用的产品来看,唯一可以运行的是“游戏笔记本电脑”。

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

解决方法

解决方案

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

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...