Hor*_*ux7 11 java java-platform-module-system java-9 java-module
我的Java库应该与Java 8和Java 9兼容.对于使用Java 9运行,我们需要一些Java 9模块.
我知道我可以通过命令行添加它--add-modules.但它是一个库,我无法控制命令行.
是否有一个等价--add-modules的MANIFEST.MF?或者还有其他与Java 8兼容的解决方案吗?
不幸的是,没有等价的--add-modules在MANIFEST.MF.但是,您可以module-info.java在那里创建并声明您的依赖项:
module <module-name> {
requires <dependency>;
...
}
Run Code Online (Sandbox Code Playgroud)
但是,如果您编译module-info.java并简单地放入module-info.classJAR,它可能无法在某些平台上运行(例如Android).那么该怎么办?Java 9中有一个新功能:多版本JAR文件(JEP 238).我们的想法是,您可以将Java 9类文件放到特殊目录(META-INF/version/9/)中,Java 9将正确处理它们(而Java 8将忽略它们).
因此,这些是您应该执行的步骤:
module-info.java与javac --release
8module-info.java使用javac --release 9.JAR root
- A.class
- B.class
- C.class
...
- META-INF
- versions
- 9
- module-info.class
Run Code Online (Sandbox Code Playgroud)
生成的JAR应与Java 8和Java 9兼容.
此外,您可以直接放入module-info.class该META-INF文件夹.这将产生同样的效果.但是,这可能不适用于某些工具和平台.所以我认为第一种方式更可取.
模块在它们的模块声明中表达依赖关系,因此您必须创建一个module-info.java,定义模块的名称、依赖关系(在您的情况下使用requires java.activation和requires java.xml.bind)和导出(稍后会详细介绍)。
模块声明必须由 Java 9 编译器编译以创建module-info.class属于 JAR 根文件夹的模块描述符。
9 之前的 Java 版本将忽略module-info.class,这意味着如果您为 Java 8 编译其余代码(通过使用javac 8或使用新--release标志 on javac 9),您的库仍可在该版本上运行。
甚至 Java 9 也只会将您的 JAR 作为模块处理,如果它以模块路径结束。只有这样,它才会看到requires子句并在模块图中包含您正在使用的 Java EE 模块。这意味着在 Java 9 的类路径上使用您的库的客户端仍必须通过命令行手动添加这两个模块。
如果您的模块用于模块路径,可访问性规则确保:
这意味着:
特别是如果您依赖尚未模块化的项目,第二点可能会很困难,但这是另一个问题。
| 归档时间: |
|
| 查看次数: |
3193 次 |
| 最近记录: |