标签: java-17

Java 8 到 Java 17 ThreadLocal 问题

我的代码在 Java 8 中运行良好,但是当我将其迁移到 Java 17 时,它就不起作用了。它涉及 ThreadLocal 和 CompletableFuture.runAsync。

以下是课程:

public class UriParameterHandler {
}

public class DateRangeEntity {
    public String getCurrentDate(){
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
        LocalDateTime now = LocalDateTime.now();
        return dtf.format(now);
    }
}

public class SessionHandler {

    private static ThreadLocal<SessionHandler> instance = new InheritableThreadLocal<>();
    private UriParameterHandler uriParameterHandler;
    private DateRangeEntity dateRangeEntity;

    private SessionHandler() {
        instance.set(this);
    }

    public static void initialize() {
        SessionHandler handler = new SessionHandler();
        handler.uriParameterHandler = new UriParameterHandler();
    }

    public static UriParameterHandler getUriParameterHandler() {
        return instance.get().uriParameterHandler; …
Run Code Online (Sandbox Code Playgroud)

java multithreading thread-local completable-future java-17

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

在 Java 17 中,如何避免使用 --add-opens?

从 Java 17 开始--illegal-access,实际上已经过时了https://openjdk.java.net/jeps/403

此选项的任何使用,无论是与 permit、warn、debug 还是 deny 一起使用,除了发出警告消息外,不会产生任何影响。我们希望在未来的版本中完全删除 --illegal-access 选项。

因此,使用 openjdk17 早期访问版本,我发现jackson https://github.com/FasterXML/jackson-databind/issues/3168存在问题。在我看来,他们提倡--add-opens使用并努力设想一个整体的“修复”。

我想避免添加,--add-opens因为如果不是jackson,则是下一个依赖项。我不想因为依赖关系的变化而跨环境更改 JVM 参数。我如何避免这种情况?

java java-17

5
推荐指数
1
解决办法
111
查看次数

Java 17 记录类上的 UnknownElementException

今天我兴奋地下载了 Java 17 并得到了一个简单的记录类

\n
public record TestCls(Party producer, Party client, Party server) {}\n
Run Code Online (Sandbox Code Playgroud)\n

但是,在执行时mvn compile,它会抛出错误\nFatal error compiling: javax.lang.model.element.UnknownElementException: Unknown element: "com.xxx.TestCls"

\n

我仔细检查了一下java -version,它看起来对我来说是正确的:

\n
openjdk version "17" 2021-09-14\nOpenJDK Runtime Environment (build 17+35-2724)\nOpenJDK 64-Bit Server VM (build 17+35-2724, mixed mode, sharing)\n
Run Code Online (Sandbox Code Playgroud)\n

有人知道吗?提前致谢!

\n
\n

补充:\n我的maven版本是3.5.4.
pom 文件中的 maven 设置:

\n
openjdk version "17" 2021-09-14\nOpenJDK Runtime Environment (build 17+35-2724)\nOpenJDK 64-Bit Server VM (build 17+35-2724, mixed mode, sharing)\n
Run Code Online (Sandbox Code Playgroud)\n

2021.1.2在 …

java maven java-17

5
推荐指数
1
解决办法
2655
查看次数

JDK 17:Switch 语句导致 java.lang.VerifyError:操作数堆栈上的类型错误

刚刚在 Eclipse 2021-09 上尝试了 JDK17,结果失败并显示java.lang.VerifyError,这本身并没有多大帮助。我追踪到一个 switch 语句,该语句获取从一个Map或另一个泛型类型中提取的值。如果我在 switch 语句中使用局部变量,一切都会按预期工作。

测试代码:

import java.util.HashMap;
import java.util.Map;

public class SwitchFail {
  public static void main(String[] args) {
    //doesnt work
    Map<Integer, String> stringMap = new HashMap<>();
    stringMap.put(1, "Test");
    switch(stringMap.get(1)) {
    }

    //works
    String plainString = "Test";
     switch(plainString) {
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这会引发以下错误:

Error: Unable to initialize main class SwitchFail
Caused by: java.lang.VerifyError: Bad type on operand stack
Exception Details:
  Location:
    SwitchFail.main([Ljava/lang/String;)V @33: invokevirtual
  Reason:
    Type 'java/lang/Object' (current frame, stack[0]) is …
Run Code Online (Sandbox Code Playgroud)

java switch-statement eclipse-jdt ecj java-17

5
推荐指数
1
解决办法
1936
查看次数

使用 AspectJ 检测 Java 17

当我尝试使用 Java 17 运行 AspectJ 检测时,总是会收到如下错误:

java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:568)
        at org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptor.initializeForJava11(ClassLoaderWeavingAdaptor.java:1069)
        at org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptor.defineClass(ClassLoaderWeavingAdaptor.java:1096)
        at org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptor.access$300(ClassLoaderWeavingAdaptor.java:66)
        at org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptor$SimpleGeneratedClassHandler.acceptClass(ClassLoaderWeavingAdaptor.java:150)
        at org.aspectj.weaver.tools.WeavingAdaptor$WeavingClassFileProvider$1.acceptResult(WeavingAdaptor.java:917)
        at org.aspectj.weaver.bcel.BcelWeaver.weaveAndNotify(BcelWeaver.java:1431)
        at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1192)
        at org.aspectj.weaver.tools.WeavingAdaptor.getWovenBytes(WeavingAdaptor.java:549)
        at org.aspectj.weaver.tools.WeavingAdaptor.weaveClass(WeavingAdaptor.java:385)
        at org.aspectj.weaver.loadtime.Aj.preProcess(Aj.java:115)
        at org.aspectj.weaver.loadtime.ClassPreProcessorAgentAdapter.transform(ClassPreProcessorAgentAdapter.java:51)
        at java.instrument/java.lang.instrument.ClassFileTransformer.transform(ClassFileTransformer.java:244)
        at java.instrument/sun.instrument.TransformerManager.transform(TransformerManager.java:188)
        at java.instrument/sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:541)
        at java.base/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1012)
        at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
        at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
        at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(Class.java:467)
        at java.base/sun.launcher.LauncherHelper.loadMainClass(LauncherHelper.java:780)
        at java.base/sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:675)
Caused by: java.lang.IllegalAccessException: module java.base does not open …
Run Code Online (Sandbox Code Playgroud)

aspectj java-17 jep-396

5
推荐指数
1
解决办法
6132
查看次数

不允许此关键字访问记录构造函数中的字段

我有以下记录:

public record A(List<String> list) {
    public A {
      this.list = new ArrayList<>(list);
    }
}
Run Code Online (Sandbox Code Playgroud)

但我得到这个编译错误:

无法为最终变量赋值

另一方面,这可以编译:

public record A(List<String> list) {
    public A {
      list = new ArrayList<>(list);
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

java java-record java-17

5
推荐指数
1
解决办法
695
查看次数

如何用Java创建一个新的相机源?

我正在尝试用 java 创建新的相机源或驱动程序。基于 python 有一个类似的问题。我想做的是,我希望在 Windows 中显示一个新的相机源,以便所有应用程序都可以连接到它。输出将是循环显示的许多图像,而不是实时摄像机。我可以用java实现这个吗?如果是的话怎么办?stackoverflow上有很多基于c++的问题。但不是关于 Java 的。我正在尝试用 Java 来实现这一点。我认为为此我需要使用像 directX 这样的东西。

我知道如何创建图像循环。但是如何创建相机源呢?

java camera driver virtual-webcam java-17

5
推荐指数
1
解决办法
818
查看次数

Java 浮点计算行为差异

在用 Java 实现的科学计算管道的背景下,我们使用 Apache Commons math 3.6.1 中的 LeastSquare 优化器,并体验到 Java 8 (jdk8u322-b06)、Java 和 Java 17 之间奇怪的数值差异。

我们注意到迁移到 Java 17(当前使用 17.0.5)后的差异。

我可以在“简单”单元测试中重现 Java 8 和 Java 17 之间的不同行为,而无需涉及完整的计算管道,因此排除了数据加载或多线程部分可能出现的所有问题。

在 JDK 17 中,严格的浮点语义已恢复,但结果与编译或解释的 Java 8 完全不同。在这种情况下,实际上最小二乘优化器不会像在 Java 8 情况下那样收敛。

重要的一点是,所有这些结果都可以完全重现到最后一位数字,并且在每个平台配置上都是完全可预测的。

但这次在完整的管道执行中,我观察到我可以在 Java 8 本身上重现数值差异,具体取决于代码是解释还是编译(在 C2 级别或 C1 级别我尚未调查)

我真的很困惑,想知道这是否是已知/记录的行为,或者这是否是 JDK 8 平台或 JDK 17 中的错误?有人观察到这样的问题吗?

感谢您的任何提示!

编辑

我无法在这里提供简单的代码片段来重现该问题。但我提取了代码的必要部分以在 GitHub 存储库中重现该行为。免责声明:我不是代码的原作者。

重现步骤:

要查看行为差异,只需将 pom.xml 中的 java.version 属性从 1.8 切换到 17。

我可以查明 Apache …

java precision jit java-8 java-17

5
推荐指数
0
解决办法
119
查看次数

SpringBoot 3:LoggerFactory 不是 Logback LoggerContext,但 Logback 位于类路径上。删除 Logback 或竞争的实现

我正在使用 springBootVersion = '3.0.2' 和 Java 17。最近我已升级到 springBoot 3 和 Java 17。我的 build.gradle 文件如下

    implementation group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3'
    implementation (group: 'ch.qos.logback.contrib', name: 'logback-json-classic', version: '0.1.5'){
        exclude group:  'org.json', module: 'json'
    }
    implementation (group: 'ch.qos.logback.contrib', name: 'logback-jackson', version: '0.1.5'){
        exclude group:  'org.json', module: 'json'
    }

    implementation group: 'ch.qos.logback', name: 'logback-core', version: '1.2.9'
Run Code Online (Sandbox Code Playgroud)

在 ./gradlew clean build 上,我收到测试失败并出现以下错误。

Caused by: java.lang.IllegalArgumentException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing …
Run Code Online (Sandbox Code Playgroud)

logback slf4j gradle spring-boot java-17

5
推荐指数
0
解决办法
6613
查看次数

Java 11/17 HttpClient - 如何尝试一个主机名后面的多个 IP?

我如何配置Java自己的“新”(Java 9/11/17)HttpClient来尝试比主机名后面第一个找到的IP地址更多的内容?有(至少)两种情况:

  1. 支持 IPv4 和 IPv6 的服务器:
> host localhost
localhost has address 127.0.0.1
localhost has IPv6 address ::1
Run Code Online (Sandbox Code Playgroud)
  1. 一个“逻辑”主机名,其中服务由多个冗余服务器提供:
> host frontend.example.com
frontend.example.com has address 245.3.4.5
frontend.example.com has address 246.4.5.6
frontend.example.com has IPv6 address 4f00:5678::19
frontend.example.com has IPv6 address 4f00:7890::20
Run Code Online (Sandbox Code Playgroud)

我的观察是,HttpClient 仅尝试第一个传递的地址,如果在该地址下无法访问服务,则失败。有没有办法告诉它尝试所有分配的 IP 地址 -InetAddress.getAllByName()传递它们 - 直到可以在其中一个地址找到 HTTP 服务器,并且如果没有一个成功,则仅以“无连接”失败。

在第一种情况下,如果某个服务绑定到 IPv4 或 IPv6 地址,则这是相关的。在第二种情况下,其中一台服务器或服务可能因维护或技术问题而停机,而另一台服务器或服务则服务所有传入请求。因此,在我看来,这应该是 HTTP 客户端实现的一个相当常见的要求。尽管如此,我还不明白如何实现这种行为。

java inetaddress java-http-client java-11 java-17

5
推荐指数
0
解决办法
379
查看次数