我可以通过MANIFEST.MF要求Java 9模块吗?

时间:2017-04-25 09:19:24

标签: java java-9 jigsaw java-module

我的Java库应该与Java 8和Java 9兼容。对于使用Java 9运行,我们需要一些Java 9模块。

我知道我可以通过--add-modules命令行添加它。但它是一个库,我无法控制命令行。

--add-modules中是否有MANIFEST.MF?或者是否有任何其他与Java 8兼容的解决方案?

3 个答案:

答案 0 :(得分:7)

很遗憾,--add-modules中的MANIFEST.MF there is no equivalent。但是,您可以创建module-info.java并在那里声明您的依赖项:

module <module-name> {
    requires <dependency>;
    ...
}

但是,如果您编译module-info.java并将module-info.class简单地放入JAR,则可能无法在某些平台(例如Android)上运行。那么该怎么办? Java 9中有一个新功能:多版本JAR文件(JEP 238)。我们的想法是,您可以将Java 9类文件放到特殊目录(META-INF/version/9/)中,Java 9将正确处理它们(而Java 8将忽略它们)。

因此,这些是您应该执行的步骤:

  • 使用module-info.java
  • 编译除javac --release 8以外的所有类
  • 使用module-info.java编译javac --release 9
  • 构建一个JAR文件,使其具有以下结构:
JAR root
  - A.class
  - B.class
  - C.class
   ...
  - META-INF
    - versions
      - 9
        - module-info.class

生成的JAR应该与Java 8和Java 9兼容。

此外,您只需将module-info.class放入META-INF文件夹即可。这将产生同样的效果。但是,这可能不适用于某些工具和平台。所以我认为第一种方式更可取。

答案 1 :(得分:4)

模块在module declaration中表达依赖关系,因此您必须创建module-info.java,定义模块的名称,依赖关系(在您的情况下使用requires java.activationrequires java.xml.bind)< strong>和出口(稍后会详细介绍)。

模块声明必须由Java 9编译器编译,以创建属于JAR根文件夹的模块描述符module-info.class

Java 8和9

9之前的Java版本将忽略module-info.class,这意味着如果您为Java 8编译其余代码(使用javac 8或使用新的--release标志在javac 9)上,您的图书馆仍然可以在该版本上运行。

它会解决您的问题吗?

即使Java 9最终只能在the module path上处理,它也只会将您的JAR作为模块进行处理。只有这样它才会看到requires子句并包含您在module graph中使用的Java EE模块。这意味着在Java 9的类路径上使用库的客户端仍然需要通过命令行手动添加这两个模块。

完全模块化

如果您的模块在模块路径上使用,accessibility rules请确保:

  1. 您的客户端只能在您导出的包中使用公共类型(在编译和运行时)
  2. 您的代码只能看到您依赖的模块
  3. 这意味着:

    1. 您必须在模块声明中包含导出
    2. 您必须声明所有依赖项,而不仅仅是在两个JDK模块上
    3. 特别是第二点可能很难,如果您依赖尚未模块化的项目,但这是另一个问题。

答案 2 :(得分:4)

可能会在Jigsaw的最后几分钟内有所需的清单参数。缺点是,它只适用于主jar文件。

样品:

  

Add-Exports:java.base / java.lang java.base / java.lang.invoke

  

Add-Exports-Private:java.base / java.lang java.base / java.lang.invoke

http://openjdk.java.net/projects/jigsaw/spec/issues/#AddExportsInManifest http://mail.openjdk.java.net/pipermail/jpms-spec-experts/2016-September/000391.html