Apache HttpClient 在 macOS 上使用 Java 11 失败

2023-12-05

我正在尝试将我的代码从 Java 8 迁移到 Java 11,这段代码...

 private static String  readMultiHttpsUrlResultAsString(List<String> mbRecordingIds, String level) throws Exception
{
    String result = "";
    class NaiveTrustStrategy implements TrustStrategy
    {
        @Override
        public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException
        {
            return true;
        }
    };

    SSLContext sslcontext = org.apache.http.ssl.SSLContexts.custom()
            .loadTrustMaterial(new NaiveTrustStrategy())
            .build();

    CloseableHttpClient httpclient = HttpClients.custom()
            .setSSLSocketFactory(new SSLConnectionSocketFactory(sslcontext))
            .build();

    StringBuilder sb = new StringBuilder("?recording_ids=");
    for(String next:mbRecordingIds)
    {
        sb.append(next + ";");
    }
    sb.setLength(sb.length() - 1);
    try
    {
        String url = "https://acousticbrainz.org/api/v1"+level+sb;
        HttpGet httpget = new HttpGet(url);

        try (CloseableHttpResponse response = httpclient.execute(httpget);)
        {
            int statusCode = response.getStatusLine().getStatusCode();
            if(statusCode!=HttpURLConnection.HTTP_OK)
            {
                return "";
            }
            HttpEntity entity = response.getEntity();
            result = EntityUtils.toString(entity);
            EntityUtils.consume(entity);
        }
    }
    finally
    {
        httpclient.close();
    }
    return result;
}

}

在 MacOS 上使用 (AdoptOpenJdk) Java 11.0.6 时失败,

SSLContext sslcontext = org.apache.http.ssl.SSLContexts.custom()
            .loadTrustMaterial(new NaiveTrustStrategy())
            .build();

它在 Windows 上运行没有问题(也使用 AdoptOpenJdk Java 11.0.6)。一个区别是 Windows 版本使用通过 jlink 从 jdk 构建的精简版 jre,而 MacOS 版本使用 AdoptOpenJDk jre 构建。 MacOS 版本是使用 InfiniteKinds 分支创建的AppBundler

这是堆栈跟踪:

java.lang.NoClassDefFoundError: Could not initialize class sun.security.ssl.SSLContextImpl$TLSContext
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:315)
    at java.base/java.security.Provider$Service.getImplClass(Provider.java:1848)
    at java.base/java.security.Provider$Service.newInstance(Provider.java:1824)
    at java.base/sun.security.jca.GetInstance.getInstance(GetInstance.java:236)
    at java.base/sun.security.jca.GetInstance.getInstance(GetInstance.java:164)
    at java.base/javax.net.ssl.SSLContext.getInstance(SSLContext.java:168)
    at org.apache.http.ssl.SSLContextBuilder.build(SSLContextBuilder.java:269)
    at com.jthink.songkong.analyse.acousticbrainz.AcousticBrainz.readMultiHttpsUrlResultAsString(AcousticBrainz.java:409)
    at com.jthink.songkong.analyse.acousticbrainz.AcousticBrainz.readLowLevelData(AcousticBrainz.java:373)

我正在使用 Apache Httpclient 4.5.3 并使用此库,因为我正在从需要使用 ssl 的 Web 服务获取数据。

Update我从下面的答案中将示例测试添加到我的源代码中,并修改了我的构建,使其成为应用程序运行时的启动类,并且它给了我这个堆栈跟踪(当从命令行运行bundle时)open使用由Infinitykind appbundler嵌入到bundle中的java运行时)

Exception in thread "main" java.lang.ExceptionInInitializerError
    at java.base/javax.crypto.Cipher.getInstance(Unknown Source)
    at java.base/sun.security.ssl.JsseJce.getCipher(Unknown Source)
    at java.base/sun.security.ssl.SSLCipher.isTransformationAvailable(Unknown Source)
    at java.base/sun.security.ssl.SSLCipher.<init>(Unknown Source)
    at java.base/sun.security.ssl.SSLCipher.<clinit>(Unknown Source)
    at java.base/sun.security.ssl.CipherSuite.<clinit>(Unknown Source)
    at java.base/sun.security.ssl.SSLContextImpl.getApplicableSupportedCipherSuites(Unknown Source)
    at java.base/sun.security.ssl.SSLContextImpl$AbstractTLSContext.<clinit>(Unknown Source)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Unknown Source)
    at java.base/java.security.Provider$Service.getImplClass(Unknown Source)
    at java.base/java.security.Provider$Service.newInstance(Unknown Source)
    at java.base/sun.security.jca.GetInstance.getInstance(Unknown Source)
    at java.base/sun.security.jca.GetInstance.getInstance(Unknown Source)
    at java.base/javax.net.ssl.SSLContext.getInstance(Unknown Source)
    at org.apache.http.ssl.SSLContextBuilder.build(SSLContextBuilder.java:389)
    at Example.main(Example.java:23)
Caused by: java.lang.SecurityException: Can not initialize cryptographic mechanism
    at java.base/javax.crypto.JceSecurity.<clinit>(Unknown Source)
    ... 17 more
