问题标签 [java-module]
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平台模块系统
我目前正在评估为桌面应用程序开发插件概念的可能性。
在研究时,我发现了有关 OSGI 和 Java 平台模块系统(或 Project Jigsaw)的信息。
我对 Java 平台模块系统的规范有点困惑。
Java 平台模块系统是否允许像插件一样添加模块?
是否可以声明可选模块并访问它们的服务?模块是否有可能拥有自己的类路径并与应用程序的其余部分分开?
第三方程序员是否有可能实现无缝集成到现有应用程序中的插件?
如果有人能帮助我理解规范,我将不胜感激。
java - Java 9 中会出现循环模块依赖吗?
在 Java 9 中,是否允许使用循环模块?如果不是,原因是什么?
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 等常用库可能会出现类似问题。但是,这个问题应该主要是关于使用自定义模块化运行时映像所产生的问题。
domain-driven-design - Java 9 模块和 DDD 中的双重分派
在我的一些项目中,我使用双分派机制在运行时向我的域模块提供我的基础结构模块的“视图”(加强您的域:双分派模式)。我在上面所说的“模块”只是单独的 jar 文件,其中来自 service.jar->domain.jar 的依赖项仅在编译时强制执行。如果我将我的服务和域定义为“真正的”java 9 模块,我是否能够在 java-9 上使用它?
java - Java 9 重叠的非导出包
各种资源(infoq、jigsaw-dev、osdir)表明,在不同的 java 模块中拥有相同的包将导致 a LayerInstantiationException
,即使包在模块内部(非导出)也是如此。
这似乎与要求所说的完全相反:
Java 编译器、虚拟机和运行时系统必须确保包含同名包的模块不会相互干扰。如果两个不同的模块包含同名的包,那么从每个模块的角度来看,该包中的所有类型和成员都仅由该模块定义。
那么(将)应用程序使用的两个模块是否能够包含同名的私有包?
编辑
这是Stanislav Lukyanov 指出的 JMPS问题
java - 使用 Java 9 模块,多个模块可以导出同一个包吗?
我正在尝试使用适合 Java 9 模块系统的最佳实践,这样我就可以减少工作量来获得好处(而且我们现在的系统确实可以从一些模块化中受益)。
在当前标准下是否允许模块 A 导出包 com.example.foo 以及模块 B 导出包 com.example.foo?
作为一个相关的问题,如果相关的话,是这一点是否真正得到解决,或者它是否仍然不是最终的。
java - 运行中的java 9模块异常
我从 https://jdk9.java.net/download/下载了 jdk 9,从http://openjdk.java.net/projects/jigsaw/quick-start#linkerJigsaw下载了 快速入门指南, 并编写了第一个示例“问候“根据本指南。该项目编译成功,但是当我尝试运行时出现异常
我找不到这个异常的原因
java - 如何解决 Java 9 上的 InaccessibleObjectException(“无法使 {member} 可访问:模块 {A} 不‘打开 {package}’到 {B}”)?
在 Java 9 上运行应用程序时,这种异常发生在各种场景中。某些库和框架(Spring、Hibernate、JAXB)特别容易出现这种情况。这是来自 Javassist 的示例:
消息说:
无法使受保护的最终 java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError 可访问:模块 java.base不会“打开 java.lang”到未命名的模块 @1941a8ff
可以做些什么来避免异常并让程序成功运行?
java - Javadoc 如何处理 Java 9 中模块的可见性?
Javadoc 工具根据可访问性修饰符生成文档。默认情况下,它记录所有public
类protected
、字段和方法。这可以通过以下选项进行更改:
-public
仅显示公共类和成员。-protected
仅显示受保护的和公共的类和成员。这是默认设置。-package
仅显示包、受保护和公共类和成员。-private
显示所有类和成员。
Java 9 引入了模块的概念,Jigsaw 项目将其应用于现有的 JDK。Mark Reinhold 的一次演讲(关于模块的系列演讲中的第 3 次)展示了public
修饰符现在如何具有不同级别的可访问性,具体取决于模块的可见性(通过exports
):
- 向所有人公开
- 公开但仅限于特定模块
- 仅在模块内公开
由于现在并非所有公共成员都可以访问,因此继续使用相同的 Javadoc 生成方案就没有什么意义了。只有暴露在“足够”级别的成员才应记录在案。
Javadoc 模块感知吗?除了上面的命令选项之外,是否还有命令选项来处理额外的曝光层?对于只暴露给特定模块的公共成员,Javadoc 是否列出了这些,如
?