pom xml中依赖项和插件标记之间的maven有什么区别?

Cor*_*ral 96 plugins dependencies pom.xml maven

我是maven工具的新手,我用Spring和Hibernate创建了一个项目,它们在pom.xml中配置为插件,但JUnit在依赖项下标记.我的问题是,作为一个插件和一个作为依赖的背后的逻辑是什么?

r98*_*891 189

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

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

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

您的方案也是如此.你必须使用spring-plugin来执行一些spring可执行文件[我不确定使用了什么spring-plugins.我只是在这里猜测].但是您需要依赖项来执行这些可执行文件.Junit被标记为依赖,因为surefire-plugin使用它来执行单元测试.

所以,我们可以说插件是一个执行任务的Jar文件,依赖是一个Jar,它提供了执行任务的类文件.

希望这能回答你的问题!

  • @r981 您的答案需要更清楚。这个答案更好:http://stackoverflow.com/questions/26292073/whats-the-difference-between-maven-plugins-and-dependencies (3认同)
  • @MichaelPacheco,我的意思是,spring-plugin将执行某些任务,以执行一组代码,这可能取决于某些库,这些库将由“ dependencies”指定。再举一个例子:您需要一个编译器来执行一段代码;在这里,您的编译器是一个插件,而您的代码是可执行文件。仅编译器就能执行任何代码,但是您的代码可能依赖于库,例如apache commons,这将是一个依赖项。只有在类路径中存在依赖项时,编译器才能编译代码。我希望现在很清楚。 (3认同)
  • 有人可以告诉我执行中的阶段和目标有什么不同吗?据我所知,这个阶段正在谈论 Maven 的生命周期..但为什么又要目标呢?有什么提示吗?有时我看到人们将生命周期关键字放在目标上......???(?.?) (2认同)

And*_*nov 34

Maven本身可以被描述为食物处理器,它具有许多不同的单元,可用于完成不同的任务.这些单位称为插件.例如,编译项目maven使用maven-compiler-plugin,运行测试 - maven-surefire-plugin等等.

maven方面的依赖关系是您的项目所依赖的一个打包的类.它可以是jar,war等.例如,如果你想能够编写JUnit测试,你将不得不使用JUnit注释和类,因此你必须声明你的项目依赖于JUnit.


dav*_*xxx 10

插件和依赖项是完全不同的东西,它们是互补的。

什么是插件?

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

这些是Maven的心脏。
Maven执行的任何任务都由插件执行
有两种类型的插件:buildreporting插件

  • 构建插件将在构建期间执行,并且应<build/>在POM 中的元素中对其进行配置。
  • 报告插件将在网站生成期间执行,并且应<reporting/在POM 的>元素中进行配置。

根据在命令行中指定(例如行家目标mvn cleanmvn clean packagemvn site),特定的生命周期将被用于和的插件目标的特定组将被执行。
有三个内置构建生命周期:defaultcleansite。在default生命周期处理你的项目部署中,clean生命周期把手伸出清洗,而site生命周期把手创建项目的网站上的文档。

插件目标可能绑定到特定生命周期的特定阶段。
例如maven-compiler-plugin,默认情况下,将compile目标绑定到生命周期阶段:compile
大多数Maven插件(核心插件和第三方插件)都倾向于使用约定而非配置。因此,这些通常将插件目标限制在特定阶段,以简化其使用。

那更整洁,更不容易出错:

<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.7.0</version>
</plugin>
Run Code Online (Sandbox Code Playgroud)

比:

<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.7.0</version>
  <executions>
    <execution>
        <phase>compile</phase>
        <goals>
            <goal>compile</goal>
        </goals>
    </execution>
  </executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)

什么是依赖项?

依赖关系是在Maven构建期间类路径中所需的Maven工件/组件。
这些可以打包在应用程序中,但不一定打包(请参阅scope下文)。

大多数依赖项是jar,但也可能是其他类型的存档:war,ear,test-jar,ejb-client ...或仍然是POM或BOM。
的:在一个pom.xml,依赖性可以在多个位置指定<build><dependencies>部分,该dependencies management部分或仍然一个plugin声明!实际上,某些插件在执行期间可能需要在类路径中具有某些依赖关系。这并不常见,但可能会发生。
这是文档中的一个示例,显示了plugindependency可以一起工作:

例如,Maven Antrun插件版本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>
Run Code Online (Sandbox Code Playgroud)

在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>
Run Code Online (Sandbox Code Playgroud)

与插件相反,依赖项具有作用域。
默认范围是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>
Run Code Online (Sandbox Code Playgroud)


Kev*_*vin 6

如果您来自像我这样的前端背景,并且熟悉Grunt和npm,请这样考虑:

首先,您将运行npm install grunt-contrib-copy --save-dev。这就像maven的<dependency></dependency>。它下载执行构建任务所需的文件。

然后,您将在Gruntfile.js中配置任务

copy: {
  main: {
    src: 'src/*',
    dest: 'dest/',
  },
}
Run Code Online (Sandbox Code Playgroud)

这就像maven的<plugin>/<plugin>。您正在告诉构建工具如何处理npm /下载的代码<dependency></dependency>

当然,这不是一个确切的类比,但足够接近以帮助您将头缠住。


cof*_*Mug 5

插件用于为其Maven自身添加功能(例如添加eclipse支持或SpringBoot支持Maven等)。您的源代码需要依赖关系才能通过任何 Maven 阶段(compiletest示例)。如果JUnit测试代码基本上是代码库的一部分,并且您JUnit在测试套件中调用特定命令,并且这些命令未提供,Java SDK因此在测试阶段时JUnit必须存在,并且通过将其作为依赖项提及来处理在你的文件中。MavenJUnitpom.xml


Yog*_*thi 5

一行回答-基本理解

插件是您在执行 Maven 构建时使用的工具

依赖意味着您将在代码中使用的任何库