标签: java-17

如何将 Java 17 记录转换为 Clojure 映射?

有一个clojure.core/bean将 POJO 转换为 Map 的标准函数:

class MyPojo{
  public String getFirst(){ return "abc"; }
  public int getSecond(){ return 15; }
}

IFn bean = Clojure.var("clojure.core", "bean")

var result = bean.invoke(new MyPojo())

// result => {:first = abc, :second = 15}
Run Code Online (Sandbox Code Playgroud)

对于 Java 17 记录类,此函数不起作用,因为记录不遵循 POJO"get***"属性约定。

Clojure 是否以同样的方式支持 Java 17 记录实例?

clojure java-record java-17

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

可选<T>作为Java中的记录参数

Java 8 中引入的类型Optional<T>主要推荐用于返回类型和结果。因此,每当我在类字段或方法参数中使用它时,我都会在 IntelliJ 中收到警告:

Optional<?>用作字段/参数的类型。

Optional<T>但是,当我在规范构造函数中使用 an 作为记录参数时,我没有收到此警告:

public record AuthenticationResult(
    boolean isAuthenticated,
    Optional<User> user,
    Optional<String> authorizationHeader)
{ } 
Run Code Online (Sandbox Code Playgroud)

不使用类型作为参数/字段的做法是否Optional<T>不适用于记录参数,因为字段将始终作为记录自动生成的 getter 方法的返回值进行访问?

或者是因为记录是一项新功能,并且此警告尚未实现,并且在记录中使用可选参数与用作方法参数或字段时具有相同的后果?

java record option-type java-17

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

Spring Boot 无法在 JDK 17 上启动:模块 java.base 不会向未命名模块“打开 java.lang”

我正在将 Spring Boot 应用程序从 JDK 8 迁移到 JDK 17。

但在 JDK 17 中出现以下错误:

java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.findLoadedClass(java.lang.String) accessible: module java.base does not "opens java.lang" to unnamed module @1356d4d4
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) ~[na:na]
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) ~[na:na]
    at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199) ~[na:na]
    at java.base/java.lang.reflect.Method.setAccessible(Method.java:193) ~[na:na]
    at org.springframework.util.ReflectionUtils.makeAccessible(ReflectionUtils.java:577) ~[spring-core-5.3.20.jar:5.3.20]
    at org.springframework.context.support.ContextTypeMatchClassLoader$ContextOverridingClassLoader.isEligibleForOverriding(ContextTypeMatchClassLoader.java:99) ~[spring-context-5.3.20.jar:5.3.20]
    at org.springframework.core.OverridingClassLoader.loadClass(OverridingClassLoader.java:87) ~[spring-core-5.3.20.jar:5.3.20]
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[na:na]
    at org.springframework.core.OverridingClassLoader.loadClass(OverridingClassLoader.java:82) ~[spring-core-5.3.20.jar:5.3.20]
    at org.springframework.context.support.ContextTypeMatchClassLoader.loadClass(ContextTypeMatchClassLoader.java:70) ~[spring-context-5.3.20.jar:5.3.20]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1594) ~[spring-beans-5.3.20.jar:5.3.20]
    at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1534) ~[spring-beans-5.3.20.jar:5.3.20]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:704) ~[spring-beans-5.3.20.jar:5.3.20]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:674) ~[spring-beans-5.3.20.jar:5.3.20]
    at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1670) ~[spring-beans-5.3.20.jar:5.3.20]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:570) ~[spring-beans-5.3.20.jar:5.3.20] …
Run Code Online (Sandbox Code Playgroud)

java spring spring-boot java-17

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

文本块内的 Java 正则表达式

我当然希望这能得到支持:

