您现在的位置是:首页 >技术杂谈 >引入父项目<scope>import</scope>和<type>pom</type>等的作用网站首页技术杂谈

引入父项目<scope>import</scope>和<type>pom</type>等的作用

lskisme 2023-05-23 06:48:29
简介引入父项目<scope>import</scope>和<type>pom</type>等的作用
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.0.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.lskisme</groupId>
    <artifactId>sentinel-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <packaging>pom</packaging>
    <modules>
        <module>order-service</module>
        <module>user-service</module>
    </modules>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2022.0.2</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2022.0.0.0-RC1</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

Packing 指定打包生成构建产物的类型

<packaging>pom</packaging>

packing是Maven中用来指定项目打包类型的元素。Maven支持多种打包类型,常见的包括:

jar:Java应用程序或库
war:Java Web应用程序
ear:Java Enterprise应用程序
pom:Maven项目管理模块
maven-plugin:Maven插件

通过指定packing元素,可以告诉Maven如何打包项目,生成相应的构建产物。例如,如果指定为jar,Maven会将项目打包为一个可执行的jar文件;如果指定为war,Maven会将项目打包为一个Web应用程序的war文件。

默认使用jar作为打包类型

在Maven中,如果没有指定packing元素,Maven会默认使用jar作为打包类型。但是,对于不同类型的项目,应该选择相应的打包类型,以便生成正确的构建产物。
需要注意的是,不同的打包类型会影响项目的结构和依赖关系,因此需要根据实际情况选择合适的打包类型。

设为pom不会生成任何构建产物,只用于管理依赖关系。

将Maven项目的packing元素设为pom,表示这个项目不是一个可执行的Java应用程序或库,而是一个纯粹的Maven项目模块,它不会生成任何构建产物,只用于管理依赖关系。

在实际开发中,通常会将一些公共的配置信息放在一个父项目中,然后在子项目中通过继承来使用这些配置信息。
这个父项目的packaging元素通常会设为pom,因为它不需要生成任何构建产物,只用于管理子项目的依赖关系。

另外,有些Maven插件也需要作为一个纯粹的Maven项目模块来使用,这时候也会将packaging元素设为pom。
这些插件通常不需要生成任何构建产物,而是用于提供一些构建任务和目标,供其他项目使用。

modules 聚合构建

聚合用于快速构建maven工程,一次性构建多个项目/模块。在model标签中的pom都执行相同操作

<packaging>pom</packaging>
<modules>
   <module>order-service</module>
   <module>user-service</module>
</modules>

注意事项:参与聚合操作的模块最终执行顺序与模块间的依赖关系有关,与配置顺序无关

继承

parent 指定当前项目的父项目

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.0.5</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

继承父项目中的配置信息

子项目中覆盖和修改父项目中的配置信息。

避免子项目重复定义groupId和version

在Maven中,每个项目都应该有一个唯一的groupId和artifactId,但是version可以通过继承来自父项目。
因此,使用parent元素可以避免在每个子项目中都重复定义groupId和version。

parent元素的常见配置包括:

groupId、artifactId、version:指定父项目的groupId、artifactId和version,用于确定父项目的坐标。
relativePath:指定父项目的相对路径,用于在本地文件系统中查找父项目的pom.xml文件。
modules:指定子项目的模块列表,用于确定子项目的结构和依赖关系。

使用parent元素可以简化项目的管理和维护,避免重复定义相同的配置信息,提高开发效率和代码质量。

dependencyManagement管理子项目依赖项的版本

 <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2022.0.2</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        <dependencies>
<dependencyManagement>

避免在子项目中重复定义依赖项版本号

我在创建的maven子模块中要引入spring-cloud-starter-loadbalancer的依赖,不想指定版本号,maven能搞定吗?

就要在maven父工程中使用dependencyManagement标签继承有定义spring-cloud-starter-loadbalancer版本信息的pom项目,而spring-cloud-dependencies就是官方定义的所有版本对应信息
Maven会自动使用spring-cloud-dependencies项目中定义的版本号。

定义控制项目中所有依赖项的版本一致

确保项目中的依赖项版本一致。

总之使用dependencyManagement,可以在父项目中定义依赖项的版本信息,然后在子项目中引用这些依赖项时,不需要指定版本号,Maven会自动使用父项目中定义的版本号。简化了项目的管理和维护。

scope控制依赖项不同阶段的可见性和使用范围

<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-dependencies</artifactId>
     <version>2022.0.2</version>
     <scope>import</scope>
     <type>pom</type>
</dependency>

Maven中有以下几种scope:

编译、测试、运行

compile: 默认scope,全程可见和使用。
provided: 编译、测试可见和使用,
					打包时不会被打包进去,要由运行环境提供使用。
runtime: 只运行阶段可见和使用
test:	  只测试阶段可见和使用

还有两种特别的scope

import:  表示依赖项只用于管理子模块的依赖关系,不会被子模块添加使用
system:   表示依赖项来自本地系统,需要通过systemPath指定依赖项的路径。

import:表示依赖项只用于管理子模块的依赖关系,不会被子模块添加使用

避免不必要的依赖项被打包进去,减小打包文件的大小,

避免重复依赖项版本冲突

type指定依赖项类型

默认情况下,Maven会根据依赖项的文件后缀名来推断类型,例如jar、war、pom等。但对于一些非标准的文件类型,需要使用type来明确指定。

常见的type类型包括:

jar:Java应用程序或库
war:Java Web应用程序
pom:Maven项目模块
ear:Java Enterprise应用程序
rar:Java资源适配器
ejb:Enterprise Java Bean
maven-plugin:Maven插件
test-jar:测试用的Java应用程序或库

通过指定type,可以确保依赖项被正确地处理和使用,避免出现编译、打包等问题。

默认根据依赖项的文件后缀名来推断依赖类型

确保依赖项被正确地处理和使用,避免出现编译、打包问题

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。