Caused by: java.lang.SecurityException: Can't read cryptographic policy directory: unlimited
    at java.base/javax.crypto.JceSecurity.setupJurisdictionPolicies(Unknown Source)
    at java.base/javax.crypto.JceSecurity$1.run(Unknown Source)
    at java.base/javax.crypto.JceSecurity$1.run(Unknown Source)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    ... 18 more

这与我以前的情况有所不同,但也许这是根本原因或者这是误导?

而如果我只是跑java -jar songkong6.9.jar它运行示例并打印出来Loaded没有错误,如果我指定 /Library/Java 的完整路径,它也适用于所有情况(Java 11/Java 14/JDk 和 JRE)

Update根据下面的答案,我已经取得了一些进展。

MacOS 上安装的 JRE 包含conf文件夹,当使用 InfiniteKinds appbundler 将 JRE 添加到我的捆绑包 (SongKong) 时,它没有 conf 文件夹。它确实有一个 lib/security 文件夹,其中包含default.policy但这似乎还不够。

pauls-Mac-mini:Home paul$ ls -lR lib/security
total 704
-rw-r--r--  1 paul  admin    1253 22 Apr 14:56 blacklisted.certs
-rw-r--r--  1 paul  admin  103147 22 Apr 14:56 cacerts
-rw-r--r--  1 paul  admin    8979 22 Apr 16:01 default.policy
-rw-r--r--  1 paul  admin  233897 22 Apr 14:56 public_suffix_list.dat

安装构建的捆绑包后,如果我手动将 conf 文件夹从已安装的 JRE 复制到 java 插件的主文件夹

e.g

/Applications/SongKong.app/Contents/PlugIns/adoptopenjdk-11.jre/Contents/Home

位置,然后示例代码和我的原始代码在从捆绑包运行时都不会出现错误。

此外,它似乎正在寻找的是无限的文件夹及其内容(这两个文件实际上是相同的),所以如果我删除一些文件,那么我就剩下

pauls-Mac-mini:Home paul$ pwd
/Applications/SongKong.app/Contents/PlugIns/adoptopenjdk-11.jre/Contents/Home
pauls-Mac-mini:Home paul$ ls -lR conf
total 0
drwxr-xr-x  3 paul  admin  96 22 Apr 15:14 security

conf/security:
total 0
drwxr-xr-x  3 paul  admin  96 22 Apr 15:22 policy

conf/security/policy:
total 0
drwxr-xr-x  4 paul  admin  128 22 Apr 15:28 unlimited

conf/security/policy/unlimited:
total 16
-rw-r--r--  1 paul  admin  146 22 Apr 15:06 default_US_export.policy
-rw-r--r--  1 paul  admin  193 22 Apr 15:06 default_local.policy

然后它继续工作。

问题(除了为什么它不能开箱即用之外)是我假设我无法将文件复制到强化运行时应用程序的此位置,因此我需要将这些策略文件存储在其他位置,以便它们可以作为 appbundler 构建的一部分进行安装。所以作为测试我已经重命名conf folder conf.old文件夹并将以下参数添加到捆绑包中

<string>-Djava.security.policy=/Applications/SongKong.app/Contents/PlugIns/adoptopenjdk-11.jre/Contents/Home/conf.old/security/policy/unlimited/default_local.policy</string>

或替换而不是附加策略文件

<string>-Djava.security.policy==/Applications/SongKong.app/Contents/PlugIns/adoptopenjdk-11.jre/Contents/Home/conf.old/security/policy/unlimited/default_local.policy</string>

但这不起作用,我尝试了各种值但没有任何作用。唯一有效的方法是将其保留在 conf 子文件夹中,然后我是否传递此参数并不重要。 (我也尝试添加-Dsecurity.manager作为另一种选择,但这只会导致有关日志记录权限的新错误。)


最终在 Anish 的帮助下解决了问题是缺少策略文件,而这只是使用构建的捆绑包的问题应用程序绑定器.

jdk代码似乎确实期望confJRE 中的文件夹中,OpenJDK 中也有一个,但没有一次被 AppBundler 捆绑到我的应用程序中。因此,我下载了最新的 AppBundler src 代码并重新构建了它,重新构建了我的 appbundle 并且它已修复,conf 文件夹现在已包含在内,并且应用程序运行时没有错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apache HttpClient 在 macOS 上使用 Java 11 失败 的相关文章

