我正在尝试将我们的一个系统从 java 8 移动到 java 9,并且大约三分之一在 java 8 中正常工作的单元测试失败并出现以下错误:
java.io.IOException: Can not attach to current VM
Run Code Online (Sandbox Code Playgroud)
Google 带我看了几页,我很快就明白在 Java 9 中,默认行为已更改,以防止附加到当前 VM 并返回到您需要将系统属性设置jdk.attach.allowAttachSelf为 true的旧方式。
在 IntelliJ 中设置时,测试工作正常。更改 build.gradle 以包含此内容时,同样有效:
test {
jvmArgs '-Djdk.attach.allowAttachSelf=true'
}
Run Code Online (Sandbox Code Playgroud)
但是,我更喜欢全局设置此设置,因此我不需要破解我的 build.gradle 和 IntelliJ。
我在 ubuntu 上运行 java 9 并更改/etc/profile.d/jdk.sh为包含以下内容:
export JDK_JAVA_OPTIONS="-Djdk.attach.allowAttachSelf=true"
Run Code Online (Sandbox Code Playgroud)
当运行我的 Gradle 构建时,我可以看到设置被拾取,因为我在构建输出中低于:
NOTE: Picked up JDK_JAVA_OPTIONS: -Djdk.attach.allowAttachSelf=true
Run Code Online (Sandbox Code Playgroud)
但是,测试不断失败,并出现相同的 IOException。
那么我做错了什么,我该如何解决?
预先感谢您的意见。
在Java 9中,Flow API取代了Observer和Observable吗?如果不是,那该怎么办?
在我配置Eclipse Oxygen以使用Java 9之后,当我转到Source => Generate时,toString()我收到以下错误消息:
无法创建方法实现.
原因:模块:java.base不在其项目的构建路径上
生成constructor,getter和setter,hashcode()并且equals()工作正常,只有toString()不起作用.
如果我toString()手动输入方法,它可以正常工作.此外,如果我使用JRE 8创建项目,生成toString()工作正常.任何想法如何解决它?
需求和需要模块声明中的静态模块语句有什么区别?
例如:
module bar {
requires java.compiler;
requires static java.base;
}
Run Code Online (Sandbox Code Playgroud) 我在Linux机器上使用jlink创建了运行时映像.我linux在include文件夹下看到了文件夹.这是否意味着我只能将此运行时映像用于Linux平台?如果是,有没有办法在一个平台上为另一个平台创建运行时映像(例如在Linux for Windows上,反之亦然)
用Java编写的-9是运行下面的代码给了我一个非常奇怪和有趣的异常运行时:
Exception in thread "main" java.lang.NoSuchFieldError: super
at A$C.test(A.java:15)
at A.main(A.java:5)
Run Code Online (Sandbox Code Playgroud)
代码:
public class A {
public static void main(String[] args) {
new C().test();
}
interface B {
private void test() {
}
}
static class C implements B {
void test() {
B.super.test();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道:它是这样设计的,还是理想情况下这个代码不应该被编译,因此这是一个编译器错误?(我个人认为这是一个错误).
UPD:提交了一个错误,ID:9052188
UPD-2:它看起来B.super.test()通常是一个有效的结构,因为如果test()方法default比它工作正常.这个事实让事情变得更加复杂.
使用start.spring.io初始化项目
添加了WEB,JPA,H2依赖项,然后尝试运行MainApplication.java使用Jdk 9并获得以下错误日志
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.5.10.RELEASE)
2018-02-26 16:23:33.973 INFO …Run Code Online (Sandbox Code Playgroud) 刚刚开始玩jdk9 - 并且刚刚开始时卡住了:
此时,我可以使用jre/jdk(在eclipse.ini中使用/ out vm参数)在我的默认java(8u60)上运行eclipse并使用java 9支持.
下一步,我想用java 9运行eclipse:将vm-arg添加到eclipse.ini,现在eclipse使用冗长的错误日志中止其启动(ini和log都显示在下面).
哪里出了问题?
我的ini:
-startup
plugins/org.eclipse.equinox.launcher_1.3.200.v20151021-1308.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.300.v20151013-1129
-product
org.eclipse.epp.package.java.product
--launcher.defaultAction
openFile
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
--launcher.defaultAction
openFile
--launcher.appendVmargs
-vm
d:\java\jdk\190_ea\bin\javaw.exe
-vmargs
-Dosgi.requiredJavaVersion=1.8
-Xms256m
-Xmx1024m
Run Code Online (Sandbox Code Playgroud)
错误日志的顶部(它> 900k)
!SESSION 2016-01-22 14:31:55.974 -----------------------------------------------
eclipse.buildId=4.6.0.I20151209-2300
java.version=9-ea
java.vendor=Oracle Corporation
BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=de_DE
Framework arguments: -product org.eclipse.epp.package.java.product
Command-line arguments: -os win32 -ws win32 -arch x86 -product org.eclipse.epp.package.java.product
!ENTRY org.eclipse.equinox.common 4 0 2016-01-22 14:31:57.113
!MESSAGE FrameworkEvent ERROR
!STACK 0 …Run Code Online (Sandbox Code Playgroud) 这个问题现在已经超过3年了,并且专门针对Java 8,接受的答案也引用了Java SE 8最终规范.
如果在Java 9中有关于这个问题的内容会发生变化,我会感兴趣:有没有办法注释类似于注释相应匿名类的lambda表达式?
例:
注解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
public @interface MyTypeAnnotation {
public String value();
}
Run Code Online (Sandbox Code Playgroud)
匿名类的工作注释:
Consumer<String> consumer = new @MyTypeAnnotation("Hello ") Consumer<String>() {
@Override
public void accept(String str) {
System.out.println(str);
}
};
Run Code Online (Sandbox Code Playgroud)
注释lamba表达式,目前在Java 8中不起作用:
Consumer<String> myAnnotatedConsumer = @MyTypeAnnotation("Hello") (p -> System.out.println(p));
Run Code Online (Sandbox Code Playgroud) Map.of()和Collections.emptyMap()之间List.of(),Collections.emptyList()和之间Set.of()和之间是否存在差异Collections.emptySet()?
java-9 ×10
java ×8
eclipse ×2
java-module ×2
annotations ×1
collections ×1
eclipse-neon ×1
java-platform-module-system ×1
javac ×1
jlink ×1
lambda ×1
module-info ×1
spring ×1
spring-boot ×1
tostring ×1