Map.of()和Collections.emptyMap()之间List.of(),Collections.emptyList()和之间Set.of()和之间是否存在差异Collections.emptySet()?
我对Gradle(和Java 9,说实话)相当新,我正在尝试使用Gradle构建一个简单的库项目,它是Java 9和Kotlin的混合体.更详细的说,Java中有一个接口,Kotlin中有一个实现; 我会在Kotlin做一切,但modules-info.java无论如何都是java,所以我决定这样做.
我正在构建IntelliJ Idea,外部定义了1.2.0 kotlin插件和gradle 4.3.1.
文件系统架构是:
+ src
+ main
+ java
+ some.package
- Roundabout.java [an interface]
- module-info.java
+ kotlin
+ some.package.impl
- RoundaboutImpl.kt [implementing the interface]
Run Code Online (Sandbox Code Playgroud)
module-info.java 是:
module some.package {
requires kotlin.stdlib;
exports some.package;
}
Run Code Online (Sandbox Code Playgroud)
并build.gradle是:
buildscript {
ext.kotlin_version = '1.2.0'
repositories {
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
group 'some.package'
version '1.0-PRE_ALPHA'
apply plugin: 'java-library'
apply plugin: 'kotlin'
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
sourceCompatibility = …Run Code Online (Sandbox Code Playgroud) 我用Java:
Java(TM) SE Runtime Environment (build 9-ea+143) Java HotSpot(TM) 64-
Bit Server VM (build 9-ea+143, mixed mode)
Run Code Online (Sandbox Code Playgroud)
和IntelliJ IDEA:
IntelliJ IDEA 2016.2.5 Build #IU-162.2228.15, built on October 14,
2016
Run Code Online (Sandbox Code Playgroud)
编译时出错:
Error:java: invalid flag: -release
Run Code Online (Sandbox Code Playgroud)
执行javac -help:
--release <release>
Compile for a specific VM version. Supported targets: 6, 7, 8, 9
Run Code Online (Sandbox Code Playgroud)
所以javac应该使用两个连字符和释放,但Intellij Idea使用一个.
我可以覆盖javacIDEA使用的选项或以某种方式修复它吗?
UPD:甚至构建,执行,部署>编译器> Java编译器附加命令行参数在这种情况下没有帮助
我正在尝试使用Eclipse Oxygen IDE测试JDK9(jdk-9-ea + 147版本).
我已经安装了jdk和jre.来自Eclipse Market Place我已经安装了Java9 Beta扩展:
问题是,当我尝试从Eclipse添加新安装的jre时,我收到以下错误:
有趣的是,以前的JDK版本的安装不会发生此错误:
是否有人遇到Eclipse Oxygen的simillar问题?任何反馈都表示赞赏.
我有关于netbeans的hdpi问题,当我打开它时图标变得太小了.然后我发现了下面的问题.有人说jdk9修复了分辨率问题.
https://netbeans.org/bugzilla/show_bug.cgi?id=252452
这是我的环境:
我在windows10上下载了jdk9和netbeans8.2,希望JDK9可以修复烦人的资源问题.不幸的是,我无法打开netbeans.
我在cmd中输入后.
netbeans.exe --jdkhome "C:\Program Files\Java\jdk-9"
控制台显示错误.
No way to find original stream handler for jar protocol
java.lang.reflect.InaccessibleObjectException: Unable to make field transient java.net.URLStreamHandler java.net.URL.handler accessible: module java.base does not "opens java.net" to unnamed module @4973813a
at java.base/jdk.internal.reflect.Reflection.throwInaccessibleObjectException(Reflection.java:427)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:201)
at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:171)
at java.base/java.lang.reflect.Field.setAccessible(Field.java:165)
at org.netbeans.ProxyURLStreamHandlerFactory.register(ProxyURLStreamHandlerFactory.java:82)
at org.netbeans.JarClassLoader.(JarClassLoader.java:141)
at org.netbeans.MainImpl.execute(MainImpl.java:178)
at org.netbeans.MainImpl.main(MainImpl.java:85)
at org.netbeans.Main.main(Main.java:83)
Run Code Online (Sandbox Code Playgroud)
有谁知道如何在Netbeans中使用jdk9?
我目前正在测试使用jdk-9 + 149将Java 8应用程序迁移到Java 9/Jigsaw.
该项目已在标准的Maven目录结构进行布局,即具有src/main/java,src/test/java等等.
当我添加module-info.java到src/main/java,Maven的编译器插件无法抛出一个NullPointerException.这是因为它希望找到test目录的模块信息.所以,据我所知,选项是:
显然,这些选项似乎都不合适,所以我假设有一种在Maven项目中测试Jigsaw模块的推荐方法.不幸的是,我既没有找到建议也没有例子.
编辑:在发布问题时添加一些我不相关的信息(对不起)
migration unit-testing maven java-platform-module-system java-9
由于catalina.sh中的默认"java.endorsed.dirs"选项,因此无法使用java 9启动基于tomcat的应用程序.
-Djava.endorsed.dirs=/usr/local/share/tomcat/endorsed is not supported. Endorsed standards and standalone APIs in modular form will be supported via the concept of upgradeable modules.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
Run Code Online (Sandbox Code Playgroud)
有没有解决这个问题?
我在Java 8(1.8.0_77)和Java 9(Java HotSpot(TM)64位服务器VM(构建9 + 181,混合模式)中尝试了一些代码)
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("eee", Locale.GERMAN);
DayOfWeek mo = dtf.parse("Mo", DayOfWeek::from);
System.out.println("mo = " + mo);
Run Code Online (Sandbox Code Playgroud)
我不太熟悉这些类的细节,但在Java 8中这个工作,打印:
mo =星期一
在Java 9中,它失败了
线程"main"中的异常java.time.format.DateTimeParseException:无法在java.base上的java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1988)的索引0处解析文本"Mo"在day.main(day.java:10)的/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1890)
任何想法,这是可重现的吗?
因此,在格式化时:使用此代码:
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("eee", Locale.GERMAN);
String format = dtf.format(DayOfWeek.MONDAY);
System.out.println("format = " + format);
Run Code Online (Sandbox Code Playgroud)
jdk1.8.0-77:
格式= Mo.
jdk-9(build 9 + 181)
格式= Mo.
到目前为止,直到非模块化的java,你只需要放入一个文件,src/main/java/resources确保它在classpath中,然后加载它
file = getClass().getClassLoader().getResourceAsStream("myfilename");
Run Code Online (Sandbox Code Playgroud)
来自类路径中的任何位置.
现在有了模块,情节变浓了.
我的项目设置如下:
module playground.api {
requires java.base;
requires java.logging;
requires framework.core;
}
Run Code Online (Sandbox Code Playgroud)
配置文件放在里面src/main/resources/config.yml.
项目运行
java -p target/classes:target/dependency -m framework.core/com.framework.Main
Run Code Online (Sandbox Code Playgroud)
由于主类不在我自己的项目中,而是在外部框架模块中,因此无法看到config.yml.现在的问题是,有没有办法以某种方式将我的配置文件放入模块或打开它?我是否必须更改框架上游加载文件的方式?
我尝试在module-info中使用"exports"或"opens",但它想要一个包名,而不是文件夹名.
如何以最佳实用的方式实现这一点,以便它可以像Java 8一样工作,并尽可能少地进行更改?
我有一个Java 9应用程序,我正在尝试为Windows应用商店打包.奇怪的是,当我直接运行exe-launcher时,它按预期工作,但是当我通过APPX包运行启动器时,我得到以下奇怪的错误:
Exception in thread "Swing-Shell" java.lang.InternalError: Could not
initialize COM: HRESULT=0x80010106
at java.desktop/sun.awt.shell.Win32ShellFolderManager2.initializeCom(Native Method)
at java.desktop/sun.awt.shell.Win32ShellFolderManager2$ComInvoker$1.run(Unknown Source at java.base/java.lang.Thread.run(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
HRESULT=0x80010106意味着RPC_E_CHANGED_MODE我猜意味着COM以某种方式已经在MTA模式初始化.但为什么这只是Windows Bridge沙箱中的一个问题?pre-initialize出于某种原因,Windows桥以某种方式某种程度上是COM吗?
我不确定这是Java 9问题,还是Desktop Bridge问题,或两者兼而有之.有没有人对如何确定问题的原因或解决方法有任何想法?
我已经制作了一个最小的示例项目来重现该问题
应用程序在直接执行时有效,但在通过APPX启动程序执行时无效.为什么?