在 pom.xml 中,Maven 中的依赖性标记和插件标记有什么不同?

用 Spring,Hibernate 和 Maven 创建项目。我的问题是插件和依赖背后的逻辑是什么?

88426 次浏览

Maven 本身可以描述为食品加工机,它有许多不同的单位,可以用来完成不同的任务。这些单元被称为插件。例如,要编译您的项目专家使用 maven-compiler-plugin,运行测试 -maven-surefire-plugin等等。

在 maven 方面的依赖性是您的项目所依赖的一个打包类。它可以是罐子,战争等等。例如,如果希望能够编写 JUnit 测试,则必须使用 JUnit 注释和类,因此必须声明项目依赖于 JUnit。

插件和依赖项都是 Jar 文件。

但是它们之间的区别在于,maven 中的大部分工作是使用插件完成的; 而依赖项只是一个 Jar 文件,它将在执行任务时添加到类路径中。

例如,您使用一个编译器插件来编译 java 文件。您不能使用编译器插件作为依赖项,因为这只会将插件添加到类路径,并且不会触发任何编译。在编译文件时添加到类路径中的 Jar 文件将被指定为一个依赖项。

你的情况也一样。你必须使用 spring-plugin 来执行一些 Spring 可执行文件[我不确定 spring-plugin 是用来做什么的。我只是在猜测。但是您需要依赖项来执行这些可执行文件。Junit 被标记为依赖项,因为它被 surefire-plugin 用于执行单元测试。

因此,我们可以说,插件是一个 Jar 文件,它执行任务,而依赖项是一个 Jar,它提供类文件来执行任务。

希望这回答了你的问题!

插件用于向 Maven本身添加功能(如向 Maven添加 eclipse支持或 SpringBoot支持等)。源代码需要依赖关系来通过任何 Maven 阶段(例如,compiletest)。在 JUnit的情况下,因为测试代码基本上是你的代码库的一部分,你在测试套件中调用 JUnit特定的命令,而这些命令不是由 Java SDK提供的,所以 JUnit必须在 Maven处于测试阶段的时候出现,这是通过在 eclipse2文件中提到 JUnit作为一个依赖来处理的。

如果你像我一样来自前端背景,并且熟悉 Grunt 和 npm,可以这样想:

首先你会运行,比如说,npm install grunt-contrib-copy --save-dev。这就像 Maven 的 <dependency></dependency>。它下载执行构建任务所需的文件。

然后在 Gruntfile.js 中配置任务

copy: {
main: {
src: 'src/*',
dest: 'dest/',
},
}

这就像 Maven 的 <plugin>/<plugin>,你告诉构建工具如何处理 npm/<dependency></dependency>下载的代码。

当然,这并不是一个精确的类比,但是足够接近,可以帮助你理解它。

插件和依赖是非常不同的东西,它们是互补的。

什么是插件?

插件执行 Maven 构建的任务,这些任务没有打包在应用程序中。

这是玛文的心脏。
Maven 执行的任何任务都是由 plugins 执行的。
有两类插件: ABC0和 reporting插件:

  • 构建插件将在构建期间执行,它们应该在 POM 的 <build/>元素中配置。
  • 报告插件将在站点生成期间执行,它们应该在 POM 的 <reporting/ > 元素中配置。

根据命令行中指定的 maven 目标(例如 mvn cleanmvn clean packagemvn site) ,将使用 特定的生活方式并执行一组特定的插件目标。
有三个内置的构建生命周期: defaultcleansitedefault生命周期处理项目部署,clean生命周期处理项目清理,而 site生命周期处理项目站点文档的创建。

一个插件的目标可以绑定到特定生命周期的特定阶段。
例如,maven-compiler-plugin默认将 compile目标绑定到生命周期阶段: compile
大多数 maven 插件(包括核心插件和第三方插件)都喜欢约定优于配置。因此,这些插件通常将插件目标绑定到特定的阶段,以使其使用更加简单。

这种方式更为简洁,也更不容易出错:

<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
</plugin>

不超过:

<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>

什么是依赖关系?

依赖项是项目所需的 Maven 工件/组件。

具体来说 大多数依赖项是 jar (即库) ,但这些依赖项也可能是其他类型的归档: war、 ear、 test-jar、 ejb-client... 或仍然是 POM 或 BOM。

在 pom.xml 中,可以在多个位置指定依赖项: <build><dependencies>部分、 dependencies management部分或仍然在 plugin声明中!实际上,一些插件在执行期间可能需要在类路径中具有一些依赖项。这种情况并不常见,但可能会发生。
下面是 文件的一个例子,它表明 plugindependency可以协同工作:

例如,Maven Antrun Plugin 版本1.2使用 Ant 版本 1.6.5,如果你想在运行这个插件时使用最新的 Ant 版本,你需要像下面这样添加 <dependencies>元素:

<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.2</version>
...
<dependencies>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant-launcher</artifactId>
<version>1.7.1</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
...
</project>

在 Maven 中,依赖关系以特定的格式引用:
groupId:artifactId:packaging:classifier:version.
通常不指定分类器(这是可选的)和打包(默认情况下是 JAR)。因此,dependency声明中的通用格式是: groupId:artifactId:version
下面是 <build><dependencies>部分中声明的依赖关系的一个例子:

<build>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.14.Final</version>
</dependency>
<dependencies>
</build>

相关性没有一个阶段绑定作为插件来解决“什么时候”的问题。
但是它有一个对应物: 范围
. < br/> 实际上,应用程序可以在特定时间根据我们为其定义的范围使用声明的依赖项。
scope 是关于依赖关系如何在项目中可见的核心概念。

默认作用域是 compile,这是最常用的作用域(约定优于配置)。
compile作用域意味着依赖项在项目的所有类路径中都可用。

范围定义了应该在哪些类路径中添加依赖项。 例如,我们是在编译和运行时需要它,还是仅在测试编译和执行时需要它?

例如,我们之前将 Hibernate 定义为一个 compile依赖项,因为我们在任何地方都需要它: 源代码编译、测试编译、运行时等等。
但是我们不希望测试库可以打包在应用程序中或者在源代码中引用。因此,我们为它们指定 test作用域:

<build>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.1.0</version>
<scope>test</scope>
</dependency>
<dependencies>
</build>

Maven 的核心是一个插件执行框架——按照正式和标准的紧凑定义。为了更清楚地说明,您使用的命令如 maven-install/clean/compile/build etc用于创建/执行 jar,我们有时也手动运行这些命令。因此,您想要运行(或配置或执行)的东西,您基本上把它们放在依赖标签的 mavens pom 和答案,以便谁将运行这些依赖项(环境设置所需)是插件。

        javac (compiler) dependency.java (dependency)

插件是 Maven 的扩展,用于生成工件(例如,Maven-jar-plugin 用于从已编译的类和资源中生成 jar)。

依赖项是您正在构建的应用程序在编译和/或测试和/或运行时需要的库。

plugin and dependancy

一行回答-基本理解

Plugin 是在执行 maven 构建时使用的工具

Dependency 意思是你将在代码中使用的任何类型的库

简而言之:

插件 用于向软件/工具(如 Maven)添加一些额外的特性。当我们使用 建造命令时,Maven 将在构建时使用添加的插件。

依赖项 用于向源代码添加一些额外的代码,因此依赖项将使一些额外的代码(如 Java 中的类)以库的形式可用于源代码。