我的Java库应该与Java 8和Java 9兼容。对于使用Java 9运行,我们需要一些Java 9模块。
我知道我可以通过--add-modules
命令行添加它。但它是一个库,我无法控制命令行。
--add-modules
中是否有MANIFEST.MF
?或者是否有任何其他与Java 8兼容的解决方案?
答案 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 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.activation
和requires java.xml.bind
)< strong>和出口(稍后会详细介绍)。
模块声明必须由Java 9编译器编译,以创建属于JAR根文件夹的模块描述符module-info.class
。
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请确保:
这意味着:
特别是第二点可能很难,如果您依赖尚未模块化的项目,但这是另一个问题。
答案 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