我的代码在 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 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 17 并得到了一个简单的记录类
\npublic record TestCls(Party producer, Party client, Party server) {}\nRun Code Online (Sandbox Code Playgroud)\n但是,在执行时mvn compile,它会抛出错误\nFatal error compiling: javax.lang.model.element.UnknownElementException: Unknown element: "com.xxx.TestCls"
我仔细检查了一下java -version,它看起来对我来说是正确的:
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)\nRun Code Online (Sandbox Code Playgroud)\n有人知道吗?提前致谢!
\n补充:\n我的maven版本是3.5.4.
pom 文件中的 maven 设置:
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)\nRun Code Online (Sandbox Code Playgroud)\n我2021.1.2在 …
刚刚在 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 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) 我有以下记录:
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 创建新的相机源或驱动程序。基于 python 有一个类似的问题。我想做的是,我希望在 Windows 中显示一个新的相机源,以便所有应用程序都可以连接到它。输出将是循环显示的许多图像,而不是实时摄像机。我可以用java实现这个吗?如果是的话怎么办?stackoverflow上有很多基于c++的问题。但不是关于 Java 的。我正在尝试用 Java 来实现这一点。我认为为此我需要使用像 directX 这样的东西。
我知道如何创建图像循环。但是如何创建相机源呢?
在用 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 …
我正在使用 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) 我如何配置Java自己的“新”(Java 9/11/17)HttpClient来尝试比主机名后面第一个找到的IP地址更多的内容?有(至少)两种情况:
> host localhost
localhost has address 127.0.0.1
localhost has IPv6 address ::1
Run Code Online (Sandbox Code Playgroud)
> 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-17 ×10
java ×8
aspectj ×1
camera ×1
driver ×1
ecj ×1
eclipse-jdt ×1
gradle ×1
inetaddress ×1
java-11 ×1
java-8 ×1
java-record ×1
jep-396 ×1
jit ×1
logback ×1
maven ×1
precision ×1
slf4j ×1
spring-boot ×1
thread-local ×1