【问题标题】:Project Jigsaw vs Maven拼图项目与 Maven
【发布时间】:2017-02-12 03:57:58
【问题描述】:

来自Jigsaw Project

使开发人员更容易构建和维护库和 适用于 Java SE 和 EE 平台的大型应用程序。

我正在尝试了解 Jigsaw 项目是什么,到目前为止,Jigsaw 项目的目标似乎与我们使用 Maven(或 Gradle)依赖管理所做的有些重叠:

  • 构建 Maven 之类的工具是否构成威胁?
  • 还是我的理解有误,Jigsaw 项目将以某种方式补充这些构建工具?

【问题讨论】:

  • 您是否看到this post 及其答案以获得一些提示?
  • @A_Di-Matteo 是的,我已经看到了这个答案,但它似乎与将 JDK9 与 Maven 一起使用更相关。它没有指定两者中的依赖管理如何协同工作。
  • Jigsaw 没有与 Maven 重叠,也没有威胁,因为他们有不同的想法。 Jigsaw 用于模块化(与 OSGi 有许多相似之处),但用于纯 Java (SE) 和 EE。 Jigsaw 可以更轻松地解耦模块,这些模块只能通过在模块信息文件中定义并由 javac 编译器(jlink 等)控制的已定义接口访问。
  • 我自己也在问这个问题,除了“威胁”这个词真的把这个问题抛在脑后。我认为大多数开发人员想知道的是:这会影响具有 Maven 样式依赖项的正常 Java 开发吗?预计会有哪些好处和变化?

标签: maven java-9 java-platform-module-system


【解决方案1】:

非常简单的答案

Jigsaw 之后,public 将仅在 JAR 范围内公开。要查看 JAR 之外的类,必须将其导出。

Java 将强制模块化,因为任何模块间交互都必须在module-info 文件中指定。

例如,如果您生成一个 WAR,它将几乎保持不变,但 WAR 中的所有 JAR 包都必须定义一个模块信息(或不定义它并被视为自动或未命名的模块)。

Maven有两个主要特性:依赖管理和构建:

  • 依赖管理意味着 Maven 可以确定库的版本 并从存储库下载它们。
  • 构建意味着 Maven 可以编译代码并将其打包成工件。

总结:Maven 仍将负责构建,但必须学习如何使用 Jigsaw 模块进行编译和打包。

【讨论】:

  • 看起来 Jigsaw 也通过像 requires 这样的指令来管理依赖关系。这部分是否与 maven/gradle 重叠?为 JDK 9 以后的开发人员进行部门管理的正确方法是什么?
  • @wlnirvana 例如,当一个模块requires 第二个时,这意味着第二个必须在编译和运行时类路径上可用。 Maven 用于从存储库中检索库,添加到编译类路径并添加到输出 war/fatjar/docker 层。关于重叠:没有重叠:requires 类似于import - 通过编译/运行时需要一些东西,但如何获得“东西”是构建工具的责任
【解决方案2】:

模块绝不会对构建工具构成威胁。模块补充了构建工具,因为构建工具在构建时构建工件及其版本的依赖关系图,而模块在构建时强制工件/模块(不包括版本)的依赖关系,并且运行。

来自State of the Module System

"A module’s declaration does not include a version string, nor
constraints upon the version strings of the modules upon which it
depends. This is intentional: It is not a goal of the module system
to solve the version-selection problem, which is best left to build
tools and container applications."

【讨论】:

  • 拼图只是增加开销然后:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 2016-03-27
  • 1970-01-01
相关资源
最近更新 更多