我正在尝试使用Java9(JDK9)运行DMelt程序(http://jwork.org/dmelt/)程序,它给了我错误,例如:
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.python.core.PySystemState (file:/dmelt/jehep/lib/jython/jython.jar) to method java.io.Console.encoding()
WARNING: Please consider reporting this to the maintainers of org.python.core.PySystemState
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Run Code Online (Sandbox Code Playgroud)
我该如何解决?我试图将-illegal-access = permit添加到脚本"dmelt.sh"的最后一行(我在Linux中使用bash),但这并没有解决这个问题.我很沮丧.我经常使用这个程序很长一段时间.也许我永远不应该转向JDK9
使用JShell时,如何将其退回CMD线?
我已经尝试过ctrl+ x而且只是写作退出,但没有快乐.
从我们的发行说明了解到的Java 9是
应用程序类加载器不再是java.net.URLClassLoader的实例(在以前的版本中从未指定过的实现细节).假定ClassLoader :: getSytemClassLoader返回URLClassLoader对象的代码需要更新.
这会破坏旧代码,它会扫描类路径,如下所示:
Java <= 8
URL[] ressources = ((URLClassLoader) classLoader).getURLs();
Run Code Online (Sandbox Code Playgroud)
哪个遇到了
java.lang.ClassCastException:
java.base/jdk.internal.loader.ClassLoaders$AppClassLoader cannot be cast to
java.base/java.net.URLClassLoader
Run Code Online (Sandbox Code Playgroud)
因此,对于Java 9+,以下解决方法被提议作为Apache Ignite项目的PR,它在JVM运行时选项中进行调整时可以正常工作:--add-opens java.base/jdk.internal.loader=ALL-UNNAMED.但是,如下面的评论所述,这个PR从未合并到他们的主分支.
/*
* Java 9 + Bridge to obtain URLs from classpath...
*/
private static URL[] getURLs(ClassLoader classLoader) {
URL[] urls = new URL[0];
try {
//see https://github.com/apache/ignite/pull/2970
Class builtinClazzLoader = Class.forName("jdk.internal.loader.BuiltinClassLoader");
if (builtinClazzLoader != null) {
Field ucpField = builtinClazzLoader.getDeclaredField("ucp");
ucpField.setAccessible(true);
Object ucpObject = …Run Code Online (Sandbox Code Playgroud) 为什么以下条件返回trueJDK 8,而它返回falseJDK 9?
String[].class == Arrays.asList("a", "b").toArray().getClass()
Run Code Online (Sandbox Code Playgroud) 从Java 9会允许我们定义private和private static方法太接口,这将是在剩下的差异interface和class?而且,Java是否正在慢慢走向多重继承?
我的JDK 9 + 181 Spring Boot 2.0.0.BUILD-SNAPSHOT CLI应用程序在启动时显示此警告:
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.springframework.cglib.core.ReflectUtils$1 (jar:file:/home/jan/src/fm-cli/target/fm-cli-0.1.0-SNAPSHOT.jar!/BOOT-INF/lib/spring-core-5.0.0.RELEASE.jar!/) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of org.springframework.cglib.core.ReflectUtils$1
Run Code Online (Sandbox Code Playgroud)
这是一个控制台应用程序,所以我需要禁用此警告 - 我该怎么做?
注意:此问题询问如何禁用Spring触发此警告的具体问题; 它不是JDK9的副本:发生了非法的反射访问操作.org.python.core.PySystemState,用于处理不同库中的类似症状.
来自Jigsaw项目:
使开发人员能够更轻松地为Java SE和EE平台构建和维护库和大型应用程序.
我正在尝试学习Jigsaw是什么项目,到目前为止,Project Jigsaw的目标似乎与我们使用Maven(或Gradle)依赖关系管理所做的有些重叠:
我在这里看到很多线程比较并尝试回答哪个更快:newInstance或者new operator.
看看源代码,它看起来newInstance应该慢得多,我的意思是它做了很多安全检查并使用反射.而且我决定先测量一下jdk-8.这是使用的代码jmh.
@BenchmarkMode(value = { Mode.AverageTime, Mode.SingleShotTime })
@Warmup(iterations = 5, time = 2, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 5, time = 2, timeUnit = TimeUnit.SECONDS)
@State(Scope.Benchmark)
public class TestNewObject {
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder().include(TestNewObject.class.getSimpleName()).build();
new Runner(opt).run();
}
@Fork(1)
@Benchmark
public Something newOperator() {
return new Something();
}
@SuppressWarnings("deprecation")
@Fork(1)
@Benchmark
public Something newInstance() throws InstantiationException, IllegalAccessException {
return Something.class.newInstance(); …Run Code Online (Sandbox Code Playgroud) 开发人员仍然可以使用Java 9中的Java类路径为Java运行时搜索类和资源文件.只是使用Java 9的模块,开发人员不再需要类路径.
所以现在我的问题是:执行上面列出的任务的Java 9方法是什么?如何动态加载例如图像(缺少相对路径的摆弄)?
更有趣的是,如何检查一个类是否可用并动态做出决定(例如,检查Jackson是否可用,如果是,请将其用于JSON序列化,如果不使用别的东西)?
文章还提到Spring Boot已经支持Java 9,Spring Boot肯定会做很多动态加载.那么也许有人知道Spring可以看到的代码片段?
我对Java Web Start的状态感到困惑.在Oracle的支持路线图中,我们可以读到:
支持部署技术
Web部署技术由Java插件和Web Start技术组成,具有更短的支持生命周期.对于通过Java SE 8的主要版本,Oracle为这些技术提供了五(5)年的Premier支持.扩展支持不适用于部署堆栈,并且不可用于Java SE 9以外的支持.有关详细信息,请参阅Oracle Lifetime支持策略.
可以在2017年6月之后的任何时候删除Java SE 6和Java SE 7的部署技术. 虽然部署堆栈可能包含在Java SE 9或更高版本中,但Java SE 8是部署堆栈的推荐且仅受支持的版本.
现在,我们已经知道applet和Java插件将在未来的Java版本中被删除,但我从来没有读过有关Java Web Start是删除的候选者.
在Oracle的Java平台标准版部署指南#Java入口(Java 9文档页面)中,Java Web Start被宣传为已弃用的applet技术的替代方案:
虽然JDK 9中提供并支持,但Applet API和Java插件在未来版本中标记为已弃用,准备删除.applet和嵌入式JavaFX应用程序的替代方案包括Java Web Start和自包含应用程序.
我什么都不担心,或者我错过了关于Java Web Start弃用的公告?
java-9 ×10
java ×9
java-8 ×2
java-module ×2
java-platform-module-system ×2
spring-boot ×2
classloader ×1
jmh ×1
jshell ×1
maven ×1
performance ×1
spring ×1