问题标签 [java-9]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java 9 中的新关键字
Java 9 最大的特性之一将是由 Project Jigsaw 定义的模块系统。在阅读Project Jigsaw: Under the Hood at JavaOne 2015 的幻灯片时,我注意到以下源代码:
对我来说有趣的是该文件以.java
并且似乎使用了两个新关键字结尾:module
和exports
. Java 9 中还会引入哪些其他关键字?如何处理向后兼容性(即名为 的函数或变量module
)?
java - Java 9:将自定义模块化运行时映像与第三方插件系统相结合
根据 Mark Reinhold 的推特帖子,我将假设 Jigsaw 将成为 Java 9 的一部分。
在阅读 Jigsaw 时,我问自己一个问题:当我使用自定义模块化运行时映像发布我的应用程序时会发生什么,但是第三方模块需要额外的 JRE 模块,这些模块没有随应用程序一起发布,因为它们不是应用程序?
想象一个想要从模块化中受益的应用程序。它提供了一个可以由第三方模块实现的服务接口。应用程序在启动时加载所有提供服务接口实现的第三方模块。在我看来,这是为第三方插件提供公共 API 的一种非常简单的方法,我可以想象自己经常使用它。
现在,还有一个名为的工具jlink
,它允许创建一个应用程序的版本,该版本不仅包含应用程序模块,还包含所需的 JRE 模块。这称为自定义模块化运行时映像。很棒的是,该版本仅包含应用程序实际使用的 JRE 模块,这可以防止版本变得非常大。目前,jlink
将确定哪些模块必须自己包含在内。但是,开发人员必须明确包含提供服务实现的模块,请参见此处。我认为这对于开发人员不想要求用户安装 JRE 的许多应用程序也非常有用。
当我们尝试在单个应用程序中同时使用两者时会出现问题:自定义模块化运行时映像仅包含应用程序使用的 JRE 模块。但是,插件可能使用应用程序未使用的 JRE 模块,因此这些模块在运行时不可用。因此,该插件将不起作用。
这是我能想到的唯一解决方案,但它远非完美:
将缺少的 JRE 模块包含到第三方插件中。虽然起初这似乎是一个简单的解决方案,但它实际上带来了很多问题。
首先,这需要插件开发人员知道应用程序中包含哪些 JRE 模块。如果这是未知的,它们可能包含应用程序本身已经可用的 JRE 模块,这可能会导致问题。因此,应用程序使用哪些模块成为公共 API 的一部分。我认为这是不可取的,因为它是一个实现细节。此外,它可能会经常更改。
其次,由于可用的 JRE 模块是公共 API 的一部分,因此需要以某种方式指定它们。虽然这可能通过文档起作用,但我认为它应该通过正式代码指定。例如,requires public
在应用程序模块中为插件模块应该可用的所有 JRE 模块使用一个子句可能会起作用。这使得这些 JRE 模块可用于插件,因为插件将require
成为应用程序模块。
第三,问题出现了是否允许插件使用额外的 JRE 模块。如果不是,则可能应该有一个子句module-info.java
来指定当前模块是给定其他模块的插件。例如,不是使用require
应用程序模块,而是使用plugs in to
或另一种表示法。这将阻止模块需要任何 JRE 模块。但是,这可能行不通,因为插件模块所需的其他第三方模块可能需要额外的 JRE 模块。因此,我认为很难为这样的机制提供支持。
第四,允许插件使用额外的 JRE 模块也很困难。这将要求不同的 JRE 模块在不同的版本中兼容,或者插件开发人员始终将附加的 JRE 模块包含在与应用程序中 JRE 模块的版本兼容的版本中。我不确定 JRE 模块是否应该在不同版本中兼容,但我的假设是它们不应该兼容,因为它会阻止未来的许多变化。
我的一些假设是错误的吗?也许在应用程序和插件中包含一个 JRE 模块就可以了?也许插件中的附加 JRE 模块也不必与应用程序中的 JRE 模块兼容?毕竟,他们可能不会相互交流。
我们应该如何处理这个架构问题?是否有其他具有模块化和部分可发布运行时的语言?他们是如何解决问题的?
请注意,Google guava 或 Apache commons 等常用库可能会出现类似问题。但是,这个问题应该主要是关于使用自定义模块化运行时映像所产生的问题。
java - 在 jshell 中查看类路径
JShell 是 Java 的 REPL。要使用默认 JRE 之外的其他类,它包含一个/classpath
命令,用于将路径添加到当前类路径。
但是有没有办法在 JShell 环境中查看当前的类路径?
请注意,我使用的是以下早期版本:
java - 是否可以使用 Jigsaw 在 Java 9 中通过反射来访问包范围内的方法?
我有以下代码URLStreamHandlers
通过访问静态包作用域方法来检索在 Java 8 中工作的 http 和 https的默认值URL.getURLStreamHandler()
:
这在 Java 9 中是否仍然可以使用jigsaw或禁止以这种方式修改可见性?
java - jdk 9b112 上的 javassist 问题
我正在将一个项目迁移到 java 9,它也使用 javassist 生成运行时代码。我的一项测试在 jdk 9b112 上失败,而在 jdk 8u77 上通过。
在 jdk 8u77 上,该compile()
函数成功返回,并且“Hello world”被打印到控制台。在 jdk 9b112 上,我得到了这个异常
我在互联网上搜索过这个问题,即使在 javassist 的错误跟踪器中也没有发现相关问题。
maven - Maven 准备好迎接 JDK9 了吗?
今天尝试了最新的jdk9 Build 113,尝试用最新的Maven 3.3.9编译我的项目
这些是命令(部分通过 twitter找到)
但我得到这个错误......简而言之:
用于 JDK9 的正确 Maven 配置或参数是什么?
java - Android Studio 无法启动,无法创建 JVM
我正在尝试启动我的 Android Studio v2.0,但它不会启动。我收到此错误:无法创建 JVM:错误代码 -6。
JVM path
:C:\Program Files\Java\jdk-9
如果您已经安装了 64 位 JDK,请JAVA_HOME
在
计算机 > 系统属性 > 系统设置 > 环境变量。
我已将JAVA_HOME
变量设置为C:\Program Files\Java\jdk-9
我怎样才能让它开始/工作?
java - 如何清除 Java 9 JShell 控制台?
我没有找到任何清除 Java-9 JShell 控制台的命令。我也尝试通过这个程序清除 JShell 控制台,但它也不起作用。
我认为我们在早期访问中还没有该功能。有人有想法吗?
java - JDK9上的“包java.net.http不存在”错误
我在从 HttpRequest JavaDoc 编译简单的阻塞 GET 示例时遇到问题:
使用JDK package java.net.http does not exist
9 编译时出现错误:
使用命令行和 IntelliJ 会发生同样的错误。
我的模块没有问题,因为没有 java.net.http 的类编译和运行没有任何问题。
知道发生了什么吗?
java - 如何在 Java 9 中将新的 HTTP 客户端响应正文转换为字符串?
当我在 Java 9 中试验新的 HTTP 客户端时:
返回的HttpResponse
提供了一个body
方法,该方法接受BodyProcessor
. BodyProcessor
javadoc 说:
提供了此接口的实现,其中对, , ,的
HttpResponse
写入响应。也可以使用自定义实现。String
byte[]
File
Consumer<byte[]>
但我找不到那些实现。我怎样才能将响应正文转换为,比如说,String
?我应该BodyProcessor
为此实现接口吗?