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

时间:2012-08-09 10:45:48

标签: maven plugins dependencies pom.xml

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

8 个答案:

答案 0 :(得分:166)

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

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

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

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

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

希望能回答你的问题!

答案 1 :(得分:31)

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

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

答案 2 :(得分:7)

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

什么是插件?

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

这些是Maven的心脏。
Any task executed by Maven is performed by plugins
插件分为两类:the build and the reporting plugins

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

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

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

更整洁,更不易出错:

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

than:

<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构建过程中类路径中所需的Maven工件/组件。
这些可以打包在应用程序中,但不一定打包(请参阅下面的scope)。

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

在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>

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

答案 3 :(得分:4)

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

答案 4 :(得分:4)

如果您来自像我这样的前端背景,并熟悉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>下载的代码。

当然,这不是一个完全类比,但足够接近以帮助包裹它。

答案 5 :(得分:2)

单行答案-基本理解

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

依赖项是指您将在代码中使用的任何库的类型

答案 6 :(得分:1)

Maven的核心是插件执行框架-根据正式和标准的紧凑定义。更清楚地说,您使用maven-install/clean/compile/build etc之类的命令来创建/执行jar,有时我们也手动运行它们。因此,要运行(或配置或执行)的东西基本上是将它们放在mavens pom的依赖项标签中,并把答案放在谁将运行这些依赖项的环境中(对于环境设置是必需的)。

        javac (compiler) dependency.java (dependency) 

答案 7 :(得分:0)

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

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

plugin and dependancy