首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在不使用编译器标志的情况下,可以将Java 8和Java 9源代码混合在同一个项目中吗?

在不使用编译器标志的情况下,可以将Java 8和Java 9源代码混合在同一个项目中吗?
EN

Stack Overflow用户
提问于 2017-11-17 20:48:57
回答 2查看 4.5K关注 0票数 10

在Java 9中,您可以选择将源目录打包为一个模块,方法是添加一个模块-info.java,它定义了它导出的东西以及它所依赖的其他模块。

但是,一旦这样做,就必须在模块描述符中列出所有依赖项--而依赖项本身必须是模块。因此,通过扩展,如果您模块化了单个源目录,则必须将每个源代码目录都模块化。

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

如果您在一家代码基础很大的公司工作,而这些代码是由许多不同的项目共享的,那么这似乎是灾难性的。

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

我希望我不正确地理解这一点?

EN

回答 2

Stack Overflow用户

发布于 2017-11-17 20:58:50

但是,一旦这样做,就必须在模块描述符中列出所有依赖项。

是真的。

而依赖关系本身必须是模块。

技术上是对的,但这并不意味着你认为它能做什么。

因此,通过扩展,如果您模块化了单个源目录,则必须将每个源代码目录都模块化。

不,因为您可以让模块系统将常规的旧JAR转换为自动模块,它将根据清单条目或它们的文件名获得名称--您可以通过以下方法找到这个结果:

代码语言:javascript
复制
# 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字节码)上工作。

票数 9
EN

Stack Overflow用户

发布于 2017-11-17 20:52:50

如果您模块化单个源目录,则必须模块化公司范围内的每个单一源目录。

No,这不成立,因为事实是,这就是自动模块设计的目的

(偏爱冲动),最终这将是模块化的目标。

重申有必要从模块系统的状态引入自动模块:

自下而上的迁移是直截了当的,但并不总是可能的。即使org-baz-qux.jar的维护者尚未将其转换为适当的模块--或者永远也不会--我们仍可能希望模块化我们的com-foo-app.jarcom-foo-bar.jar组件。

当你真的说:

您可以选择将源目录打包为一个模块,方法是添加一个模块info.java。

您倾向于将该工件迁移到一个模块(带有模块描述)中,并使用此工件将这些模块放置在库的模块路径中。

另一方面,如果在下游项目中作为依赖项包含在类路径中,则库中没有module-info.classmodule-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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47359025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档