标签: java-21

升级到 JDK 21 后出现编译错误 - “NoSuchFieldError: JCImport does not have member field JCTree qualid”

升级到JDK 21后,我的Spring Boot项目出现以下编译错误:

Fatal error compiling: java.lang.NoSuchFieldError:
Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field 'com.sun.tools.javac.tree.JCTree qualid'
Run Code Online (Sandbox Code Playgroud)

compiler-errors upgrade lombok spring-boot java-21

150
推荐指数
2
解决办法
12万
查看次数

Gradle 从哪个版本开始支持 Java 21?

当尝试使用 Java 21 配置项目时,我收到错误:

不支持 Java。您的构建当前配置为使用 Java 21 和 Gradle 8.3。

不幸的是,目前官方文档中没有信息:https ://docs.gradle.org/current/userguide/compatibility.html

执行 Gradle 需要 8 到 20 之间的 Java 版本。尚不支持 Java 21 及更高版本。

Gradle 从哪个版本开始支持 Java 21?

java gradle java-21

21
推荐指数
2
解决办法
2万
查看次数

Java 21内置HTTP客户端固定载体线程

我正在使用 Java Corretto 21.0.0.35.1 build 21+35-LTS和内置 Java HTTP 客户端来检索InputStream. 我正在使用虚拟线程发出并行请求,并且在大多数情况下,它运行良好。然而,有时,我的测试会遇到“固定”事件,如下面的堆栈跟踪所示。

我相信 JDK 已经更新为完全支持虚拟线程,并且根据我的理解,HTTP 客户端根本不应该固定承载线程。但是,似乎在读取并(自动)关闭InputStream.

这是预期的行为吗?或者它仍然是 JDK 中的一个错误吗?

代码:

HttpResponse<InputStream> response = httpClient.send(request, HttpResponse.BodyHandlers.ofInputStream());
try (InputStream responseBody = response.body()) {
  return parser.parse(responseBody); // LINE 52 in the trace below
}
Run Code Online (Sandbox Code Playgroud)

踪迹

* Pinning event captured:
  java.lang.VirtualThread.parkOnCarrierThread(java.lang.VirtualThread.java:687)
  java.lang.VirtualThread.park(java.lang.VirtualThread.java:603)
  java.lang.System$2.parkVirtualThread(java.lang.System$2.java:2639)
  jdk.internal.misc.VirtualThreads.park(jdk.internal.misc.VirtualThreads.java:54)
  java.util.concurrent.locks.LockSupport.park(java.util.concurrent.locks.LockSupport.java:219)
  java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(java.util.concurrent.locks.AbstractQueuedSynchronizer.java:754)
  java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(java.util.concurrent.locks.AbstractQueuedSynchronizer.java:990)
  java.util.concurrent.locks.ReentrantLock$Sync.lock(java.util.concurrent.locks.ReentrantLock$Sync.java:153)
  java.util.concurrent.locks.ReentrantLock.lock(java.util.concurrent.locks.ReentrantLock.java:322)
  sun.nio.ch.SocketChannelImpl.implCloseNonBlockingMode(sun.nio.ch.SocketChannelImpl.java:1091)
  sun.nio.ch.SocketChannelImpl.implCloseSelectableChannel(sun.nio.ch.SocketChannelImpl.java:1124)
  java.nio.channels.spi.AbstractSelectableChannel.implCloseChannel(java.nio.channels.spi.AbstractSelectableChannel.java:258)
  java.nio.channels.spi.AbstractInterruptibleChannel.close(java.nio.channels.spi.AbstractInterruptibleChannel.java:113)
  jdk.internal.net.http.PlainHttpConnection.close(jdk.internal.net.http.PlainHttpConnection.java:427)
  jdk.internal.net.http.PlainHttpConnection.close(jdk.internal.net.http.PlainHttpConnection.java:406)
  jdk.internal.net.http.Http1Response.lambda$readBody$1(jdk.internal.net.http.Http1Response.java:355)
  jdk.internal.net.http.Http1Response$$Lambda+0x00007f4cb5e6c438.749276779.accept(jdk.internal.net.http.Http1Response$$Lambda+0x00007f4cb5e6c438.749276779.java:-1)
  jdk.internal.net.http.ResponseContent$ChunkedBodyParser.onError(jdk.internal.net.http.ResponseContent$ChunkedBodyParser.java:185)
  jdk.internal.net.http.Http1Response$BodyReader.onReadError(jdk.internal.net.http.Http1Response$BodyReader.java:677)
  jdk.internal.net.http.Http1AsyncReceiver.checkForErrors(jdk.internal.net.http.Http1AsyncReceiver.java:302)
  jdk.internal.net.http.Http1AsyncReceiver.flush(jdk.internal.net.http.Http1AsyncReceiver.java:268)
  jdk.internal.net.http.Http1AsyncReceiver$$Lambda+0x00007f4cb5e31228.555093431.run(jdk.internal.net.http.Http1AsyncReceiver$$Lambda+0x00007f4cb5e31228.555093431.java:-1)
  jdk.internal.net.http.common.SequentialScheduler$LockingRestartableTask.run(jdk.internal.net.http.common.SequentialScheduler$LockingRestartableTask.java:182)
  jdk.internal.net.http.common.SequentialScheduler$CompleteRestartableTask.run(jdk.internal.net.http.common.SequentialScheduler$CompleteRestartableTask.java:149)
  jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.java:207)
  jdk.internal.net.http.HttpClientImpl$DelegatingExecutor.execute(jdk.internal.net.http.HttpClientImpl$DelegatingExecutor.java:177)
  jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(jdk.internal.net.http.common.SequentialScheduler.java:282)
  jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(jdk.internal.net.http.common.SequentialScheduler.java:251)
  jdk.internal.net.http.Http1AsyncReceiver.onReadError(jdk.internal.net.http.Http1AsyncReceiver.java:516)
  jdk.internal.net.http.Http1AsyncReceiver.lambda$handlePendingDelegate$3(jdk.internal.net.http.Http1AsyncReceiver.java:380)
  jdk.internal.net.http.Http1AsyncReceiver$$Lambda+0x00007f4cb5e33ca0.84679411.run(jdk.internal.net.http.Http1AsyncReceiver$$Lambda+0x00007f4cb5e33ca0.84679411.java:-1) …
