没有Maven为我创建的依赖项的jar的用途是什么?

时间:2016-01-09 19:39:14

标签: java maven

我正在使用Maven,我的配置(很可能是默认配置)产生了这个:

image description

这意味着我的编译代码 4%的文件。最大的通货膨胀是由GitHub API库引起的 - 我强烈考虑我会放弃它。

但我的问题是关于小文件,而不是大文件。 Maven创造它是有原因的吗?我可以以某种方式分发它并让它在客户的计算机上工作吗? 为什么存在可以用做些什么?

1 个答案:

答案 0 :(得分:6)

鉴于您的问题,您的Maven项目很可能是jar项目,它使用maven-assembly-plugin生成超级jar。在您的输出中,有2个不同的文件是2个完全不同的过程的结果。

autoclient-3.0.jar被称为主要工件。这是Maven构建的主要结果。它仅由项目中的已编译类组成,由jar打包成maven-jar-plugin。您有此文件,因为您的项目具有jar包装。在Maven中,jar打包automatically bind goals to build phases of the default lifecycle:其中包括jar:jar目标的调用,它创建了这个主要的JAR。但是你必须意识到这个JAR只包含你的类。如果您尝试运行代码,它可能会失败,因为依赖项不会存在。如果你不能运行它的目的是什么?好吧,它的目的是作为其他项目的库,而不是可执行代码。

例如,您要创建一个实用程序库:此库不是直接运行的,它旨在用作另一个可执行项目的依赖项。使用transitive dependencies的概念,Maven会自动将您的库及其所有传递依赖项包含在另一个项目的构建路径中。因此,您的库不需要直接嵌入其依赖项:它们将在构建其他项目期间正确解析。

autoclient-3.0-jar-with-dependencies.jar被称为附加工件。 jar-with-dependencies is a classifier 用于区分此工件与主工件。这是maven-assembly-pluginpredefined jar-with-dependencies descriptor file一起执行的结果。此工件由项目的编译类和项目的所有直接和传递依赖项组成。一个超级jar(或胖罐)就是这样:它将所有依赖项和你的代码聚合在一个大罐子里面。优点是您不需要单独分发依赖项,它们已经包含在JAR中。但请注意,其目的不是作为库,而是用作可执行代码。

请注意,对于单个项目,保留两个JAR是有意义的:一个用作库(主JAR),另一个用作可运行的JAR。