标签: java-17

迁移到 spring boot 3 和 java 17 后,JPA Metamodel 不会生成源

将 spring boot 项目从 2.0 移动到 3.0 并升级到 java 17 后,hibernate-jpamodelgen 不会生成元模型类。

我添加了这个依赖,但仍然不起作用。有人可以帮忙吗?

<dependency>
     <groupId>org.hibernate.orm</groupId>
     <artifactId>hibernate-jpamodelgen</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)

spring-data-jpa spring-boot hibernate-6.x java-17

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

使用 JDK 17 的 Javassist

从 JDK 11 升级到 17 后,Javassist(版本 3.28.0-GA)停止工作。

调用CtClass#toClass会出现以下错误:

  ...
  Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @63e31ee
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199)
at java.base/java.lang.reflect.Method.setAccessible(Method.java:193)
at javassist.util.proxy.SecurityActions.setAccessible(SecurityActions.java:159)
at javassist.util.proxy.DefineClassHelper$JavaOther.defineClass(DefineClassHelper.java:213)
at javassist.util.proxy.DefineClassHelper$Java11.defineClass(DefineClassHelper.java:52)
at javassist.util.proxy.DefineClassHelper.toClass(DefineClassHelper.java:260)
at javassist.ClassPool.toClass(ClassPool.java:1240)
at javassist.CtClass.toClass(CtClass.java:1392)
Run Code Online (Sandbox Code Playgroud)

有人知道解决方法吗?

java javassist java-17

4
推荐指数
1
解决办法
3129
查看次数

我可以使用 jpackage (Java 17) 制作可安装的 32 位版本的应用程序吗

我使用 Java 17 和 JavaFX 16 库制作了一个应用程序。有没有办法使用 JPackage 制作可安装的 32 位版本?由于自 Java 9 以来 Java 一直都是 64 位(与 JavaFX 库相同),我怀疑这是不可能的,但是有什么办法可以做到吗?

java javafx javafx-11 jpackage java-17

4
推荐指数
1
解决办法
2524
查看次数

是否可以将 Class&lt;?&gt; 与新的模式匹配开关一起使用?

作为对方法参数的调查的一部分,我尝试了新的switch 模式匹配(预览版)。使用传统条件,它可以完美运行:

Method firstMethod = BitSet.class.getDeclaredMethods()[0];
Parameter firstParameter = firstMethod.getParameters()[0];
if (firstParameter.getType() == Integer.class) {
        System.out.println("Integer");
    }
Run Code Online (Sandbox Code Playgroud)

当我尝试重构它以使用switch语句时,它没有编译:

Method firstMethod = BitSet.class.getDeclaredMethods()[0];
Parameter firstParameter = firstMethod.getParameters()[0];
switch (firstParameter.getType()) {
    case Integer.class: System.out.println("Integer");
    case int.class: System.out.println("int");
    default: System.out.println("other");
}
Run Code Online (Sandbox Code Playgroud)

错误是:

 error: incompatible types: Class<Integer> cannot be converted to Class<CAP#1>
        case Integer.class: System.out.println("Integer");
                    ^
 where CAP#1 is a fresh type-variable:
   CAP#1 extends Object from capture of ?
Run Code Online (Sandbox Code Playgroud)

这是无法完成的事情,还是只是语法错误?

java switch-statement preview-feature java-17

4
推荐指数
1
解决办法
689
查看次数

在什么场景下应该使用JEP334(JVM Constants API)

我正在学习 Java 17,通过 JEP334(JVM Constants API),我知道如何获取ClassDesc, MethodTypeDesc, MethodHandleDesc, DynamicConstantDesc.

但这些物体能做什么呢?

在什么应用场景下需要这些对象?

java jep java-17

4
推荐指数
1
解决办法
342
查看次数

java.lang.UnsatisfiedLinkError:/opt/jdk17/lib/libawt_xawt.so:libXrender.so.1:无法打开共享对象文件:没有这样的文件或目录

我不明白我出了什么问题。我正在尝试运行 Spigot Server Core 1.18.2,但这个库经常出现问题。

[19:21:50 INFO]:[STDERR]:java.lang.UnsatisfiedLinkError:/opt/jdk17/lib/libawt_xawt.so:libXrender.so.1:无法打开共享对象文件:没有这样的文件或目录[19: 21:50 信息]: [STDERR]: 在 java.base/jdk.internal.loader.NativeLibraries.load(本机方法) [19:21:50 信息]: [STDERR]: 在 java.base/jdk.internal。 loader.NativeLibraries$NativeLibraryImpl.open(NativeLibraries.java:388) [19:21:50 INFO]: [STDERR]: 在 java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:232) [19 :21:50 信息]: [STDERR]: 在 java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:174) [19:21:50 信息]: [STDERR]: 在 java.base/ java.lang.ClassLoader.loadLibrary(ClassLoader.java:2389) [19:21:50 信息]: [STDERR]: 在 java.base/java.lang.Runtime.load0(Runtime.java:755) [19:21 :50 INFO]: [STDERR]: 在 java.base/java.lang.System.load(System.java:1953) [19:21:50 INFO]: [STDERR]: 在 java.base/jdk.internal。 loader.NativeLibraries.load(本机方法)[19:21:50信息]:[STDERR]:在java.base/jdk.internal.loader.NativeLibraries$NativeLibraryImpl.open(NativeLibraries.java:388)[19:21: 50信息]:[STDERR]:在java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:232)[19:21:50信息]:[STDERR]:在java.base/jdk.internal .loader.NativeLibraries.loadLibrary(NativeLibraries.java:174) [19:21:50 INFO]: [STDERR]: 在 java.base/jdk.internal.loader.NativeLibraries.findFromPaths(NativeLibraries.java:315) [19: 21:50 信息]: [STDERR]: 在 java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:285) [19:21:50 信息]: [STDERR]: 在 java.base/java .lang.ClassLoader.loadLibrary(ClassLoader.java:2398) [19:21:50 INFO]: [STDERR]: 在 java.base/java.lang.Runtime.loadLibrary0(Runtime.java:818) [19:21: 50 INFO]:[STDERR]:在 java.base/java.lang.System.loadLibrary(System.java:1989) …

