在Java 9中,您可以选择将源目录打包为一个模块,方法是添加一个模块-info.java,它定义了它导出的东西以及它所依赖的其他模块。
但是,一旦这样做,就必须在模块描述符中列出所有依赖项--而依赖项本身必须是模块。因此,通过扩展,如果您模块化了单个源目录,则必须将每个源代码目录都模块化。
此外,您不能在Java 8或更早版本中定义模块,这意味着除了模块化每个Java源目录之外,还必须将所有内容转换为Java 9。
如果您在一家代码基础很大的公司工作,而这些代码是由许多不同的项目共享的,那么这似乎是灾难性的。
现在,我可以通过设置一堆编译器标志来避免定义模块来解决这个问题,但这似乎是一个非常糟糕的解决方案。
我希望我不正确地理解这一点?
发布于 2017-11-17 20:58:50
但是,一旦这样做,就必须在模块描述符中列出所有依赖项。
是真的。
而依赖关系本身必须是模块。
技术上是对的,但这并不意味着你认为它能做什么。
因此,通过扩展,如果您模块化了单个源目录,则必须将每个源代码目录都模块化。
不,因为您可以让模块系统将常规的旧JAR转换为自动模块,它将根据清单条目或它们的文件名获得名称--您可以通过以下方法找到这个结果:
# jar command from Java 9
jar --describe-module --file $JAR_FILE此外,您不能在Java 8或更早版本中定义模块,这意味着除了模块化每个Java源目录之外,还必须将所有内容转换为Java 9。
同样,幸运的是,这并不完全正确。您可以将一个module-info.class添加到为Java8构建的JAR中,它将在Java 8(忽略该文件)和Java 9(当然可以执行Java8字节码)上工作。
发布于 2017-11-17 20:52:50
如果您模块化单个源目录,则必须模块化公司范围内的每个单一源目录。
No,这不成立,因为事实是,这就是自动模块设计的目的
(偏爱冲动)是,最终这将是模块化的目标。
重申有必要从模块系统的状态引入自动模块:
自下而上的迁移是直截了当的,但并不总是可能的。即使
org-baz-qux.jar的维护者尚未将其转换为适当的模块--或者永远也不会--我们仍可能希望模块化我们的com-foo-app.jar和com-foo-bar.jar组件。
当你真的说:
您可以选择将源目录打包为一个模块,方法是添加一个模块info.java。
您倾向于将该工件迁移到一个模块(带有模块描述)中,并使用此工件将这些模块放置在库的模块路径中。
另一方面,如果在下游项目中作为依赖项包含在类路径中,则库中没有module-info.class的module-info.class被视为存在于类路径中。
从注释中编辑:-
可以将Java 9源代码与Java 8编译的jars混合使用,但是您不能编译包含Java 9源代码和Java 8源代码的单个项目吗?
是的,将Java9源代码与Java8编译jar混合使用是可能的,您仍然可以将它们编译到单个项目中。
示例:-查看Maven如何使用https://maven.apache.org/plugins/maven-compiler-plugin/examples/module-info.html实现Java8项目,包括module-info.java。
https://stackoverflow.com/questions/47359025
复制相似问题