随机推荐

  • 查找与备份策略关联的 Azure 备份/保留

    我可以通过以下方式获取备份策略名称 如何通过 Powershell 查找 Azure VM 应用的备份保护策略名称但希望找到与备份策略相关的实际配置 如以下数据 备份频率 每日 00 00 保留范围 保留每日备份点 保留每天 00 00 进
  • 将 swift 对象转换为 JSON 字符串

    我有这样的课程 class MyDate var year String var month String var day String init year String month String day String self year
  • 使用 Ruby 和 Mechanize 填写远程登录表单之谜

    我正在尝试实现一个 Ruby 脚本 该脚本将接受用户名和密码 然后继续在另一个网站的登录表单上填写帐户详细信息 然后返回然后按照链接检索帐户历史记录 为此 我使用了机械化宝石 我一直在关注这些例子here但我似乎仍然无法让它发挥作用 我已经
  • 为什么我无法访问该文件夹? [关闭]

    Closed 这个问题是无关 目前不接受答案 不久前我买了一个 1TB USB 外置驱动器 我在 Ubuntu 中将其格式化为 ext4 并从几台机器上将一堆文件 文件夹复制到其中 全部分别复制到 home machinename what
  • 在 C# 中按 X 或 Close() 时 WinForms 窗体不会关闭

    我在使用 WinForm 时遇到了一些奇怪的问题 它似乎由于某些奇怪的原因而拒绝关闭 我有非常简单的 gui 有时按 X 不会做出反应 或者当我在按钮上使用事件时 它甚至会到达Close 并且什么也不做 private void butto
  • 计算天际线面积时如何减少/优化内存使用?

    我正在尝试计算天际线的面积 具有相同基线的重叠矩形 building count int input items dictionary location on x axis is the key height is the value co
  • 错误! C:\file\example.db 不是 UTF-8 编码的 ipython 笔记本

    请帮忙 我在 ipython 笔记本中使用 sqlite3 来创建 SQL 数据库 我认为我已经成功创建了数据库 但是当我查看它时 我收到编码 UTF8 错误 这是我的代码 import sqlite3 conn sqlite3 conne
  • 在 Bigquery 中将 Unicode 解码为本地语言

    我们在 Bigquery 中收到调查 Web hook 数据 本地语言的注释被捕获为 unicode 并且我们在该注释中确实有特殊字符 Example 调查评论 别老是晚点 现场补行李费太贵 Bigquery 数据中的评论 u522b u8
  • jquery源在html文件中的位置重要与否

    这是单击按钮弹出警报的示例 If the above part is put in head part it works If the above part is put like below it does not work 这让我抓狂
  • Eclipse:选择自动复制到剪贴板

    我喜欢 Emacs 的一个功能 它可以自动将所选内容复制到剪贴板 是否可以在 Eclipse 上做同样的事情 环境 Windows XP Helios 要将字符串从 Eclipse 复制到剪贴板 您可以使用 void copyToClipb
  • pandas 将 group by 和行合并到列

    我正在尝试转换这个数据集 A B C 1 x1 a 1 x1 a 1 x1 b 2 x2 b 2 x2 a into A B C1 C2 C3 1 x1 a a b 2 x2 b a null df pd DataFrame A 1 1 1
  • 如何将R图图像保存到数据库?

    我想将绘图图像直接保存到数据库中 R 中最好的方法是 将绘图图像 png 写入文件系统 读取写入的文件 通过查询 RODBC 将文件发送到数据库 理想情况下 我想通过简单地将 png 图像写入二进制连接来组合上面的步骤 1 和 2 R支持这
  • 如何获取前兄弟姐妹的姓名

    我需要获取前一个兄弟姐妹的名字 为了简单起见 我有一些示例代码 p paragraph p
  • 嵌入式 segue 中未调用prepareForSegue

    我有一个表视图控制器嵌入在视图控制器的容器中 在视图和表视图控制器的prepareForSegue方法中 我放置了NSLog 控制器的名称 我看到视图控制器的日志 但没有看到表视图控制器的日志 难道我不应该看到表视图的prepareForS
  • 如何释放 Windows Phone 8 应用程序中数据模板中图像占用的内存?

    我有一个长列表选择器 我有一个数据模板 用于定义要添加到列表中的项目类型 数据模板有一个图像控件 其源与路径动态绑定 因此列表中的每个项目都有一个关联的图像控件 我面临的问题是这些图像控件永远不会释放它们占用的内存 导致内存不足异常 在正常
  • Django 按距离排序

    我有以下模型 class Vacancy models Model lat models FloatField Latitude blank True lng models FloatField Longitude blank True 我
  • Zend Framework 2 - 通过 URL 的多个模块

    我目前正在使用 Git 中的 ZendFramework Skeleton 应用程序 并尝试利用它的模块部分来拥有多个模块 可以通过 URL 进行更改 如下所示 http localhost application index index
  • 在 iOS Swift 中下载 mp3 格式的 YouTube 视频

    有什么方法可以获取 youtube 视频的 mp3 链接吗 我尝试了多个在线 youtube 到 mp3 转换器网站 但它只是将文件下载到系统中 并且不提供任何 mp3 链接 Or 有什么方法可以从链接下载文件 假设有一些像 www som
  • C#:将 int 数组传递给 c++ dll

    我有一个 C dll 用于卡片打印 身份证 我的实现是使用 C Net 完成的 我使用以下代码来调用 c dll DllImport J230i dll CallingConvention CallingConvention Cdecl S
  • Apache HttpClient 在 macOS 上使用 Java 11 失败

    我正在尝试将我的代码从 Java 8 迁移到 Java 11 这段代码 private static String readMultiHttpsUrlResultAsString List