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,它提供了执行任务的类文件.
希望这能回答你的问题!
And*_*nov 34
Maven本身可以被描述为食物处理器,它具有许多不同的单元,可用于完成不同的任务.这些单位称为插件.例如,编译项目maven使用maven-compiler-plugin,运行测试 - maven-surefire-plugin等等.
maven方面的依赖关系是您的项目所依赖的一个打包的类.它可以是jar,war等.例如,如果你想能够编写JUnit测试,你将不得不使用JUnit注释和类,因此你必须声明你的项目依赖于JUnit.
dav*_*xxx 10
插件和依赖项是完全不同的东西,它们是互补的。
插件执行Maven构建的任务。这些未打包在应用程序中。
这些是Maven的心脏。
Maven执行的任何任务都由插件执行。
有两种类型的插件:在build和reporting插件:
<build/>在POM 中的元素中对其进行配置。<reporting/在POM 的>元素中进行配置。 根据在命令行中指定(例如行家目标mvn clean, mvn clean package或mvn site),特定的生命周期将被用于和的插件目标的特定组将被执行。
有三个内置构建生命周期:default,clean和site。在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声明!实际上,某些插件在执行期间可能需要在类路径中具有某些依赖关系。这并不常见,但可能会发生。
这是文档中的一个示例,显示了plugin并dependency可以一起工作:
例如,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)
如果您来自像我这样的前端背景,并且熟悉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>。
当然,这不是一个确切的类比,但足够接近以帮助您将头缠住。
插件用于为其Maven自身添加功能(例如添加eclipse支持或SpringBoot支持Maven等)。您的源代码需要依赖关系才能通过任何 Maven 阶段(compile或test示例)。如果JUnit测试代码基本上是代码库的一部分,并且您JUnit在测试套件中调用特定命令,并且这些命令未提供,Java SDK因此在测试阶段时JUnit必须存在,并且通过将其作为依赖项提及来处理在你的文件中。MavenJUnitpom.xml