\n
private static void regex() {\n    String plain = "\\\\w+";\n    String withTextBlocks = """\n        \\w+\n    """;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

withTextBlocks不能在 Java-17 下编译。\xe2\x80\x99 是不是我们不应该转义的文本块点?我已经通过了JEP,也许解释就在那里,但我无法理解它。第二个问题,如果有人知道的话,未来是否有一个 JEP?谢谢。

\n

java regex escaping java-17

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

R8 与 Android Studio Flamingo 中密封类的兼容性

当我想发布我的应用程序时出现此错误:com.android.tools.r8.internal.jb: Sealed classes are not supported as program classes when generating class files

  • Android Studio:Flamingo 2022.2.1(我也尝试2022.3.1 Giraffe)
  • Gradle版本:8.0(我也尝试8.1和8.0.2)
  • Gradle 插件版本:8.0.0
  • JDK:17.0.6(嵌入式 Android Studio Flamingo)

在 build.gradle 中,由于 android studio min gradle,我无法编辑编译版本。

compileOptions {
    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
  }
  kotlinOptions {
    jvmTarget = "17"
  }
Run Code Online (Sandbox Code Playgroud)

我在模块中使用的密封类是

compileOptions {
    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
  }
  kotlinOptions {
    jvmTarget = "17"
  }
Run Code Online (Sandbox Code Playgroud)

android kotlin sealed-class android-r8 java-17

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

Java 8 到 Java 17 的迁移导致 Docker 容器内存显着增加

您能否帮助我们解答有关 ECS 中 Docker 容器中运行的 Java 8 Spring boot 应用程序的疑问?迁移到 Java 17 后,我们观察到与在 Java 8 上运行的容器的内存使用量相比,容器的内存使用量显着增加了 1GB(我们使用docker stats两个容器的命令比较了内存​​)。我们只有 Java 进程在容器内运行。jmap下面提供了 Java 8 和 Java 17 的命令输出。我们观察到的唯一重大变化是:

  1. 垃圾收集算法是 G1,与 Java 8 中的 CMS 相比,它现在是 Java 17 中的默认算法。
  2. 从 Java 8 中的 166.375MB增加到MaxNewSizeJava 17 中的 1228.0MB。

我们想知道这是否是 Docker 容器中内存使用量增加的原因。我们了解到,新的 G1 垃圾收集算法的内存使用量略高(从命令输出中发现,大约 120 MB,而 CMS 的内存使用量为 12 MB jcmd VM.native_memory),但我们没想到会出现如此剧烈的增加。关于这个问题的任何建议或见解将不胜感激。

Java 8 的 jmap 输出

using parallel threads in the new generation.
using thread-local object allocation. …
Run Code Online (Sandbox Code Playgroud)

garbage-collection heap-memory g1gc java-8 java-17

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

分析版本 17 时“未找到依赖项”

我正在研究的项目之一具有以下相关配置:

<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>

<plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>3.2.0</version>
    <configuration>
        <failOnWarning>true</failOnWarning>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>analyze-only</goal>
            </goals>
        </execution>
    </executions>
</plugin>


<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest</artifactId>
    <version>2.2</version>
    <!-- not scoped to test -->
</dependency>
Run Code Online (Sandbox Code Playgroud)

执行mvn clean verify(apache-maven-3.6.3,java:17-ea)时,构建按预期成功。我现在对属性进行了更改,将 源和目标替换为发布:

<maven.compiler.release>17</maven.compiler.release>
Run Code Online (Sandbox Code Playgroud)

终端上的日志显示

[INFO] --- maven-dependency-plugin:3.2.0:analyze-only (default) @ java-8-matchers ---
[WARNING] Non-test scoped test only dependencies found:
[WARNING]    org.hamcrest:hamcrest:jar:2.2:compile
Run Code Online (Sandbox Code Playgroud)

导致失败(因为警告)!为什么/如何在 Java 版本中升级时对依赖关系进行不同的处理?有任何解决这个问题的方法吗?


如果可能有帮助,此目标的调试日志如下:

[DEBUG] Configuring mojo org.apache.maven.plugins:maven-dependency-plugin:3.2.0:analyze-only from plugin realm ClassRealm[plugin>org.apache.maven.plugins:maven-dependency-plugin:3.2.0, parent: jdk.internal.loader.ClassLoaders$AppClassLoader@579bb367]
[DEBUG] Configuring mojo 'org.apache.maven.plugins:maven-dependency-plugin:3.2.0:analyze-only' with basic configurator -->
[DEBUG]   (f) analyzer …
Run Code Online (Sandbox Code Playgroud)

java maven maven-dependency-plugin java-17

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

java.lang.reflect.InaccessibleObjectException:从 java 11 升级到 17 时无法生成受保护的最终 java.lang.Class

我们的项目使用[schema-repo-server][1]。启动 schema-repo-server 的代码如下 -

    package technorati.tut.fes;
    
    import org.schemarepo.server.RepositoryServer;
    import java.util.Properties;
    
    public class Main2 {
        public static void main(String[] args) throws Exception {
            Properties props = new Properties();
            props.put("schema-repo.class", "com.technorati.camus.schemaregistry.ZooKeeperRepository");
            props.put("schema-repo.zookeeper.ensemble", "kafka01.cap.qa.opal.synacor.com:2181,kafka02.cap.qa.opal.synacor.com:2181,kafka03.cap.qa.opal.synacor.com:2181");
            RepositoryServer rs = new RepositoryServer(props);
            rs.start();
        }
    
    }
    
Run Code Online (Sandbox Code Playgroud)

这段代码在java11中运行良好。

我正在将 java 版本从 java 11 升级到 java 17。升级后,当我启动服务时,出现以下错误。

注意:启动列表中的模块为 --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens jdk.management/com .sun.management.internal=全部未命名

我该如何解决这个问题?

14:18:48 信息 [org.schemarepo.server.RepositoryServer ] 通过 SLF4J 路由 java.util.logging 流量 线程“main”中的异常 com.google.inject.internal.util.$ComputationException:com 处的 java.lang.ExceptionInInitializerError .google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:553) 位于 com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:419) 位于 com.google .inject.internal.util.$CustomConcurrentHashMap$ComputingImpl.get(CustomConcurrentHashMap.java:2041) 位于 com.google.inject.internal.FailableCache.get(FailableCache.java:50) 位于 com.google.inject.internal.ConstructorInjectorStore。 …

