问题标签 [java-16]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
158 浏览

java - 如何重复 HTTP GET 请求

我正在构建一个简单的应用程序,用于检查服务器中某个文件的重复更改。我正在使用HttpURLConnection这样的实例:

我想使用这个连接来接收响应,但是没有用于重复请求的内置方法。我担心如果我在循环中使用代码块,它每次都会创建新的连接。

有一个简单的解决方案吗?

0 投票
1 回答
624 浏览

java - 在 Java 记录中强制执行不可变集合?

Java 记录用于实现浅不可变的数据载体类型。如果构造函数接受可变类型,那么我们应该实现显式防御性复制以强制不变性。例如

这有点烦人 - 我们必须

  1. 实现一个老式的 POJO 构造函数(复制字段)而不是使用规范的构造函数和
  2. 显式初始化每个字段只是为了处理可变字段的防御性副本。

理想情况下,我们想要表达的内容如下:

或者

这里我们使用一个虚构的ImmutableSet类型和Set::isMutable方法,无论哪种情况,记录都是使用规范构造函数创建的——nice。不幸的是它不存在!

据我所知,内置集合类型(Java 10 中引入)是隐藏的,即无法确定集合是否不可变(除非尝试修改它)。

我们可以使用 Guava,但是当 99% 的功能已经在核心库中时,这似乎有点过头了。或者,有 Maven 插件可以测试被注释为不可变的类,但这同样是一种创可贴,而不是一种解决方案。

是否有任何纯 Java 机制来强制执行不可变集合?

0 投票
1 回答
1550 浏览

java - 16-slim、16-jdk-slim、16-ea-slim docker镜像有什么区别

以下 Docker 镜像有什么区别?

  • openjdk:16-slim
  • openjdk:16-jdk-slim
  • openjdk:16-ea-slim

哪个体积更小,可以在 Spring Boot 项目中使用?

0 投票
1 回答
93 浏览

java - RecordComponent::getDeclaringRecord 的目的是什么

RecordComponent有方法getDeclaringRecord。我似乎无法理解它的目的是什么,尤其是因为它是public.

获得 a 的唯一方法RecordComponent是通过调用Record::getRecordComponents,如果我这样调用它,我已经知道声明它的记录RecordComponent?我似乎无法理解它的实际目的。

我也无法连接为什么返回类型不是Class<? extends Record>...

0 投票
1 回答
164 浏览

java - 在 Windows 10 PC 中启动 cassandra 时出错

我已经下载了 Cassandra 软件并安装了依赖项,即 Python 和 Java。然后在 cmd 我写了以下命令。

它给出了以下输出

我的java版本是:

Cassandra 3.11.10 是否支持 Java-16?

0 投票
1 回答
696 浏览

maven - JavaFX16:不支持的 JavaFX 配置:类是从“未命名模块 @...”加载的

我在 IntelliJ 上有一个 Maven 多模块项目,它生成 3 个 jar,其中 2 个是可执行文件,另一个用于公共资源。

其中一个可执行模块有一个主类,询问用户是否想使用 CLI 或 GUI 启动程序。

从 IntelliJ 运行这个 main 没有问题,而是当我使用 Maven 制作 jar 时(使用 maven shade):

然后使用 GUI 选项启动 jar,出现以下警告:

GUI 然后启动没有问题。

我怎样才能摆脱这个警告? 我项目的 JDK 是 openJDK 16(我已经添加module-info.java以使用 javafx)、openJFX 16、maven shade 插件 3.2.4、maven 编译器插件 3.8.1。

如果需要添加更多信息,我会添加它们。

0 投票
1 回答
5262 浏览

java - 从 OpenJDK16 读取使用 keytool 创建的 PKCS12 密钥库时,Java 8 中的 IOException

TL;博士

keytool从 OpenJDK16 创建无法从 Java 8、9、10 和 11 读取的 PKCS12 密钥库文件。这是一个错误吗?如何创建适用于 Java 8 的 PKCS12 密钥库?

语境

我构建了一个 Maven 项目,该项目生成一个可执行的 JAR 文件,该文件必须在从版本 8 到版本 16 的任何 JRE 上运行。该 JAR 文件生成一个 HTTPS 服务器(使用com.sun.net.httpserver.HttpsServer)。

在构建期间,我使用keytool生成密钥对并将其存储在捆绑在 JAR 中的 PKCS12 密钥库中(实际上,我使用的是keytool-maven-plugin):

Java 代码使用这个自动生成的密钥库来启动 HTTPS 服务器:

问题

当 JAR 使用 OpenJDK 16 JDK 构建(并且keytool使用 OpenJDK 16)然后在 Java 8 JRE 中执行时,我们会在以下位置收到此异常keyStore.load()

在 OpenJDK 11.0.7+10 中执行相同的 JAR 时,我们会得到以下异常:

但是,当使用 OpenJDK 14、15 或 16 执行相同的 JAR 时,没有例外,一切正常。

下表总结了 的版本keytool,以及使用每个版本创建的 PKCS12 密钥库是否keytool可以在各种 JRE 版本中加载:

