Maven实战-第三篇(Maven中的坐标)

我们在上一篇中我们介绍过,如果想通过Maven添加项目的依赖时,就需要在pom.xml中引入项目的相关配置,也就是上一篇中说过的,如果要在项目中引入fastjson依赖,需要添加以下的配置:

 <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>2.0.35</version>
</dependency>

上面的配置,实际上最关键的就是groupIdartifactIdversion参数。这三个主要的参数就可以理解为Maven中的坐标。下面在详细介绍Maven坐标之前,我们先回想一下在我们之前学平面几何的知识,我们知道如果要描述一个坐标,我们可以用x轴和y轴来表示。那么在现实世界中,我们可以通过经纬度来定位一个城市的位置。所以在Maven世界中,由于构建的组件非常多,于是也采用了同样的方式,也就是坐标来定位一个组件。但有唯一不同之处,就是相对x轴和y轴、经纬度来说,Maven的坐标中还包括版本等其它额外的信息。

在之前的文章中我们介绍过,我们没有使用Maven之前如果我们想要使用组件时,我们需要去相应的网站中找寻找,然后去下载才可以使用。但这个过程比较繁琐,并且非常不容易找到。如果项目依赖的组件比较多时,这项工作非常的浪费时间。并且在之前的文章中,我们也介绍过,这样常常会导致我们引入的依赖包,还依赖其它的依赖,这样我们很不方便的一次性全部寻找全。所以Maven为了解决上述的问题,方便我们使用和管理依赖。于是在Maven中定义了这样一组规则:世界上任何一个构件也就是依赖包都可以使用Maven坐标唯一标识。通过这个坐标标识,我们可以下载任何的组件。在Maven坐标中主要包括以下元素:groupId、artifactId、version、packaging、classifier等。下面我们就详细介绍一下这些元素的作用及其使用。

一、groupId

groupId会被定义为Maven所属的项目名称。不过这个项目名称通常会被命令为公司或者组织的域名反向的命名。因为这样基本上是可以保证唯一的。只不过本书中并不推荐使用公司或者组织命名,因为在Maven中一个项目会被划分为多个模块,如果多个模块都按照此方式命名。那么在Maven中就无法通过groupId坐标来区分不同的模块了,当然我们也可以指定其它的坐标参数来区分,但这不是推荐的方式。所以groupId最好使用公司或者组织在加上项目名称来区分。例如大名鼎鼎的Spring Boot项目就是采用下面的方式定义groupId的:spring-boot的groupId就是使用org.springframework.boot来定义的。具体配置如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.0.5</version>
    <type>pom</type>
</dependency>

上面的配置中,我们看有了一新的配置也就是type参数,这个我们称不用了解,后续内容中,我们在详细的介绍。这样做除了上面说的好处外,还有一个目的,就是Maven在执行安装命令时,也就是install,会将此依赖安装到本地的仓库中,并且是按照是groupId的目录进行区分的,例如上面的org.springframework.boot配置,Maven在安装时会生成org/springframework/boot目录。这样如果我们添加了项目的后缀,在本地仓库寻找相应的Jar包就会容易很多。

二、artifactId  

artifactId元素会被定义为Maven中的项目名称,但由于现有的软件开发架构中,通常都会把Maven划分为多个模块。所以常常将artifactId元素指定为模块的名称。并且推荐加上groupId元素的前缀。这样的好处是,在Maven库中可以很方便的通过artifactId元素的名字来找到我们想要的Jar包。因为就是上面说过的在Maven的库中groupId的命名会被解析为目录,而artifactId的命名才是组件真正的名称。如果我们不加前缀可能会有很多不同的groupId的artifactId的命名重复。虽然不会影响我们使用,但可能会影响我们在本地仓库中寻找。当然Maven也可以通过额外的参数设置来更改构建的名称。也就是这前介绍过的。finalName参数。

三、version

version元素定义Maven中的项目的版本。不同的版本可能会有很大的不同,并且不同的版本所依赖其它依赖包的版本也可能是不同的。在Maven中有两个版本类型。一个是正常的版本信息,也就是我们之前看到了1.0这类的。还有一个是快照版本,也就是SNAPSHOT版本。SNAPSHOT版本,在特殊的场景中有不同的效果,我们后续的内容在做详细的介绍。我们现在需要知道,如果我们要引入任何一个依赖包时,必须指定相应的版本,如果我们版本信息有指定的不对时,Maven则不会下载相应的依赖包。

四、packaging

packaging元素定义为Maven中的打包方式。在Maven中打包方式指的就是项目构建完组件的扩展名。在Maven中默认的打包方式为jar。也就是上一篇中我们介绍过的,我们什么都没有指定,默认Maven打包的方式就是jar包。也就是当然我们忽略这个参数不指定时,Maven会自动构建出jar类型的组件。在Maven中除了jar打包方式外,还有war和pom类型。其中war类型的组建为网站的类型,需要通过应用服务器才可以运行。也就是我们常说的的Java Web项目。而pom类型,则是Maven中父项目的类型。因为Maven中可以划分为多个模块,但一定是需要一个父模块来管理其它的子模块。这个父模块的类型,我们就需要设置为pom类型。

五、classifier

classifier元素定义Maven中的附属构建。我们知道在Maven中可以使用groupId、artifactId和version元素来定位一个组件。但在一些其它的情况下,只使用上面的元素是定位不到组件的。因为有些组件并不是按照上面3个元素构建的。所以只指定上在面三个元素是下载不下来的。这时就需要classifier元素了。例如有些组件需要兼容不的jdk版本,这时我们就需要将classifier元素配置为指定的jdk版本。例如下面的组件配置。

<dependency>
    <groupId>net.sf.json-lib</groupId>
    <artifactId>json-lib</artifactId>
    <version>2.4</version>
</dependency>

按照我们上面介绍的,一般的组件我们只要按照上面的方式配置就可以直接下载这个组件的Jar包。但上面的组件比较特殊,因为它需要指定相应的jdk版本才可以下载。也就是要按照下面的方式才可以。

<dependency>
    <groupId>net.sf.json-lib</groupId>
    <artifactId>json-lib</artifactId>
    <version>2.4</version>
    <classifier>jdk15</classifier>
</dependency>

上面介绍的是Maven中比较常见的元素,当然还有很多其它的元素,需要我们学习,我们先了解上面的内容,后续的章节中我们在慢慢介绍。

给TA打赏
共{{data.count}}人
人已打赏
Maven

Maven实战-第二篇(Maven的入门)

2023-7-18 11:35:45

Maven

Maven实战-第四篇(Maven的依赖配置)

2023-7-20 5:51:31