java java-11 java-17

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

如何使用散列名称调试 Java 运行时未命名模块错误

我对模块化 Java 的兴趣已经几个月了,包括 Spring 和相关的生态系统内容。最令人沮丧的经历之一是调试名称不明确的模块问题

这是我遇到的最后一个此类错误:

java.lang.IllegalAccessError: superclass access check failed: class com.oracle.truffle.polyglot.PolyglotImpl (in unnamed module @0x58a90037) cannot access class org.graalvm.polyglot.impl.AbstractPolyglotImpl (in module org.graalvm.sdk) because module org.graalvm.sdk does not export org.graalvm.polyglot.impl to unnamed module @0x58a90037

@0x58a90037问题就在这里。

根据我要做的事情,我会随机尝试spring.beansspring.context等等javax.validation......并向世界开放我的模块,这在某种程度上消除了首先封装它们的价值。

对于这个具体案例,我尝试过requires org.graalvm.sdk;虽然进展并不顺利,但还是requires org.graalvm.js;做到了。

通过随机尝试进行调试似乎并不是解决这些问题的明智方法。所以我想知道你们是怎么做到的。

谢谢你!

java java-platform-module-system java-module java-17

6
推荐指数
0
解决办法
455
查看次数

Java 17 是否支持任何 OSGi 版本?

我已经使用 Java17 运行了 OSGi 捆绑包,并在启动时得到了以下结果。Java 17 还不支持 OSGi 吗?

org.osgi.util.tracker.ServiceTracker.getServices()”为空

java osgi osgi-bundle java-17

6
推荐指数
0
解决办法
1325
查看次数