JRE 8 JRE 11 JRE 14 JRE 16
钥匙工具 8 ✅</td> ✅</td> ✅</td> ✅</td>
钥匙工具 11 ✅</td> ✅</td> ✅</td> ✅</td>
钥匙工具 14 ✅</td> ✅</td> ✅</td> ✅</td>
钥匙工具 15 ✅</td> ✅</td> ✅</td> ✅</td>
钥匙工具 16 ⛔</td> ⛔</td> ✅</td> ✅</td>

问题

这是KeyStore 类keytoolKeyStore类中的错误吗?

如何使用 OpenJDK16 创建一个 PKCS12 密钥库,该密钥库在加载 JRE 8 时可以工作?

什么是HmacPBESHA256?我没有在我的keytool命令行中指定这个算法。

0 投票
1 回答
351 浏览

java - 作为windows服务运行的嵌入式tomcat需要很长时间才能停止服务

我有一个使用嵌入式 tomcat(9.0.44) 的可执行 jar 文件。它使用 apache实用程序作为 Windows 服务(名为“ MyApp 测试服务”)运行。prunsrv但是当我尝试停止服务时,需要一些时间(超过一分钟)才能停止服务。但是启动服务非常快。我可以确认stop()tomcat的方法很快完成。我怀疑其中还有其他东西在prunsrv等待并需要时间来停止服务。请帮助了解发生了什么以及如何解决此问题(执行后立即停止服务tomcat.stop()

  • 注册服务 -C:\ServiceTest\prunsrv.exe" "//RS//MyApp Test Service"
  • 启动类和方法:com.samples.myapp.TestEmbeddedServer::main
  • 关机类和方法:com.samples.myapp.TestEmbeddedServer::stop

prunmgr UI 中的关闭和启动标签

TomcatEmbeddedServer .java

TestEmbeddedServer.java

以下是我获得的 prunserv 启动/关闭日志

在关闭信号之后的这些日志中,恰好有 1 分钟的延迟来破坏 JVM。我认为这就是它挂的地方。

在 prunmngr UI 中,进度指示器被关闭,但开始按钮未启用。请参阅下面的屏幕截图。

停止服务后的 GUI .. 进度条消失但按钮未启用

编辑:通过改变 Tomcat 版本的结果

使用的 Tomcat 版本 停止所用时间
Apache Tomcat/8.5.66 ~9 秒
Apache Tomcat/9.0.1 ~ 9 秒
Apache Tomcat/9.0.10 ~ 9 秒
Apache Tomcat/9.0.13 ~ 9 秒
Apache Tomcat/9.0.14 ~ 1 分 3 秒
Apache Tomcat/9.0.16 ~ 1 分 3 秒
Apache Tomcat/9.0.20 ~ 1 分 3 秒
Apache Tomcat/9.0.30 ~ 1 分 3 秒
Apache Tomcat/9.0.40 ~ 1 分 3 秒
Apache Tomcat/9.0.44 ~ 1 分 3 秒
Apache Tomcat/9.0.46 ~ 1 分 3 秒
Apache Tomcat/10.0.6 ~ 1 分 3 秒
0 投票
1 回答
112 浏览

java - ParallelStream 收集到设置?

我有一个程序可以从使用中受益匪浅(大型数据集,其中涉及一些映射和过滤方案,但不依赖于外部变量/同步)parallelStream(),但必须作为一个集合进行收集。

我对并行流有些陌生(这是我第一次使用它们),并尝试使用下面的代码却发现这导致了非并发后端的并发修改和幕后的死锁条件。

此映射尝试使用 Linux 本机命令获取未挂载磁盘的文件大小sudo blockdev --getsize64 unmounted_device_here(我不知道 Java 是否可以在 Linux 上获取未挂载磁盘的完整大小,所以我只是使用本机方法,因为这只会是无论如何都在Linux系统上发布)

映射方法(死锁):

IOUtils 来自 Apache 实用程序类:

runCommand(执行本机调用):

DrivePacket 类:

由于操作受益于并发性,有没有办法使用parallelStream?还是我必须使用其他技术?

它总是挂在执行这行代码的停止处,并在我使用调试器时永远ForkJoinTask.java等待externalAwaitDone();

不幸的是,我找不到Set类似的东西。toConcurrentMap()

我怎样才能避免这种死锁,同时仍然获得计算的并行性并让最终结果成为一个集合?

系统:JDK 16

编辑 0:更新了可再现性代码

鉴于映射代码调用不共享数据的子例程,我不确定为什么这会导致死锁情况。

0 投票
2 回答
264 浏览

java - 随着时间的推移,JDK 16 记录、构造函数和添加?

我对使用新的 JDK 16 记录很感兴趣,但是当我尝试创建一个具有附加参数的新记录时,出现错误:

记录是否仅针对没有任何可变性的对象,或者它们可以随着时间的推移而扩展?

我对这种类型的类有一个新要求(特别是意外添加了 NFS 共享上的驱动器类型“远程”驱动器。

我发现自己试图想出一些方案,比如使用driveSize来表示“远程”状态,但实际上这就是开发枚举的原因。

在这种情况下我该怎么办?我可以向构造函数添加选项并将它们存储在私有最终字段中吗?或者我应该创建一个DrivePacket->的子类RemoteDrivePacket,还是应该为它创建一个标记接口RemoteDrivePacket

开发人员打算使用的典型方式是什么?