java - 是否可以在不使用编译器标志的情况下在同一个项目中混合使用 Java 8 和 Java 9 源代码?

标签 java java-9 java-platform-module-system java-module module-info

在 Java 9 中,您可以选择通过添加 module-info.java 将源目录打包为模块,它定义了它导出的事物包,以及它所依赖的其他模块。

然而,一旦你这样做了,你必须在模块描述符中列出所有的依赖——并且依赖本身必须都是模块。因此,推而广之,如果您对单个源目录进行模块化,则必须对公司范围内的每个单个源目录进行模块化。

此外,您不能在 Java 8 或更早版本中定义模块,这意味着除了模块化每个 Java 源目录之外,您还必须同时将所有内容转换为 Java 9。

如果您在一家拥有由许多不同项目共享的大量代码库的公司工作,这似乎是灾难性的。

目前,我可以通过设置一堆编译器标志来避免定义模块来解决这个问题,但这似乎是一个非常糟糕的解决方案。

我希望我理解错了?

最佳答案

Once you do that, however, you must list ALL dependencies in the module descriptor

是的。

and the dependencies must all themselves be modules.

技术上是正确的,但它并不意味着你认为它的作用。

Therefore, by extension, if you modularize a single source directory, you must modularize every single source directory company wide.

不,因为您可以让模块系统将常规的旧 JAR 转换为 automatic modules ,它将根据 list 条目或其文件名获得名称 - 您可以通过以下方式找到它:

# jar command from Java 9
jar --describe-module --file $JAR_FILE

Furthermore, you cannot define modules in Java 8 or earlier, meaning that in addition to modularizing every single Java source directory, you must convert everything to Java 9. At the same time.

同样,幸运的是,这并不完全正确。您可以将 module-info.class 添加到为 Java 8 构建的 JAR 中,它将在 Java 8(忽略该文件)和 Java 9(当然可以执行 Java 8 字节码)上运行.

关于java - 是否可以在不使用编译器标志的情况下在同一个项目中混合使用 Java 8 和 Java 9 源代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47359025/

相关文章:

通配符上的 Java 泛型插入

java - 您可以将 jaotc(Java 提前编译器)与 jlink(用于创建运行时镜像的模块汇编器/优化器)一起使用吗?

java - 如何检查一个 jar 是否是多版本的

java - 平台模块之间是否允许循环?

java - 如果目标级别是 8,我可以使用 module-info.java 吗?

java - 方法隐藏和字段隐藏的继承辅助

java - apk 中的classes.dex 在哪里?

java - Cassandra fetchSize 的 CQL 是什么

Java 9 替换 Class.newInstance

java - 如何在 IDEA 中使用类路径而不是模块路径运行 Java 9 应用程序?