Heyo!
尝试使用JDK 10.0.1和"spring-boot-starter-test"启动Intellij(终极版)时,我遇到了一些麻烦.如果我运行main方法,无论其内容如何,无论我是否有任何活动测试,我总是在编译之后收到"Error:java:java.lang.ExceptionInInitializerError",之后运行.
总结一下,这会导致错误
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
现在我假设这与Spring引导测试与JDK 10不兼容有关,虽然我很容易问,任何想法如何解决这个问题?
更新2 要清楚,这是我从Intellij收到的唯一输出
Information:javac 10.0.1 was used to compile java sources
Information:2018-05-14 21:04 - Compilation completed with 1 error and 0 warnings in 2 s 381 ms
Error:java: java.lang.ExceptionInInitializerError
Run Code Online (Sandbox Code Playgroud)
这里构建,版本和依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>10</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional> …Run Code Online (Sandbox Code Playgroud) 一个人如何避免明确地Exception试图从一个Optional或同时使用中获取价值Optional.get?
目前,API可能会受到以下保护orElseThrow:
// exception could be replaced with any other
Integer opt = anyOddInStream.orElseThrow(
() -> new NoSuchElementException("No value present"));
Run Code Online (Sandbox Code Playgroud)
然而,get当试图访问类似的东西时,直接实现令人失望(当一个人可能不愿意显式抛出异常时)
// the following not only just fails but throws an exception as well
Integer previous = anyOddInStream.get();
Run Code Online (Sandbox Code Playgroud)
如果一个人想要确保其中Optional一个有值,如果没有,他们不想继续null向前传播怎么办?
当a ProgressBar是不确定的时,它有一个来回的动画.这ProgressBar是正常的Stage一部分时工作正常但是当部分时不起作用Dialog.相反,它似乎只是坐在动画的开头.该ProgressBar确实,但是,适当的时候设置为某个确定的值更新.注意:该问题未出现在Java 8中.
没有任何例外情况的迹象.
这是一个MCVE(它的GIF):
import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Dialog;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressBar;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class App extends Application {
@Override
public void start(Stage primaryStage) {
Button detButton = new Button("Launch Determinate Task");
detButton.setOnAction(ae -> {
ae.consume();
createDialog(primaryStage, true)
.showAndWait();
});
Button indetButton = new Button("Launch …Run Code Online (Sandbox Code Playgroud) 有没有人知道是否有一个版本的Java 10和JVM 10规范与前一版本的差异可用?对于Java 8和Java 9,存在diff的规范,否则很难看到究竟发生了什么变化.
Java Native Interface(JNI)的一个组成部分是通过C头桥接JVM代码和本机代码.生成这些头文件的方法过去非常简单:只需javah在类文件上调用命令行实用程序即可.然后,此过程将为使用native修饰符标记的任何方法生成原型.
但是,从Java 10开始,该javah实用程序已被删除,其建议的替换是javac的新标志"-h".如果有可用的Java源文件,则替换可以正常工作,但是只有编译的类文件可用时才会出现问题.(引发这个问题的问题是我正在尝试从Scala源生成JNI绑定.我当前的方法是首先编译它们然后在生成的类文件上运行javah.)
在只有编译的类文件可用的情况下,有没有办法生成C头文件,类似于以往的方式javah?
据我所知,没有任何计划从oracle运送java for 32 Bit - 但也许我误解了这种情况.如果我是对的 - 如果我们需要支持32位库(dll),我们都会怎么做?什么是32位操作系统?目前这似乎是对未来的巨大影响,但正如我所说 - 也许我错了.事实是我们无法下载32位的Java 10运行时,因为只有64位下载链接.
自从升级到install4j 7.0.5和Java 10以来,在Windows上运行我们的应用程序的用户越来越频繁地报告应用程序抛出
java.lang.NoSuchMethodError: <init>
at javafx.graphics/com.sun.glass.ui.win.WinApplication.staticScreen_getScreens(Native Method)
at javafx.graphics/com.sun.glass.ui.Screen.initScreens(Unknown Source)
at javafx.graphics/com.sun.glass.ui.Application.lambda$run$1(Unknown Source)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
UiLauncher (WAITING)
at java.base@10.0.1/jdk.internal.misc.Unsafe.park(Native Method)
at java.base@10.0.1/java.util.concurrent.locks.LockSupport.park(Unknown Source)
at java.base@10.0.1/java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(Unknown Source)
at java.base@10.0.1/java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(Unknown Source)
at java.base@10.0.1/java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(Unknown Source)
at java.base@10.0.1/java.util.concurrent.CountDownLatch.await(Unknown Source)
at platform/javafx.graphics@10.0.1/com.sun.javafx.tk.quantum.QuantumToolkit.startup(Unknown Source)
at platform/javafx.graphics@10.0.1/com.sun.javafx.application.PlatformImpl.startup(Unknown Source)
at platform/javafx.graphics@10.0.1/com.sun.javafx.application.PlatformImpl.startup(Unknown Source)
at platform/javafx.swing@10.0.1/javafx.embed.swing.JFXPanel.initFx(Unknown Source)
at platform/javafx.swing@10.0.1/javafx.embed.swing.JFXPanel.<init>(Unknown Source)
at java.base@10.0.1/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base@10.0.1/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at java.base@10.0.1/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.base@10.0.1/java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.base@10.0.1/java.lang.Class.newInstance(Unknown Source)
at app//...
Run Code Online (Sandbox Code Playgroud)
通过install4j创建exe文件启动应用程序时.通过反射创建javafx.embed.swing.JFXPanel实例来触发错误:
Class.forName("javafx.embed.swing.JFXPanel").newInstance();
Run Code Online (Sandbox Code Playgroud)
我们目前怀疑由于某种原因加载了不兼容的DLL(glass.dll似乎包含stacktrace中提到的本机方法).
有谁知道如何防止这个错误?例如,是否有办法将通过install4j生成的exe执行应用程序时使用的java.library.path限制为嵌入在安装程序中并随应用程序本地安装的Java运行时环境?根据一个用户,如果使用"手动"启动应用程序,则不会发生错误
java …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用JDK 9构建项目,因为使用--releasejavac 的参数意味着它可以为旧版本构建而无需安装相应的JDK/JRE.我需要支持Java 6,因此我先前存在的设置需要Java 6用于bootstrapClasspath,而另一个JDK 8或9用于gradle和IDE.我想取消JDK 6而仅使用9,并稍微整理一下构建.
我的新build.gradle具有以下配置:
tasks.withType(JavaCompile) {
options.compilerArgs.addAll(['--release', '6', "-Xlint"])
}
Run Code Online (Sandbox Code Playgroud)
的sourceCompatibility,targetCompatibility和bootstrapClasspath选项都没有设置,我的理解的--release说法,现在处理这个问题.
我收到以下警告:
warning: [options] source value 1.6 is obsolete and will be removed in a future release
warning: [options] target value 1.6 is obsolete and will be removed in a future release
warning: [options] To suppress warnings about obsolete options, use -Xlint:-options.
Run Code Online (Sandbox Code Playgroud)
我知道这些可以被抑制(它说就在那里),但我没想到会看到它们.当使用--release [7-9]这些警告构建时不存在.
对于上下文,这是旧的(现在未使用)'2x JDK'配置:
sourceCompatibility = "1.6"
targetCompatibility = "1.6"
tasks.withType(JavaCompile) { …Run Code Online (Sandbox Code Playgroud) 出于某种原因,我们使用com.sun.java.swing.plaf.windows.WindowsComboBoxUI在 Java 5.0 到 Java 8.0 的 Windows/Linux/Mac OS 平台上工作的类
从 Java 10 和 Java 11 开始(我们将坚持它作为 LTS)这个类对类加载器不可见:
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/java/swing/plaf/windows/WindowsComboBoxUI
at xxx.YYY.main(Unknown Source)
Caused by: java.lang.ClassNotFoundException: com.sun.java.swing.plaf.windows.WindowsComboBoxUI
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 1 more
Run Code Online (Sandbox Code Playgroud)
我们怎样才能让它工作?
在回答这个关于捕获局部变量的 lambda 的问题时,我定义了一个简单的 lambda 来捕获一个局部变量,并表明 lambda 有一个包含该变量值的字段。根据各种来源(例如此处、此处),当 lambda 捕获局部变量时,其值存储在“合成”字段中。Java 虚拟机规范(第4.7.8 节)似乎暗示了这一点,其中说:
未出现在源代码中的类成员必须使用 Synthetic 属性进行标记,否则必须设置其 ACC_SYNTHETIC 标志。此要求的唯一例外是编译器生成的方法,它们不被视为实现工件,即表示 Java 编程语言的默认构造函数的实例初始化方法(第 2.9.1 节)、类或接口初始化方法(第 2.9.2 节) ),以及 Enum.values() 和 Enum.valueOf() 方法。
lambda 的字段不是定义的异常之一,并且 lambda 的字段未在源代码中声明,因此根据我的理解,该字段应该是根据此规则合成的。
通过反射可以很容易地证明场的存在。但是,当我使用该Field.isSynthetic方法进行检查时,它实际上返回false. 这种方法的文档说:
如果此字段是合成字段,则返回 true;否则返回 false。
我正在 Java 10.0.1 中使用 JShell 进行测试:
> class A { static Runnable a(int x) { return () -> System.out.println(x); } }
| created class A
> Runnable r …Run Code Online (Sandbox Code Playgroud)