Run Code Online (Sandbox Code Playgroud)

java java-http-client project-loom virtual-threads java-21

19
推荐指数
1
解决办法
2406
查看次数

无法在 Intellij IDEA 中使用最新的 Java 版本 (JDK 21)

我正在使用 macOS,我想在 Intellij IDEA 中尝试 Java 21。我相信我已经完成了更改项目/模块的 Java 版本所需的所有步骤。尽管如此,我仍然无法使用新的 Java 21 功能,例如String Templates。如何在 Intellij 中使用 Java 21?

在此输入图像描述

我变了:

  • 项目 SDK 至 21

  • 模块SDK至21

  • 操作系统 java 版本为 21。java -version在终端输出中键入:

    java 版本“21”2023-09-19 LTS

    Java(TM) SE 运行时环境(内部版本 21+35-LTS-2513)

    Java HotSpot(TM) 64 位服务器 VM(内部版本 21+35-LTS-2513,混合模式,共享)

  • 我还将 Intellij 更新到版本 2023.2

java sdk intellij-idea java-21

10
推荐指数
1
解决办法
1万
查看次数

Java 21 保护模式详尽性

我开始尝试新的Java 21功能模式匹配

public class Main {

  public static void main(String[] args) {

    RecordB recordB = new RecordB(true);

    switch(recordB) {
      case RecordB b when b.bool() -> System.out.println("It's true");
      case RecordB b when !b.bool() -> System.out.println("It's false");
    }

  }

  record RecordB(boolean bool) { }
}
Run Code Online (Sandbox Code Playgroud)

当编译上面的代码时,编译器会产生以下信息:the switch statement does not cover all possible input values

从我的角度来看,这不一定是真的。所以这是我的问题:任何受保护的模式是否总是使编译器的 switch 表达式不详尽,或者我在这里遗漏了一些东西?

java pattern-matching java-21

10
推荐指数
1
解决办法
573
查看次数

Java 21 DateFormat.getDateTimeInstance().format(new Date()) 问题

这是我的代码

import java.util.Date;
import java.text.DateFormat;

class DateTime {
    public static void main(String[] args) {
        String dt = DateFormat.getDateTimeInstance().format(new Date());
        System.out.println(dt);
    }
}
Run Code Online (Sandbox Code Playgroud)

当使用 Java 21 编译和执行时,对“format()”的调用返回一个UTF-16包含无效字节的字符串,用问号表示:

2023 年 10 月 3 日 7:01:17?PM

还有其他人看到这个问题吗?谢谢。

java formatting datetime java-21

9
推荐指数
2
解决办法
939
查看次数

Java 中使用什么 @Nullable(截至 2023/JDK21)?

