我正在尝试使用JDK-12 ea构建一个项目。尝试执行示例类时:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int value = scanner.nextInt();
// After JEP-325
switch (value) {
case 1 ->System.out.println("one");
case 2 ->System.out.println("two");
default ->System.out.println("many");
}
}
Run Code Online (Sandbox Code Playgroud)
IDE抛出读取的错误
错误:java:错误:无效的源发行版:13
相关项目配置屏幕:
模块设定
开发包
编译器设定
Run Code Online (Sandbox Code Playgroud)IntelliJ IDEA 2018.3.3 (Community Edition) Build #IC-183.5153.38, built on January 9, 2019 JRE: 1.8.0_152-release-1343-b26 x86_64 JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o macOS 10.13.6
尝试将语言级别切换回12,没有实验性功能,但最终以
我记得最近成功使用了实验性功能(不确定确切的IntelliJ版本)。除此以外,我还需要配置一些更改吗?
我在Java 12上大吃一惊,并注意到javac最低目标Java级别已提高到1.7。
Execution failed for task ':com.foo:compileJava'.
> error: release version 6 not supported
Run Code Online (Sandbox Code Playgroud)
为什么我要编译为您要求的Java 6?
即使我的代码库要求的最低Java级别为1.7,我仍然希望将内核以较旧的Java级别进行编译,以便JVM可以启动,并且我可以输出一条更好的错误消息,指示必须使用Java 7+,而不是更多。神秘的不兼容类版本错误。
展望未来...
Java 6并不是太大的问题,但是我主要关心的是,如果Java仅支持N-5版本,那么到Java 14(大约从现在开始),我将不再能够编译为Java 8。仍然是一个非常流行的运行时版本。
我相信Maven可以通过工具链解决此类问题,但是Gradle是否提供类似的功能?
编辑:我还注意到JEP 182尚未批准,但是如果批准将意味着仅支持N-3版本。
根据JEP 230:Microbenchmark Suite,存在Java 12内置的微基准套件。JEP解释说它基本上是JMH,但无需使用Maven / Gradle明确依赖它。但是,它没有指定如何访问属于该套件的类/注释来执行基准测试。
我的问题是:
module-info.java要使用此套件,我是否需要一个特定的Java模块?我看了一看OpenJDK Docker存储库,发现Java 12没有JRE映像。Java11(openjdk:11.0.2-jre)有一个JRE映像,但是12中只有JDK映像。
问:如何使用OpenJDK JRE 12在Docker中运行应用程序而不使用完整的JDK映像?
我继续战斗,以了解VarHandle::setOpaque和VarHandle::getOpaque被真正做的事情。到目前为止,这并不容易-我认为我得到了一些东西(但不会在问题本身中介绍它们,不要糊涂了它们),但总的来说,这对我来说最多是误导。
文档:
返回按程序顺序访问的变量的值...
据我了解,如果我有:
int xx = x; // read x
int yy = y; // read y
Run Code Online (Sandbox Code Playgroud)
这些读取可以重新排序。另一方面,如果我有:
// simplified code, does not compile, but reads happen on the same "this" for example
int xx = VarHandle_X.getOpaque(x);
int yy = VarHandle_Y.getOpaque(y);
Run Code Online (Sandbox Code Playgroud)
这次不能重新订购吗?这就是“程序顺序”的意思吗?我们是否在谈论在这里插入障碍物以禁止这种重新排序?如果是这样,由于这是两个负载,是否会达到相同的效果?通过:
int xx = x;
VarHandle.loadLoadFence()
int yy = y;
Run Code Online (Sandbox Code Playgroud)
但这变得更加棘手:
...但不能保证相对于其他线程的内存排序效果。
我无法拿出一个例子来假装我理解这部分。
在我看来,该文档针对的是确切知道他们在做什么的人(我绝对不是一个人)...那么有人可以在这里阐明一些信息吗?
我正在尝试使用 spring boot、maven 和 java 12 创建 web 应用程序。我使用 spring-boot-starter-parent 版本 2.1.5.RELEASE、java 12 和 maven-compiler-plugin 版本 3.8.1 启动了该项目。我尝试运行 ./mvnw 包,但出现此错误:
编译致命错误:无效目标版本:12
之后我在互联网上写道,maven 编译器插件使用旧的 asm 依赖项,我应该指定它的新版本。因此,我选择了最新版本的 asm,即 7.1,并添加了带有属性 release 12 和 compilerArgs --enable-preview 的配置标记,用于 Java 12。结果是:
编译致命错误:无效标志:--release
我尝试的下一件事是使用 spring boot starter 父版本 2.2.0.M3 并指定存储库以从http://repo.spring.io/milestone查找 spring 的里程碑版本。不幸的是我得到了同样的结果。有任何想法吗?
我正在尝试Java模块系统。我正在尝试将ServiceLoader用于通用接口。它可以工作,但是我在module-info中收到警告。这是我的最小代码
module testProvideWith {
provides ServiceGeneric with SString;
uses ServiceGeneric;
}
public interface ServiceGeneric<T> {
T getT();
}
public class SString implements ServiceGeneric<String>{
public String getT() {return "Hello";}
}
Run Code Online (Sandbox Code Playgroud)
尝试时收到警告我并不感到惊讶
ServiceGeneric<String> serv=ServiceLoader.load(ServiceGeneric.class).findFirst().get();
Run Code Online (Sandbox Code Playgroud)
我知道通用擦除,我知道我必须使用注释或其他技巧来注释正确的服务。但是...我没有找到所有通用服务。我希望能够写类似
module testProvideWith {
provides ServiceGeneric<String> with SString;
uses ServiceGeneric<String>;
//more cases could be added
}
...
ServiceLoader.load(ServiceGeneric.class,String.class)
Run Code Online (Sandbox Code Playgroud)
模块和加载程序在哪里协作以跟踪可用的通用版本..但是...什么都没有...没有人考虑过这种可能性...我想念什么吗?
我从 Java 10 升级到 Java 12 和 JavaFX 12。
现在我无法再编译我的项目,因为javafx.embed.swingSwingFXUtils不再被识别。
Intellij 找不到该类的任何库。好像javafx.embed已经不存在了。
我查看了包裹是否掉落,但找不到任何相关信息。
我正在使用 JAXB 将应用程序移植到 JDK 11/12,但在尝试修复这些 JAXB 类路径问题时完全迷失了方向。我已经用谷歌搜索并阅读了基本上与此相关的所有内容,所以我知道 Java11 中所做的更改,即从 JDK 中删除 JAXB ...但是在这种情况下,我会假设一个简单的修复,包括在类路径上添加 api 和 impl JAR。但这不起作用,尽管我在类路径上有这些 JAR,但我仍然得到已知的异常,尽管使用 2.3.2 JAXB:
javax.xml.bind.JAXBException - 带有链接异常:[java.lang.ClassNotFoundException:com.sun.xml.internal.bind.v2.ContextFactory]
即使我看到该类位于不同的包中,并且我指示通过系统变量使用正确的包,它也不起作用:
gradle -Djavax.xml.bind.context.factory=com.sun.xml.bind.v2.ContextFactory 构建
javax.xml.bind.JAXBException - 带有链接异常:[java.lang.ClassNotFoundException:com.sun.xml.bind.v2.ContextFactory]
有谁知道如何解决这个问题?我不想使用清单文件等。应该可以将正确的 JAR 放在类路径上,就是这样,或者不是?
此处总结但无法使其工作: http://www.descher.at/descher-vu/2019/01/java-11-jaxb-and-osgi/
更新,Gradle 中使用的依赖项: - jaxb-xjc 将 jaxb-runtime (实现)作为传递依赖项。我看到它是由 Gradle 选择的,但仍然是同样的错误。
classpath "com.sun.activation:javax.activation:1.2.0"
classpath "jakarta.xml.bind:jakarta.xml.bind-api:2.3.2"
classpath "org.glassfish.jaxb:jaxb-xjc:2.3.2"
classpath"org.glassfish.jaxb:jaxb-core:2.3.0.1"
Run Code Online (Sandbox Code Playgroud)
[org.gradle.internal.operations.DefaultBuildOperationExecutor] 构建操作“解析 jaxb-runtime.jar (org.glassfish.jaxb:jaxb-runtime:2.3.2)”已完成
[org.gradle.internal.component.model.ComponentAttributeMatcher] 从候选者中选择匹配 org.glassfish.jaxb:jaxb-runtime:2.3.2 配置运行时 [org.glassfish.jaxb:jaxb-runtime:2.3.2 配置运行时] {org.gradle.dependency.bundling=外部,org.gradle.jvm.version=12,org.gradle.usage=java-runtime}
这是“gradle dependency”的输出,所有 JAXB jar 都在那里,但仍然抛出类路径错误。Glassfish 的 JAR 文件 jaxb-runtime 肯定有这个 ContextFactory 类。
runtimeClasspath - Runtime classpath of source …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试从 Java 8 项目迁移到 Java 12。(希望如此)最后一个障碍是我们被迫使用的旧 WebService。在 Java 8 中“按原样”使用 WebService 本身不是问题,它已经工作了很多年。
wsdl 指出:
<!--由Apache Axis 创建的WSDL 版本:1.4
建立于 2006 年 4 月 22 日 -->
据我所知,新版本的 WSDL2JAVA 不再支持这种类型的服务(因为它们依赖于 Axis 2):
WSDLToJava 错误:CXF 不支持 Rpc/编码的 wsdls
为了使此服务可用(使用 Java 8和12),我需要以下库:
<!-- https://mvnrepository.com/artifact/javax.xml.rpc/javax.xml.rpc-api -->
<dependency>
<groupId>javax.xml.rpc</groupId>
<artifactId>javax.xml.rpc-api</artifactId>
<version>1.1.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
这就是问题发生的地方。该库定义了部分包javax.xml,由于它是 Java 系统路径,因此不再允许使用。任何建议或解决方法?我忽略了什么吗?
编辑: ZhekaKozlov 关于不得不切换到雅加达是正确的。现在还剩下一个错误,因为Axis2,项目中也是需要的。
<!-- https://mvnrepository.com/artifact/org.apache.axis2/axis2-kernel -->
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-kernel</artifactId>
<version>1.7.9</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
将它添加到一个新的 Java 12 项目会使org.w3c.dom.*(例如 Document)无法使用。
EDIT2:我终于让一切正常。程序正在运行,代码中没有错误。不幸的是,我无法测试应用程序的 Axis 部分,因为它所连接的服务只能在我们客户端的环境中使用,因此必须对其进行测试。在axis2和axis2-adb上,我不得不排除两个库:
<exclusions>
<exclusion>
<groupId>org.apache.geronimo.specs</groupId> …Run Code Online (Sandbox Code Playgroud) java-12 ×10
java ×9
gradle ×2
axis ×1
benchmarking ×1
docker ×1
generics ×1
java-11 ×1
java-module ×1
javafx ×1
javax.xml ×1
jax-rpc ×1
jaxb ×1
jmh ×1
jvm-hotspot ×1
maven ×1
spring ×1
spring-boot ×1
swing ×1