如何在 Java 中要求依赖项?

How to require dependencies in Java?

我习惯使用 composer、npm 和 bower 等工具,在这些工具中我需要来自集中式存储库的依赖项。 (ruby 有捆绑器,python 有 pip。)

虽然目前,我正在处理 jar 文件,但设置它们的过程似乎很麻烦。我必须下载它们,在项目中设置它们(我使用的是 IntelliJ IDEA,但它类似于 eclipse 或 netbeans)。

我正在寻找一种方法来直接说 "require library x at version y",并有安装和更新它们的命令。

maven 或 gradle 似乎做了一些工作,但我有点困惑,因为它们被描述为构建工具。

我不想构建我的应用程序,我只是为了简化依赖管理,以免依赖一些下载的 jar 文件。

是否存在这样的集中存储库?事实上的标准是什么? (被大多数人使用,即 composer 已经让 pear 过时了)我将如何设置它?

什么更适合管理依赖关系,我该怎么做?

是的,有这么一个中心化的仓库(Maven Central)。使用 Maven.

Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information.

Maven 正是这样做的。它是一个完整的构建工具,依赖管理是其中的一部分。 maven 使用中央存储库,您可以拥有自己的存储库或使用那里的任何存储库。

I don't want to build my application, I just ease dependency management so not to rely on some donwloaded jar files.

最终您还是会想要构建您的应用程序,那么为什么不使用支持依赖关系管理的构建系统呢?也有纯依赖管理器(例如 Apache Ivy),但为什么不使用使集成更容易的成熟构建工具呢?

Does such a centralized repository exist? What is the de-facto standard? (Used by most people, i.e. composer has made pear obsolete) and how would I set it up?

有几个集中式存储库,最常见的一个是 Maven Central

What is more fit to manage dependencies and how would I do so?

您可以使用任何适合您的需要并支持它的构建工具。其中 3 个是 Maven、Apache Ivy 和 Gradle。只需选择一个并阅读其文档。

让我们从一个简单的问题开始:是的,有一个中央存储库(几乎)可以找到所有内容:http://search.maven.org/ 除此之外,一些公司还拥有自己的存储库。例如 JBoss

如果您想自己托管一些开源软件,还有Sonatype repository

存储库是一个简单的文件结构,其中包含 jar 文件和一些 xml 元数据。布局来自 Maven 世界,但几乎所有 java 构建系统都有一些方法可以从 Maven Central 检索工件。

整个依赖关系解析与您从 npm 了解到的有点不同。您依赖的每个包都有自己的依赖项。其中一些可能会发生冲突。在 java 世界中,需要匹配这些传递依赖项——需要确定一个通用版本。这通常由构建系统完成。所以你的 "require" 是一个依赖项,这意味着 jar 将最终出现在类路径中,因此 类 将可用于你的代码。该过程中没有开箱即用的动态(在启动 jvm 后将 jars 添加到类路径中)。

依赖项在 pom.xml(如果你使用 maven)和 build.gradle 文件中配置(你应该去 gradle)。还有sbt或者Ivy+Ant。

通常您的工件解析系统也会 运行 构建。这是有道理的,因为您需要定义类路径来编译您的 java 源代码。如果您只是使用这些工具来复制该 jar 文件,您仍然需要找到一种方法将所有这些文件传递给编译器。在第 3 个依赖项之后很无聊。

Maven 来自约定优于配置部分。参见5 Minute tutorial。 Intellij 集成非常好。

Gradle 使用 Groovy(一种基于 java vm 的脚本语言)来实现类似的目标,但对发生的事情更加开放。但这使得集成和 IDE 变得更加困难 - 取决于您对构建的创造力。 gradle user guide 是一个很好的起点。

还有Ant+Ivy。 Ant 是一个简单的构建系统,您可以在其中定义任务。 Ivy 为其添加了依赖解析。

不是从来没有提到过这个:sbt(主要来自 Scala 世界)或 leiningen(主要是 clojure)——所有基于 JVM 的语言。

我的建议是 maven - 它需要一个简单的 pom.xml,你可以在其中添加依赖项 - 如果你遵循其目录结构约定,编译将 运行 开箱即用 - 这在java 世界做。大多数 IDE 都能正常工作。如果您的构建需要更复杂的构建步骤 gradle 有一个很好的迁移路径。

上面的 5 分钟教程使用原型(maven 中的项目模板)来帮助您入门。如果你这样做了,你应该能够在 IntelliJ 中打开该文件夹并从那里继续。