我正在用 Java 14 构建一些东西。
我写了一个名为 PersonInJava14 的类,如下所示。
package recordexample;
public record PersonInJava14(String name, String gender, int age) {}
Run Code Online (Sandbox Code Playgroud)
但是,它会引发这样的错误。
Syntax error on token "record", record expected
Run Code Online (Sandbox Code Playgroud)
该项目基于 Java 14,可以进行必要的设置以在 Java 14 中运行它。
这是我的设置部分。
我该如何解决?
我正在尝试将 PMD 插件集成到构建阶段的 pom.xml 文件。
3.13.0<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>group</groupId>
<artifactId>artifact</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>14</maven.compiler.source>
<maven.compiler.target>14</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<pmd.plugin.version>3.13.0</pmd.plugin.version>
</properties>
<dependencies>
</dependencies>
<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
</plugin>
</plugins>
</reporting>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>${pmd.plugin.version}</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<configuration>
<!-- failOnViolation is actually true by default, but can be disabled -->
<failOnViolation>true</failOnViolation>
<!-- printFailingErrors is pretty useful -->
<printFailingErrors>true</printFailingErrors>
<targetJdk>14</targetJdk>
</configuration>
<executions>
<execution>
<goals> …Run Code Online (Sandbox Code Playgroud) 只是尝试动手操作java.lang.Record。我已经阅读了文档和JEP-359以获得一些理解。因此,在阅读构造函数的隐式声明时,我想到将其与现有的代码生成库 - Lombok 混合!
现在我最终创建的一个最小的可重复示例是这个记录
import lombok.AllArgsConstructor;
@AllArgsConstructor
public record Java(String version) {
}
Run Code Online (Sandbox Code Playgroud)
使用 IntelliJ 编译时成功生成类文件,如下所示
public final class Java extends java.lang.Record {
private final java.lang.String version;
public Java(java.lang.String version) { /* compiled code */ }
... rest of the compiled code
}
Run Code Online (Sandbox Code Playgroud)
请注意,.class文件的构造函数也正是我在这两个世界中独立所期望的。但是,在 IntelliJ 编译期间进一步尝试创建此记录的实例失败:
public class MixOfWorlds {
public static void main(String[] args) {
System.out.println(new Java("14").version()); // cannot resolve constructor
}
}
Run Code Online (Sandbox Code Playgroud)
我将创建一个更简单的示例来javac使用java工具执行编译和执行。如果这是由于我可能忽略的某些事情而可能发生的预期行为,我仍在寻找答案?
IntelliJ IDEA 2020.1 EAP …Run Code Online (Sandbox Code Playgroud) java intellij-idea intellij-lombok-plugin java-14 java-record
我将 Java 14 与 Jetty 9.4 和 Weld-servlet-shaded-3.1 一起使用,但出现此异常:
Caused by: java.lang.reflect.InaccessibleObjectException:
Unable to make protected final java.lang.Class
java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int)
throws java.lang.ClassFormatError accessible: module java.base does
not "opens java.lang" to module weld.servlet.shaded.
Run Code Online (Sandbox Code Playgroud)
根据这里的回答:https : //stackoverflow.com/a/41265267/5057736我试着添加
--add-opens java.base/java.lang=ALL-UNNAMED
Run Code Online (Sandbox Code Playgroud)
和
--add-opens java.base/java.lang=weld.servlet.shaded
Run Code Online (Sandbox Code Playgroud)
但没有人帮忙。谁能说一下怎么修?
编辑 1
我发现这个问题出现在 Java 12,13,14 OpenJDK/Oracle 中。但是,如果我使用 Java 11 OpenJDK/Oralce 一切正常,我什至不添加任何--add-opens. 怎么解释?
编辑 2
我检查了Jetty pom和Weld pom,它们都具有相同的属性:
<compiler.source>1.8</compiler.source>
<compiler.target>1.8</compiler.target>
Run Code Online (Sandbox Code Playgroud)
编辑 3
Java 版本
$ java -version
openjdk version "14" 2020-03-17
OpenJDK Runtime …Run Code Online (Sandbox Code Playgroud) 如何将变量放入java文本块中?
喜欢
"""
{
...
"someKey": "someValue",
"date": "${LocalDate.now()}",
...
}
"""
Run Code Online (Sandbox Code Playgroud) 此问题已在 Gradle 6.6 中修复
我想在测试中放置标志-XX:+ShowCodeDetailsInExceptionMessages以启用有用的 NPE ( https://openjdk.java.net/jeps/358 )
我试过
tasks.withType<Test> {
jvmArgs("-XX:+ShowCodeDetailsInExceptionMessages")
testLogging {
setExceptionFormat("full") // Prints the message of the exception
}
}
Run Code Online (Sandbox Code Playgroud)
但是 NPE 仍然没有消息。
这是我的java版本
java -version
openjdk version "14.0.1" 2020-04-14
OpenJDK Runtime Environment (build 14.0.1+7)
OpenJDK 64-Bit Server VM (build 14.0.1+7, mixed mode, sharing)
Run Code Online (Sandbox Code Playgroud)
使用更多研究进行编辑
为了更准确地找出问题的根源,我做了更多的工作。我的结论是它不是来自我的 java 也不是测试框架,它只能是 gradle 的错误配置或错误。这是我所做的:
我已经用这个 build.gradle.kts 设置了一个空的 gradle 项目
plugins {
java
}
repositories {
mavenCentral()
}
dependencies {
testImplementation("junit:junit:4.13")
}
tasks.withType<Test> {
jvmArgs("-XX:+ShowCodeDetailsInExceptionMessages") // Helpful …Run Code Online (Sandbox Code Playgroud) 我刚开始在 intellij idea 社区版本中使用 jshell。当我在 jshell 中编写以下代码时,它可以工作。
List<String> list = List.of("a", "b", "c");
System.out.println(list);
Run Code Online (Sandbox Code Playgroud)
但是,相同的代码在 intellij 中不起作用。它说“预期的表达”。它执行得很好,但显示List<String>. 问题是“自动完成”不起作用。为了解决这个问题,我们可以使用原始类型,但我想要一个通用类型。有什么我想念的吗?如何编写泛型类型?
我正在尝试将使用 Izpack 创建的 Java 应用程序的 Windows 安装转换为使用 Java 14 中提供的 JPackage。安装程序构建并安装,但是当我尝试运行它创建的 exe 时它失败,但没有提供有关失败原因的信息。
是否有日志或某种方法可以找出它实际上无法启动的原因?
我有一个包含 Scala (2.13.1) 和 Java 文件的 sbt 项目。
\n我想使用 Java 14 编译 java 文件,包括预览功能。
\n我该怎么做?
按照上面的 oracle 文档,我尝试设置 javaOptions + javacOptions:
\njavaOptions ++= Seq("--enable-preview"), // when running\njavacOptions ++= Seq("--enable-preview", "--release", "14"), // when compiling\nRun Code Online (Sandbox Code Playgroud)\n但是当我编译一个使用预览功能的简单 Java 文件时,例如:
\npackage example;\n\npublic record Person(String name, Integer age) {}\nRun Code Online (Sandbox Code Playgroud)\n我得到:
\n\n\n[错误] /Users/dvir/learn/playground/src/main/java/example/Person.java:3:15: 类型声明的非法开始
\n
\n[错误] 公共记录 Person(字符串名称, 整数年龄) {}
\n[错误] ^
注意:\n我在 Mac 上使用AdoptOpenJDK 14。
\n我的JAVA_HOME是/Library/Java/JavaVirtualMachines/adoptopenjdk-14.jdk/Contents/Home.
\n使用时jshell …
我尝试将我的项目从 JDK 11 升级到 JDK 14,但在将 java 版本设置为 14 后运行测试失败。由于我将 jacoco 与 JMockit 结合使用,我配置了我的构建如下(编辑:JaCoCo 版本是 0.8.3 / 0.8.5,JMockit 版本 1.49):
<build>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>${version.jacoco}</version>
<executions>
<execution>
<id>coverage-initialize</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>coverage-report</id>
<phase>post-integration-test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${version.surefire-plugin}</version>
<configuration>
<argLine>
@{argLine} -javaagent:"${settings.localRepository}"/org/jmockit/jmockit/${version.jmockit}/jmockit-${version.jmockit}.jar
</argLine>
</configuration>
</plugin>
...
Run Code Online (Sandbox Code Playgroud)
如果我在 Java 版本设置为 11 的情况下运行 Maven,一切正常,但是当我将 Java 版本设置为 14 时,surefire 插件会抛出此错误:
[ERROR] java.lang.instrument.IllegalClassFormatException: Error while instrumenting sun/util/resources/cldr/provider/CLDRLocaleDataMetaInfo.
[ERROR] at org.jacoco.agent.rt.internal_1f1cc91.CoverageTransformer.transform(CoverageTransformer.java:93)
[ERROR] sun.util.locale.provider.LocaleDataMetaInfo: Unable to load sun.util.resources.cldr.provider.CLDRLocaleDataMetaInfo …Run Code Online (Sandbox Code Playgroud)