截至 2023/JDK21,@NullableJava 中使用什么?

许多在线材料甚至没有提到要使用哪个导入。所以现在这些注释的出现顺序已经成为(黑暗的)历史了。

当前用户组

我希望得到一般性的答案并且来自信誉良好的来源(请引用文档)。对于 JDK21,有些文章也可以做到这一点。

例如javax.annotation.Nullable可以是优选的。但它是在什么版本中引入的呢?(我们使用JDK17,也许明年一些项目更新到JDK21)

java nullable java-21

7
推荐指数
2
解决办法
2677
查看次数

IntelliJ IDEA + JDK 21 java.util.concurrent 包问题 - TimeUnit 类不可用

当我尝试使用 java.util.concurrent 中的 TimeUnit 类时遇到问题。Oracle JDK 21.0.1(配置如下)+ IntelliJ IDEA 2023.1.5(社区版)会发生这种情况-当前的最新更新(更新:正如我在运行更新后一开始所想的那样 - 查看解决方案以下)。

我的计算机上的配置(通过控制台中的java -version获取):

java 版本“21.0.1”2023-10-17 LTS

Java(TM) SE 运行时环境(版本 21.0.1+12-LTS-29)

Java HotSpot(TM) 64 位服务器 VM(构建 21.0.1+12-LTS-29,混合模式,共享)

我检查了是否在 IntelliJ 项目结构菜单(包括项目和模块部分)中设置了 JDK 21。

在下面的屏幕截图中,您可以看到为测试目的创建的基本类。一些并发包类可以正常导入,但TimeUnit由于某种原因不能导入类。

问题截图

同时,您可以在屏幕截图中看到,尽管我运行应用程序时出现问题,但该应用程序仍然可以工作。

当我在 IDE 配置中使用 java 17 时,我没有看到这个问题。

您能否帮助理解为什么会出现此问题以及如何解决它?

还有一件事。当我进入“关于 IntelliJ IDEA”菜单时,我看到下一个配置:

运行时版本:17.0.7+10-b829.16 aarch64 VM:JetBrains sro 的 OpenJDK 64 位服务器 VM

我不确定为什么它说版本 17,这可能是问题的原因吗?

java intellij-idea java.util.concurrent java-21

7
推荐指数
1
解决办法
4186
查看次数

在java中记录模式,无需instanceof或switch

Java 21记录模式承诺将解构引入 Java 语言。然而,它似乎与模式匹配紧密耦合,只能用作instanceof比较的一部分或在switch语句/表达式中。

考虑以下记录。

public record Point(int x, int y) {}
Run Code Online (Sandbox Code Playgroud)

instanceof有没有一种方法可以在不使用or 的情况下解构该特定类型的对象switch?以下尝试进行解构point。但如果我们假设空安全,该代码就没有什么意义,因为instanceof既没有也没有必要。switch

Point point = new Point(0, 0);

// destructuring with instanceof
if (point instanceof Point(int x, int y)) {
    System.out.printf("Point at (%d,%d)", x, y);
}

// destructuring with switch
switch (point) {
    case Point(int x, int y) -> System.out.printf("Point at (%d,%d)", x, y);
}
Run Code Online (Sandbox Code Playgroud)

java pattern-matching java-21 record-patterns

6
推荐指数
1
解决办法
910
查看次数

带有 GET 的 apache httpclient5 代理无效

我迁移到 spring boot 3 和 java 21。由于我要进行补丁休息调用,因此我需要依赖项 org.apache.httpcomponents.client5:httpclient5:5.2.2。

但有了这种依赖性,如果将 org.springframework.web.client.RestTemplate 与 RequestEntity.get 一起使用,我会得到“java.lang.IllegalArgumentException:无效代理”。

在相同的设置下,补丁调用工作得很好。

  • 春季3.1.6
  • 爪哇21

有谁知道为什么会发生这种情况?我没有代理。我必须定义默认代理吗?

不幸的是,对于此链接:https://github.com/apache/httpcomponents-client/tree/5.1.x/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientConfiguration.java 我得到 404。:-(

我尝试仅使用 apache 依赖项而不使用 Resttemplate 并得到相同的异常。

HttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(uri);
httpGet.setHeader(HttpHeaders.AUTHORIZATION, token);
httpGet.setHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE);
Run Code Online (Sandbox Code Playgroud)

apache-httpclient-5.x spring-resttemplate java-21 spring-boot-3

6
推荐指数
1
解决办法
451
查看次数