jigsaw

Understanding how the main class affects JPMS

痞子三分冷 提交于 2020-07-06 11:05:53
问题 I have a very basic JavaFX application that works flawlessly if the Application class is not the Main class: import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.stage.Stage; public class Main { public static void main(String[] args) { Application.launch(App.class, args); } } public class App extends Application { @Override public void start(Stage primaryStage) { FXMLLoader loader = new FXMLLoader(); // works } } However, when I merge the two together (which is

Java: Is `sun.awt.image` package deprecated?

这一生的挚爱 提交于 2020-06-25 21:12:17
问题 I was wanting to use some codes that using sun.awt.image.PNGImageDecoder in my project. The problem is source code is based on Java 8 and my project using JDK 9+ (11). So I got this error: Package ' sun.awt.image ' is declared in module ' java.desktop ', which does not export it to the unnamed module . for import sun.awt.image.* , and: Symbol is declared in module ' java.desktop ' which does not export package ' sun.awt.image ' for using PNGImageDecoder or ImageDecoder etc. After some efforts

What's the magic behind ScalaFX to make OpenJDK 9+ actually work?

混江龙づ霸主 提交于 2020-06-24 22:18:46
问题 Environment : OpenJDK 64-Bit Server VM Zulu12.2+3-CA (build 12.0.1+12, mixed mode, sharing) Scala 2.12.7 Windows 10 Professional, X86_64 IntelliJ IDEA 2019.1.3 (Ultimate Edition) I checked out the scalafx-hello-world from GitHub, built and ran it in IntelliJ and it worked all fine. Here quickly the significant application implementation: package hello import scalafx.application.JFXApp import scalafx.application.JFXApp.PrimaryStage import scalafx.geometry.Insets import scalafx.scene.Scene

JVM虚拟机-Class文件之常量池

﹥>﹥吖頭↗ 提交于 2020-05-03 18:17:55
一、常量池的作用 在class文件中的魔数、副版本号、主版本之后,紧接着就是常量池的数据区域了,如下图用红线包括的位置: 常量池可以比喻为Class文件里的资源仓库,它是Class 文件结构中与其他项目关联最多的数据,通常也是占用Class文件空间最大的数据项目之一,另外,它还是在Class文件中第一个出现的表类型数据项目。 二、常量池的结构 常量池的结构比较简单,前面的两个字节叫做 常量池计数器 ( constant_pool_count ),它记录了 常量池项(cp_info) 的个数。后面紧接着就是 constant_pool_count-1 个 常量池项(cp_info) 。这跟报文通信协议比较类似,首先定义报文的大小,接着就是对应大小的报文内容。 由于常量池中常量的数量是不固定的,所以在常量池的入口需要放置一项u2类型的数据,代表常量池容量计数值(constant_pool_count)。与Java中语言习惯不同,这个容量计数是从1而不是0开始的,如上图所示,常量池容量(偏移地址:0x00000008)为十六进制数0x0021,即十进制的33,这就代表常量池中有33项常量,索引值范围为1~33。在Class文件格式规范制定之时,设计者将第0项常量空出来是有特殊考虑的,这样做的目的在于,如果后面某些指向常量池的索引值的数据在特定情况下需要表达“不引用任何一个常量池项目

JDK 11 + JUnit 5 + Jigsaw: Junit fails to run tests for `module-info`

☆樱花仙子☆ 提交于 2020-03-22 06:41:06
问题 I try to use JUnit 5 in a Gradle project. compileJava and compileTestJava both succeed, but test fails with the strange message Could not execute test class 'module-info'. (message from stacktrace): > Task :test FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':test'. > There were failing tests. See the report at: file:///Users/axel/git/utility/build/reports/tests/test/index.html The test result file hints me that " failed to execute tests ", but

类加载机制,双亲委派模型(2)

折月煮酒 提交于 2020-02-28 22:22:32
接着昨天的记录,今天继续开始了。 在JDK9中,由于Jigsaw项目引入了Java平台模块化系统(JPMS),Java SE的源代码被划分为一系列模块。 类加载器,类文件容器等都发生了非常大的变化,API已经被划分到具体的模块中,所以上文中,利用“——Xbootclasspath/p” 替换某个Java核心类型代码,实际上变成了对对应的模块进行的修补,可以采用下面的解决方案: 首先,确认要修改的类文件已经编译好,并按照对应模块结构存放,然后,给模块打补丁: java --patch-module java.base=your_pathch yourApp 拓展类加载器将被重命名为平台类加载器(Platform Class-Loader),而且extension机制规则被移除。也就意味着,如果我们指定Java.ext.dirs环境变量,或者lib/ext目录存在,JVM将直接返回错误!建议解决方法就是将其放入classpath里。 部分不需要AllPermission的Java基础模块,被降级到平台类加载器中,相应的权限粒度也被更精细粒度地限制起来。 rt.jar和tools.jar同样是被移除了!JDK的核心类库以及相关资源,被存储在jimage文件中,并通过新的JRT文件系统访问,二不是原有的JAR文件系统。虽然看起来很惊人,但幸好对于大部分软件的兼容性影响,其实是有限的

IDEA报错信息 Error:java:无效的源发行版:12 解决方法

岁酱吖の 提交于 2020-02-27 03:13:18
最近打开了一个很久之前的EE项目,运行的时候报错 Information:java: Errors occurred while compiling module 'xxx' Information:javac 1.8.0_201 was used to compile java sources Information:Module "xxx" was fully rebuilt due to project configuration/dependencies changes Information:2020/2/13 18:32 - Build completed with 1 error and 0 warnings in 3 s 688 ms 大概意思就是说 因项目配置/依赖项更改而完全重建,出了问题 解决方法如下 1. ctrl+alt+shift+s 打开project structure 2.修改project language level 等级为8 即可解决 之后查了下project language level是干啥的 https://www.cnblogs.com/signheart/p/4d2058ae687f9a29680c070de85f7fbe.html language level 介绍 其他 IDE 没有看到类似 language level 的设置

Java8,java9和java11的特性与区别!

爱⌒轻易说出口 提交于 2020-02-26 05:02:30
Java8,java9和java11的特性总结! Java 8 的主要新特性 1. Lambda 表达式 Lambda 允许把函数作为一个方法的参数传递进方法中。 作用:解决 Java 被诟病的匿名内部类的问题。 2. 接口中可增加了默认方法 作用:在接口中也可以有实现方法了。 3. HashMap 底层数据结构的变化 java 8 之前,HashMap 底层的数据结构是数组+链表实现的, Java 8 之后是数组+链表+红黑树实现的,当链表的长度超过 8 之后,会转换成红黑树。 作用:解决因哈希冲突导致的链表过长,查询效率低的问题。 4. Stream API 新添加 Stream API (java.util.stream),把真正函数式编程的风格引入 Java。 5. 提供一个新的 JavaScript 引擎 Java 8 提供了一个新的 Nashorn JavaScript 引擎,它允许在 JVM 上运行特定的 JavaScript 应用。 作用:解决日益增长的 Java 跟 JS 交互混合的需求。 Java 9 新特性 1. 模块系统 模块是一个包的容器,Java 9 最大的变化之一是引入模块系统。(Jigsaw 项目) 作用:解决大型项目模块化开发的需求。 2. 支持 HTTP/2 标准 HTTP/2 标准是 HTTP 协议的最新版本,新的 HTTPClient API

How is Java 8 modules different from OSGi?

南笙酒味 提交于 2020-01-22 10:32:46
问题 Java 8 with Project Jigsaw brings a module system to the SDK. I see it as a good thing as it's part of the package (built-in). OSGi also provides a module system, but requires a container. But apart from that what are the major difference among them. If I use OSGi, will I able to run it using the standard JDK 8 release? Will OSGi relevant when the default SDK includes such capabilities? My understanding is that both OSGi and Jigsaw can be used to write normal modular Java applications and not

Patching java.base results in java.lang.LinkageError

流过昼夜 提交于 2020-01-13 11:09:09
问题 I am trying to do the same thing in Java 11 that could be done with -Xbootclasspath/p:path in pre java 9. As a simple example I modified one of the valueOf methods of java.lang.Integer and compiled the project with: javac --module-source-path=src/java.base --patch-module java.base=src/java.base -d mods $(find src -name '*.java') I then ran a simple sample using: java --patch-module java.base=<pathToMyModifiedJavaBaseClasses> -p lib -m my.moduleA/my.moduleA.Main That worked an I'm seeing the