【问题标题】:Add a custom JMOD to the module path with Java 9使用 Java 9 将自定义 JMOD 添加到模块路径
【发布时间】:2016-11-11 01:06:49
【问题描述】:

我用这样的 jmod 工具创建了一个简单的JMOD 文件

$JAVA_HOME/bin/jmod create --class-path classes test/samples.jmod

接下来,我尝试通过运行在该模块中执行一个类:

java -mp test -m de.mypackage/de.mypackage.Test

这导致了以下异常:

Error occurred during initialization of VM
java.lang.module.ResolutionException: JMOD files not supported: test/samples.jmod
  at java.lang.module.Resolver.findWithBeforeFinder(java.base@9-ea/Resolver.java:729)
  at java.lang.module.Resolver.resolveRequires(java.base@9-ea/Resolver.java:86)
  at java.lang.module.Configuration.resolveRequiresAndUses(java.base@9-ea/Configuration.java:370)
  at java.lang.module.ModuleDescriptor$1.resolveRequiresAndUses(java.base@9-ea/ModuleDescriptor.java:1986)
  at jdk.internal.module.ModuleBootstrap.boot(java.base@9-ea/ModuleBootstrap.java:263)
  at java.lang.System.initPhase2(java.base@9-ea/System.java:1928)

如果我只是将我的classes 目录(我用来创建 JMOD 文件)设置为模块路径,那么一切都会按预期工作。

模块路径上通常不可能有JMOD 文件吗?如果是这样的话,有什么理由吗?

【问题讨论】:

    标签: java java-9 java-platform-module-system module-path


    【解决方案1】:

    http://openjdk.java.net/jeps/261#Packaging:-JMOD-files

    JMOD 文件可以在编译时和链接时使用,但不能在运行时使用 时间。为了在运行时支持它们,一般来说,我们需要 准备好即时提取和链接本机代码库。这 在大多数平台上都是可行的,尽管它可能非常棘手,而且我们 还没有看到很多需要这种能力的用例,所以对于 我们选择在此限制 JMOD 文件的实用性 释放。

    【讨论】:

    • 这使得 Jigsaw 在云中的通用性不如 e.g.操作系统吉。希望它最终能得到解决,否则与 OSGi 和其他模块系统相比,Jigsaw 可能会成为另一个“java.util.logging”等价物,它是 JDK 的一部分,但比其他更好的替代品使用得少得多。
    • 我认为 Jigsaw 除了 OSGi 之外还有另一个目标。主要目标是 JDK 模块化,它给我们更快的启动、更少的内存消耗和整体更高的性能。对于应用程序,它提供了更清晰的依赖管理和增强的可见性规则。
    • 一点点,但是我听说过“自动模块”以及 Jigsaw 计划如何在 META-INF/MANIFEST 中覆盖它,我想这对于应该作为 Java 9 工作的 JAR 可能是协同的模块和在此之前(或另外)也作为 OSGi 包。目标可能不一样,但理想情况下,对于单独的模块系统,您应该只需要一个 JAR 而不是两个 ;-)
    猜你喜欢
    • 2015-08-21
    • 2022-01-21
    • 2013-08-02
    • 2019-07-18
    • 2019-03-17
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 2017-01-28
    相关资源
    最近更新 更多