java java-17

4
推荐指数
1
解决办法
6063
查看次数

使用 UTF-16 将文件读取为字符串时,由 MalformedInputException 引起的“不应该发生”的错误

Path file = Paths.get("New Text Document.txt");
try {
    System.out.println(Files.readString(file, StandardCharsets.UTF_8));
    System.out.println(Files.readString(file, StandardCharsets.UTF_16));
} catch (Exception e) {
    System.out.println("yep it's an exception");
}
Run Code Online (Sandbox Code Playgroud)

可能会产生

some text
Exception in thread "main" java.lang.Error: java.nio.charset.MalformedInputException: Input length = 1
    at java.base/java.lang.String.decodeWithDecoder(String.java:1212)
    at java.base/java.lang.String.newStringNoRepl1(String.java:786)
    at java.base/java.lang.String.newStringNoRepl(String.java:738)
    at java.base/java.lang.System$2.newStringNoRepl(System.java:2390)
    at java.base/java.nio.file.Files.readString(Files.java:3369)
    at test.Test2.main(Test2.java:13)
Caused by: java.nio.charset.MalformedInputException: Input length = 1
    at java.base/java.nio.charset.CoderResult.throwException(CoderResult.java:274)
    at java.base/java.lang.String.decodeWithDecoder(String.java:1205)
    ... 5 more
Run Code Online (Sandbox Code Playgroud)

这个错误“不应该发生”。方法如下java.lang.String

private static int decodeWithDecoder(CharsetDecoder cd, char[] dst, byte[] src, int offset, int length) {
    ByteBuffer bb …
Run Code Online (Sandbox Code Playgroud)

java utf-16 java-17

4
推荐指数
1
解决办法
1891
查看次数

ZonedDateTime 正确解析模式“O”中的“GMT”区域,但不能解析“UTC”

以下正确解析文本输入“2022-12-29 01:16:03 GMT+08:00”。

public ZonedDateTime parseZonedDateTime(String timeStr) {
  DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss O");

  ZonedDateTime zonedDateTime = ZonedDateTime.parse(timeStr, dtf);

  return zonedDateTime;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果输入字符串是“2022-12-29 01:16:03 UTC-08:00”,ZonedDateTime.parse() 方法会抛出异常

java.time.format.DateTimeParseException: Text '2022-12-29 01:16:03 UTC-08:00' could not be parsed at index 20
Run Code Online (Sandbox Code Playgroud)

请访问 Ideone.com 查看在 Java 12 上运行的代码。

根据 DateTimeFormatter 文档,https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

“GMT+08:00”和“UTC-08:00”都被视为本地化区域偏移“O”。

正确的模式应该是什么,以便解析器接受 GMT 和 UTC 输入?

我尝试使用格式“yyyy-MM-dd HH:mm:ss OOOO”,但行为是相同的。

有一个类似的问题为什么“GMT+8”无法用模式“O”解析,尽管直接从文档中复制出来?据此,该错误已在 Java 9 build b116 中修复。

不过我正在使用 java 17.0.4.1-librca

java java-time zoneddatetime datetimeformatter java-17

4
推荐指数
1
解决办法
190
查看次数

在 Ubuntu 中,如何设置 Tomcat 9 使用 Java 17?

正如标题所述,在 Ubuntu 20.04 中如何设置 Tomcat 9 使用 Java 17 ?

最近,我使用 Spring Boot 3.0.1 重新打包了我的 Web 项目的war文件,该项目需要 Java 17 才能运行,并尝试将其部署到 Ubuntu 20.04 服务器上的 Tomcat 9 容器。

看来最好的办法就是利用setenv.sh.

我跟踪了一些文档,bin在 中创建了一个文件夹/usr/share/tomcat9,触摸了 的文件setenv.sh,并用 编辑了其内容JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64

然后运行sudo systemctl start tomcat9,但是失败。 sudo systemctl status tomcat9说“找不到 JDK 或 JRE - 请设置 JAVA_HOME 变量或安装 default-jdk 包”,

首先安装了openjdk-17-jre-headless,并删除了openjdk-11-jre-headless 。Tomcat9 和 JRE 17 都是通过apt包管理器安装的。

linux spring-boot tomcat9 java-17

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

Java 17:switch 表达式和语句

我不明白为什么第一个片段编译得很好:

var res = getResult(s);

public static double getResult(Shape s)  {
        switch(s) {
            case Rectangle r : return 2* r.largeur() + 2* r.longueur();
            case Circle c : return  2*c.radius();
            default : throw new RuntimeException("not a shape");
        }
}
Run Code Online (Sandbox Code Playgroud)

但不是这个:

var res = switch(s) {
            case Rectangle r : return 2* r.largeur() + 2* r.longueur();
            case Circle c : return  2*c.radius();
            default : throw new RuntimeException("not a shape");
        };
Run Code Online (Sandbox Code Playgroud)

对我来说看起来是一样的。

switch-statement switch-expression java-17

4
推荐指数
1
解决办法
2455
查看次数