maven中<parent> </parent>和<dependency> <dependency>之间有什么区别?

时间:2018-04-08 08:05:29

标签: java maven

在我的项目中,我总是使用<dependency><dependency>,但我可以在某个项目<parent></parent>中看到pom.xml,如:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.2.RELEASE</version>
</parent>

所以我想知道何时使用它。

4 个答案:

答案 0 :(得分:1)

可以使用打包pom声明父POM。它并不意味着分发,因为它仅从其他项目中引用。

将依赖关系pom声明为jar的位置。因此,它可以包含在项目中,因此项目可以使用它的功能。

Maven父pom几乎可以包含所有内容,并且可以将它们继承到子pom文件中,例如

  • 通用数据 - 开发人员的姓名,SCM地址,分发管理等。
  • 常量 - 例如版本号
  • 常见的依赖关系 - 所有孩子都有共同点。它与在单个pom文件中多次写入它们具有相同的效果。
  • 属性 - 例如插件,声明,执行和ID。
  • 配置
  • 资源

答案 1 :(得分:0)

用例<paraent>用于存储工件版本和模块之间使用的编译器设置/版本的信息。

有关详细信息,请参阅以下内容Introduction to the POM

答案 2 :(得分:0)

依赖是您需要编译代码所需的库。这可以是您自己的代码,也可以是Apache Commons等库。

父项包含许多项目之间共享的信息,但实际构建没有任何信息。假设您有几个相关代码模块,并且您希望确保所有模块都使用相同版本的库。然后,您可以在每个模块的<dependencies>部分中定义这些库,但您可以在父模块的<dependencyManagement>部分中定义该版本。

父POM可以拥有自己的父级,因此您可以构建整个层次结构。

答案 3 :(得分:0)

<parent> <dependencies>

的超集

<parent><dependencies>元素是两个不同的东西,但它们之间存在着相同的重要关系。

简单地说parent定义了当前pom的父pom,dependencies定义了当前pom的实际依赖关系。
父pom可以定义dependencies,但也可以考虑子项Maven项目继承的许多其他内容(特别是允许配置许多内容的dependencyManagement元素和build元素)以某种方式作为dependencies元素的超集 以下是elements inherited from the parent pom的列表:

groupId
version
description
url
inceptionYear
organization
licenses
developers
contributors
mailingLists
scm
issueManagement
ciManagement
properties
dependencyManagement
dependencies
repositories
pluginRepositories
build
plugin executions with matching ids
plugin configuration
etc.
reporting
profiles

使用dependencies和使用<parent>

我们只能使用第一个,只能使用第二个或两个 这取决于Maven项目的设计方式 试图列举所有可能的配置将是漫长的,并没有必要非常有帮助 所以我认为你应该保留parent更像dependencies的结构,因为它为子项目定义了更多的东西,但它也允许不重复你想要定义的实际配置一组项目。
因此,您应该支持parent,因为您希望继承一些子Maven项目的整体配置,而不仅仅是依赖项列表。

您的示例非常适合使用<parent>dependencies替代来说明客户项目的后果。

1)父母继承

此处项目继承自spring-boot-starter-parent pom:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.2.RELEASE</version>
</parent>

因此,项目将继承dependenciesdependencyManagement中定义的任何内容,但它也将继承自super pom中定义的<build>元素。

例如,您可以使用Java 8和UTF-8配置Maven编译器插件(您当然可以在子项目中重新定义):

<properties>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <resource.delimiter>@</resource.delimiter>
    <maven.compiler.source>${java.version}</maven.compiler.source>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.target>${java.version}</maven.compiler.target>
</properties>

此外,Spring Boot项目可能使用的其他一些插件也将在超级pom中定义,并由您的项目继承,例如:

<pluginManagement>
  <plugins>
     ...
    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <executions>
            <execution>
                <goals>
                    <goal>repackage</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <mainClass>${start-class}</mainClass>
        </configuration>
    </plugin>
    ...
  </plugins>
</pluginManagement>

请注意,父pom可以定义dependencies,由子项目直接继承,但不是必需的 例如,spring-boot-starter-parent没有定义子项目直接继承的任何dependency,而是在dependency中定义<dependencyManagement><dependencies>
这意味着这个父pom的孩子可能会使用依赖关系,但他们必须在dependencies中明确说明 例如:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.2.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

请注意,版本不会被视为已继承。

2)没有父继承

您必须在Spring Boot应用程序中定义所有必需的依赖项,或者更直接地使用dependencyManagement import范围内的<dependencyManagement> <dependencies> <dependency> <!-- Import dependency management from Spring Boot --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>1.5.2.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> 依赖项,以便有一种方法来声明它们谢谢到依赖管理功能:

plugins

但在任何情况下,您都不会从父母配置的<properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <springboot.version>1.5.2.RELEASE</springboot.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${springboot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${springboot.version}</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> <configuration> <mainClass>myClass</mainClass> </configuration> </plugin> <plugins> </build> 继承,因为您没有父母。 因此,您应该在项目的pom.xml中明确声明它们。

例如,要定义编译器版本,使用编码并配置构建以重新打包构建的组件(使其成为独立的可执行文件),您将不得不指定更多内容:

enter code here