【Maven】项目管理工具-Maven

news2025/2/11 8:55:09

目录

1. Maven简介

1.1 项目管理

1.2 项目构建

1.3 项目构建工具

1.4 Maven的四大特征

1.4.1 依赖管理系统

1.4.2 多模块构建

1.4.3 一致的项目结构

1.4.4 一致的构建模型和插件机制

1.5 Maven模型

 ​编辑

2.maven的安装配置 

2.1 Maven的安装配置

2.1.1检测jdk的版本

2.1.2下载maven

2.1.3配置maven环境变量

2.2 认识maven的目录结构

2.3 Maven的第一个项目

1.  按照约定创建Maven项目目录

2.在pom.xml文件中写入如下内容(不用记忆)

3.在mian-->java--》下边创建java文件

4.cmd下编译并运行

Maven命令的执行方案:

2.4 IDEA对Maven环境的集成,创建Maven的java项目

3. Maven仓库的基本概念

3.1 中央仓库

3.2 私服

3.3 其他公共库

4. Maven环境下构建多模块项目

4.1 创建maven_parent项目

4.2 创建子模块

4.3 设置模块之间的依赖关系

 1.  dao模块​编辑

 2. service模块

3. controller层

4. 启动项目

5. Maven打包操作

6. Maven依赖的基本概念

6.1 依赖的基本配置

6.2 依赖范围

6.3 传递性依赖

7. Maven的生命周期

7.1 生命周期的概念

 7.2 完整的生命周期


1. Maven简介

  • 翻译为“专家”,“内行”
  • Maven是跨平台项目管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。
  • maven最主要体现在两个词上:项目的管理项目的构建

  • 什么是理想的项目构建
    • 高度自动化,跨平台,可重用的组件,标准化的流程
  • 什么是依赖?为什么要进行依赖管理?
    • 自动下载,统一依赖管理
    • A1.0   依托于  B 2.0  依托于    C3.0
  • 有哪些项目信息
    • 项目名称描述等,开发人员信息,开发者信息等。

1.1 项目管理

        maven给我们整个开发团队找出了一种能够更加科学的去管理我们项目的思想。maven通过使用配置文件的方式使得项目在管理和交接的过程中成本变得非常低。maven提出了一种叫做maven仓库的概念,使得我们可以将第三方和我们需要引用的项目都放置在maven仓库当中。如果其他人或项目组也需要使用,就可以直接通过maven进行配置就行。这样就可以将人员成本、沟通成本等等都进行降低。

        如果还不理解我们举个例子:加入我们现在想做一份菜:糖醋排骨。如果我们想要做这道菜,那么我们首先要先去菜市场买排骨、糖、醋、......,而且在做的时候还要注意使用糖醋的用量等等。那么如果有一个超市,该超市有卖糖醋排骨的料理包,这是不是就能很大的节省我们做饭和买菜的时间开销。其实maven就是这个卖料理包的超市,但是卖的不是料理包,而是一系列的jar包。这样我们在写代码的时候就不需要去其他网站上下载一大堆的jar包。

1.2 项目构建

        构建(build)是每一个程序员都在做的工作。仔细观察我们会发现,除了编写代码,我们每天都有相当一部分时间花在了编译,运行单元测试,生成文档、打包和部署等繁琐和不起眼的工作上,这就是构建。如果我们现在还是手工的做这些事情,那么时间成本就太高了,于是有人用软件的方法让这一系列工作完全自动化。是软件构建完全像流水线一样,只需要一条简单的命令,所有繁琐的步骤就能很快的自动完成。

传统项目和maven项目构建的两种方式

传统项目

        打开Idea编写源代码和配置文件,对源代码进行编译,可以使用Junit进行单元测试,把项目打成war包,部署到Tomcat服务器中运行。

maven项目

        maven将项目构建过程进行标准化,每个阶段都可以使用一个命令来完成。

                清理 --> 编译 --> 测试 --> 报告 --> 打包 --> 部署

        好处:

        可以通过命令完成项目构建。(测试:使用mvn tomcat:run的命令来发布运行项目)

        maven对每个构建阶段进行规范,有利于大型团队协作开发。

1.3 项目构建工具

Ant构建

        最早的构建工具,基于IDE,大概是2000年有的,当时最流行的java构建工具,不过他的xml脚本编写风格让xml文件特别大。对工程构建过程中的过程控制的特别好。

Maven [ java ]

        Maven是一个项目管理和整合工具。Maven为开发者提供了一整套完整的生命周期框架。开发团队几乎不用花多长时间就能够自动完成工程的基础构建配置。他填补了Ant的缺点,Maven第一次支持了从网上下载的功能,仍然采用xml作为配置文件格式。Maven专注的是项目依赖,使用java编写。

Gradle

        属于结合以上两个的优势,他继承了Ant的灵活和Maven的生命周期管理,他最终被google作为了Android御用管理工具。他最大的区别是不用XML作为配置文件格式,采用了DSL格式,使得脚本更加简洁。

        目前市面上Ant比较老,所以一般是一些比较传统的软件企业公司使用,Maven使用java编写,是当下大多数互联网公司使用的一种构建工具,中文文档也比较齐全,gradle是用groovy编写,目前比较新的构建工具一些初创互联网公司会使用,以后会有很大的使用空间。

1.4 Maven的四大特征

1.4.1 依赖管理系统

        Maven为java世界引入了一个新的依赖管理系统jar包管理 jar包升级时修改配置文件即可。在java世界中,可以用gropId、artifactId、version组成Coordination(坐标)唯一标识一个依赖

        任何基于maven构建的项目自身也必须定义这三个属性。

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.5</version>
</dependency>

坐标属性的理解

        Maven坐标为各个组件引入了新秩序,任何一个组件都必须明确定义自己的坐标。

groupId

        定义当前Maven项目隶属的实际项目-公司名称。(jar包所在仓库路径)由于maven中模块的概念,因此一个项目实际往往会被分成多个模块。比如Spring是一个实际的项目,其对应的Maven模块会有很多,比如Spring-croe,spring-webmvc等。

artifactid

        该元素定义实际项目中的Maven模块-项目名称,推荐的做法是使用实际项目名称作为atrifactid的前缀。比如:Spring-bean,Spring-webmvc等。

version

        该元素定义Maven项目当前所处的版本。

        采用依赖管理的好处

                能够大大减少我们对jar包下载和管理的难度。

        比如项目当中如果有100个jar包,难道我们需要从网上下载这100个jar包吗?显然如果利用maven提供给我们的坐标,就可以很快完成项目的构建。 

1.4.2 多模块构建

        我们在写项目的时候往往需要将 dao service controller 层分离讲一个项目分解为多个模块已经是一种通用的方式。

1.4.3 一致的项目结构

        我们当初在eclipse上边写的项目如果导入到idea上边,那么就会出现很多奇奇怪怪的问题,同理,将idea上边的项目导入到eclipse当中也是一样。究其原因是因为我们在这两个编译器上的项目的目录结构是不一致的。而maven在设计之初的理念就是Conversion over configuration (约定大于配置)。其制定了一套项目目录结构作为标准的java项目结构,解决不同的ida带来文件目录不一致的问题。

1.4.4 一致的构建模型和插件机制

        这一个项目当中我们往往会引入很多插件,比如tomcat服务器或者jetty(嵌入式服务器),为了实现项目组内插件的统一,maven提供了一套机制来包证这要机制的施行。

<plugins>
    <plugin>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <version>9.2.8.v20150217</version>
        <configuration>
	    <httpConnector>
		   <port>80</port>
	    </httpConnector>
	    <stopKey>shutdown</stopKey>
	    <stopPort>9966</stopPort>
        </configuration>
    </plugin>
</plugins>

1.5 Maven模型

 

 


2.maven的安装配置 

2.1 Maven的安装配置

2.1.1检测jdk的版本

jdk版本1.7及以上版本

2.1.2下载maven

      • 地址:Download Apache Maven – Maven
      • 下载地址:Index of /dist/maven/maven-3/3.6.0/binaries
      • 版本:Maven3.6

下载解压到D盘的根目录。

2.1.3配置maven环境变量

        解压后把maven的根目录配置到下同环境变量中Maven_HOME,将bin目录配置到path变量中。

注:maven解压后存放的目录不要包含中文和空格。

编辑环境变量 :(在开始搜索环境变量)

变量名:MAVEN_HOME

变量值:自己的安装目录

编辑系统变量 Path

添加变量值:%MAVEN_HOME%\bin

检验是否安装成功

2.2 认识maven的目录结构

bin:含有mvn运行的脚本

boot:含有plexus-classworlds类加载器框架

conf:含有settings.xml配置文件

lib:含有Maven运行时所需要的java类库

LICENSE.txt, NOTICE.txt, README.txt针对Maven版本,第三方软件等简要介绍


2.3 Maven的第一个项目

1.  按照约定创建Maven项目目录

src下放资源

  • src/main/java —— 存放项目的.java文件 
  • src/main/resources —— 存放项目资源文件,如spring, mybatis配置文件 
  • src/test/java —— 存放所有测试.java文件,如JUnit测试类 
  • src/test/resources —— 测试资源文件 
  • target —— 项目输出位置 
  • pom.xml  所有第三方的引入都在这

2.在pom.xml文件中写入如下内容(不用记忆)

<?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>  <!-- 制定pom模型的版本 -->
	
    <groupId>com.qcby</groupId> <!-- 定义了项目属于那个组,这个组往往和项目所在的组织和公司存在关联 -->
    <artifactId>maven</artifactId><!-- 定义了当前Maven项目组中唯一的ID -->
    <version>1.0-SNAPSHOT</version><!--版本:SNAPSHOT(快照,开发版) alpha(内部测试版) beta(公开测试版) Release | RC (发布版) GA(正常版本) -->
    <packaging>jar</packaging>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

        使用name标签声明是一个对用户更友好的项目名称,虽然不是必须的,但是还是推荐为每个pom声明name,以方便信息的交流。

3.在mian-->java--》下边创建java文件

4.cmd下编译并运行

1.修改默认仓库位置

  在D盘根目录创建一个文件夹:maven  后面所有的jar包都在这个包里。

原因

在配置文件seting.xml文件中:

配置国内的镜像

<mirrors>
    <mirror>
        <id>alimaven</id>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        <mirrorOf>central</mirrorOf>
   </mirror>
  </mirrors>
Maven命令的执行方案:

win+cmd打开终端

首先进入到桌面创建的项目命令中

1. 编译

mvn compile

如果编译不成功,可能出现的问题

  • 1.不是使用管理员执行dos命名
  • 2.JDK环境变量配置有问题,重新配置jdk
  • 3.编写代码时,类里边有代码出现

 2.执行main方法

里面写的是路径

mvn exec:java -Dexec.mainClass="com.qcby.Hello"

第一次可能需要下载很多东西,需要很长的时间。


2.4 IDEA对Maven环境的集成,创建Maven的java项目

1. 新建,选择Maven项目,点击下一步。

 右边可选可不选。

2.起名字,点击完成。

        


这样创建好基本的原生的Maven项目。

这个删掉,无所谓。

 

3. 创建软件包。

pom.xml内容复制过去

4. 配置Maven环境。在文件-设置里

找到部署-构建工具

这样下载就是利用aliyun下载。

想运行,在下面选择终端。编译,执行。

mvn compile

 或者

清除,打包,下载

点击compile会帮助打包


3. Maven仓库的基本概念

仓库

        在我们本地(D盘创建了maven文件夹),当然,还下载apache-maven(做仓库管理的),maven文件夹就是仓库,本地maven仓库。

        在官方的仓库里有所有的公开的仓库, 我们想使用,需要通过apache-maven下载到本地(依赖pom.xml文件,在pom.xml中配置好依赖,就可从官方仓库下载),下载因为是从国外下载的,所以非常慢。

        想快速下载,于是阿里巴巴配置了aliyun镜像,把所有东西都下载到aliyun服务器,于是变成从aliyun下载。

        不对外公开的jar包,搭建到自己的私服当中。

        当第一次运行Maven命令的时候, 你需要Internet链接, 因为它需要从网上下载一些文件。 那么它从哪里下载呢?它是从Maven默认的远程库下载的。 这个远程仓库有Maven的核心插件和可供下载的jar文件。

        当Maven根据坐标寻找构件的时候,它首先会查看本地仓库,如果本地仓库存在,则直接使用; 如果本地没有,Maven就会去远程仓库查找,发现需要的构件之后,下载到本地仓库再使用。 如果本地仓库和远程仓库都没有,Maven就会报错。

远程仓库分为三种: 中央仓库,私服, 其他公共库。

中央仓库是默认配置下,Maven下载jar包的地方。

        私服是另一种特殊的远程仓库,为了节省带宽和时间,应该在局域网内架设一个私有的仓库服务器,用其代理所有外部的远程仓库。 内部的项目还能部署到私服上供其他项目使用。

        一般来说,在Maven项目目录下,没有诸如lib/这样用来存放依赖文件的目录。 当Maven在执行编译或测试时,如果需要使用依赖文件,它总是基于坐标使用本地仓库的依赖文件。

        默认情况下, 每个用户在自己的用户目录下都有一个路径名为.m2/repository/的仓库目录。 有时候,因为某些原因(比如c盘空间不足),需要修改本地仓库目录地址。

        对于仓库路径的修改,可以通过maven 配置文件conf 目录下settings.xml来指定仓库路径

<!-- 设置到指定目录中,路径的斜杆不要写反 -->
<settings>
    <localRepository>D:/maven</localRepository>
</settings>

3.1 中央仓库

        由于原始的本地仓库是空的,maven必须知道至少一个可用的远程仓库,才能执行maven命令的时候下载到需要的构件。中央仓库就是这样一个默认的远程仓库。

        maven-model-builder-3.3.9.jar maven自动的 jar 中包含了一个 超级POM。定义了默认中央仓库的位置。 中央仓库包含了2000多个开源项目,接收每天1亿次以上的访问。

3.2 私服

        私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务, 私服代理广域网上的远程仓库,供局域网内的maven用户使用。 当maven需要下载构件时, 它去私服当中找,如果私服没有, 则从外部远程仓库下载,并缓存在私服上, 再为maven提供。

        此外,一些无法从外部仓库下载的构件也能从本地上传到私服提供局域网中其他人使用配置方式项目pom.xml 配置。

<repositories>
    <repository>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
        <id>public</id>
        <name>Public Repositories</name>
        <url>http://192.168.0.96:8081/content/groups/public/</url>
    </repository>
    <repository>
        <id>getui-nexus</id>
        <url>http://mvn.gt.igexin.com/nexus/content/repositories/releases/</url>
    </repository>
</repositories>

 

公司内部应该建立私服:
  • 节省自己的外网带宽
  • 加速maven构建
  • 部署第三方控件
  • 提高稳定性
  • 降低中央仓库的负荷

3.3 其他公共库

常用的阿里云仓库配置

<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>central</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

4. Maven环境下构建多模块项目

        使用maven提供的多模块构建的特征完成maven环境下多模块的项目的管理和构建。

这里以四个模块为例来搭建项目,以达到通俗易懂的初衷

模块 maven_parent -- 基模块,也就是常说的parent (pom)- 父层级

模块 maven_dao -- 数据库访问层,例如jdbc操作(jar)

模块 maven_service -- 项目的业务逻辑层(jar)

模块 maven_controller -- 用来接收请求,相应数据(war)  -数据接收层

 contoller是从浏览器和前端进行交互

4.1 创建maven_parent项目

先新建父项目,再在父项目下创建子项目。

 

注意

 !!创建好之后,不要忘记Maven的配置文件,因为默认不是自己配置的。

 创建好之后,创建子模块,dao层,service层和controller层。

4.2 创建子模块

1. dao层

 

 

         当父Maven配置好,子模块Maven也配置好了。

2. service层-业务相关

与dao层一样的操作。

3. controller层-与web交互,所以选择webapp

 

注意:别忘了修改如下信息

4.3 设置模块之间的依赖关系

 1.  dao模块

 2. service模块

首先,把service里的pom文件删一些依赖。

除此以外,完成对dao层的依赖。

 

加上static,不然没法直接调用。)

3. controller层

        由于现在该项目是个普通的Maven项目(依赖什么就是什么),想用@Controller注解没有。尝试用别的。用servlet。

(    

   

我的有问题,Maven不选择自己配置的就没问题了。)

4. 启动项目

用Tomcat启动

(可能8080端口不能用,改成80即可) 

         插件引入之后,启动。有一个启动顺序。

        在右侧Maven那里,先启动父级,再启动dao层,然后是service层,最后是Controller层(在生命周期里,install一下)。最后启动Controller层之后,在其下的插件里启动Tomcat。


5. Maven打包操作

       对于企业级项目,无论是进行本地测试,还是测试环境测试以及最终的项目上线,都会涉及项目的打包操作。对于每个环境下的项目打包,对应的项目所需要的配置资源都会有所区别,实现打包的方式有很多种,可以通过ant,或者通过idea 自带的打包功能实现项目打包,但当项目很大并且需要的外界配置很多时,此时打包的配置就会异常复杂,对于maven 项目,我们可以用过 pom.xml 配置的方式来实现打包时的环境选择,相比较其他形式打包工具,通过maven 只需要通过简单的配置,就可以轻松完成不同环境下项目的整体打包。

        使用idea创建项目,目录结构可能会缺失,需要通过手动添加对应的目录结构

1.首先创建maven的web项目

 

清空和修改pom文件

2. 添加 Java 源文件夹

选择项目的 main 文件夹,右键选择New,选择Directory

3. 添加资源文件夹

步骤如上,创建文件夹,命名为 resources

4. 添加对应的文件夹目录,及添加不同环境下对应的配置文件。(本地环境、测试环境、正式环境)

 5. 在pom文件当中添加打包环境

<!-- 打包环境配置 开发环境 测试环境 正式环境 -->
<profiles>
  <profile>
    <id>dev</id>
    <properties>
      <env>dev</env>
    </properties>
    <!-- 未指定环境时,默认打包dev环境 -->
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
  </profile>
  <profile>
    <id>test</id>
    <properties>
      <env>test</env>
    </properties>
  </profile>
  <profile>
    <id>product</id>
    <properties>
      <env>product</env>
    </properties>
  </profile>
</profiles>

 6.设置资源文件配置

<!-- 对于项目资源文件的配置放在build中 -->
<resources>
  <resource>
    <directory>src/main/resources/${env}</directory>
  </resource>
  <resource>
    <directory>src/main/java</directory>
    <includes>
      <include>**/*.xml</include>
      <include>**/*.properties</include>
      <include>**/*.tld</include>
    </includes>
    <filtering>false</filtering>
  </resource>
</resources>

7. 打包

 


6. Maven依赖的基本概念

6.1 依赖的基本配置

根元素project下的dependencies可以包含多个 dependence元素,以声明多个依赖。每个依赖都应

该包含以下元素:

  1. groupId, artifactId, version : 依赖的基本坐标, 对于任何一个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖。

  2. Type: 依赖的类型,大部分情况下不需要声明。 默认值为jar

  3. Scope: 依赖范围(compile,test,provided,runtime,system)

      compile: 编译依赖范围。

            如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译、测

试、运行三种classpath都有效。

       test: 测试依赖范围。

                使用此依赖范围的Maven依赖,只对于测试classpath有效,在编译主代码或者运行项目的使用时将无法使用此类依赖。典型的例子就是JUnit,它只有在编译测试代码及运行测试的时候才需要。

       provided: 已提供依赖范围。

               使用此依赖范围的Maven依赖,对于编译和测试classpath有效,但在运行时无效。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器已经提供,就不需要Maven重复地引入一遍(如:servlet-api)。

       runtime: 运行时依赖范围。

                使用此依赖范围的Maven依赖,对于测试和运行classpath有效,但在编译主代码时无效。典型的例子是JDBC驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。

        system: 系统依赖范围。

                 该依赖与三种classpath的关系,和provided依赖范围完全一致。但是,使用system范围依赖时必须通过systemPath元素显式地指定依赖文件的路径。由于此类依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植,因此应该谨慎使用。

    4. Optional:标记依赖是否可选

    5. Exclusions: 用来排除传递性依赖。

6.2 依赖范围

        首先需要知道,Maven在编译项目主代码的时候需要使用一套classpath。 比如:编译项目代码的时候需要用到spring-core, 该文件以依赖的方式被引入到classpath中。

        其次, Maven在执行测试的时候会使用另外一套classpath。 如:junit。

        最后在实际运行项目时,又会使用一套classpath, spring-core需要在该classpath中,而junit不需要。

    那么依赖范围就是用来控制依赖与这三种classpath(编译classpath,测试classpath,运行时

classpath)的关系, Maven有以下几种依赖范围:

        Compile 编译依赖范围。 如果没有指定,就会默认使用该依赖范围。 使用此依赖范围的Maven依赖, 对于编译,测试,运行都有效。

        Test: 测试依赖范围。 只在测试的时候需要。比如junit

        Provided: 已提供依赖范围。 使用此依赖范围的Maven依赖,对于编译和测试有效, 但在运行时无效。 典型的例子是servlet-API, 编译和测试项目的需要, 但在运行项目时, 由于容器已经提供, 就不需要Maven重复地引入一遍。

        Runtime: 运行时依赖范围。 使用此依赖范围的Maven依赖,对于测试和运行有效, 但在编译代码时无效。 典型的例子是:jdbc驱动程序, 项目主代码的编译只需要jdk提供的jdbc接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体jdbc驱动。

        System: 系统依赖范围。 一般不使用。

6.3 传递性依赖

   传递依赖机制, 让我们在使用某个jar的时候就不用去考虑它依赖了什么。也不用担心引入多余的依赖。 Maven会解析各个直接依赖的POM,将那些必要的间接依赖,以传递性依赖的形式引入到当前项目中。

注意: 传递依赖有可能产生冲突!!

冲突场景:

        如果A下同时存在两个不同version的C,冲突!!(选取同时适合A、B的版本)

  <dependencies>
    <dependency>
      <groupId>A</groupId>
      <artifactId>A</artifactId>
      <version>xxx</version>
      <exclusions>
        <exclusion>
          <groupId>C</groupId>
          <artifactId>C</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>B</groupId>
      <artifactId>B</artifactId>
    </dependency>
  </dependencies>
  这里的<exclusions>
  <exclusion>
    <groupId>C</groupId>
    <artifactId>C</artifactId>
  </exclusion>
</exclusions> 来排除冲突的

7. Maven的生命周期

7.1 生命周期的概念

        Maven的生命周期是对所有的构建过程进行抽象和统一。Maven的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,生命周期只是定义了一系列的阶段,并确定这些阶段的执行顺序。而在执行这些阶段时,实际的工作还是由插件来完成的。这种思想与设计模式中的模板方法非常相似。

Maven有三套相互独立的生命周期:

  • Clean
      • clean生命周期的目的是清理项目
  • Default
      • default生命周期的目的是构建项目
  • site
      • site生命周期的目的是建立项目站点。

 7.2 完整的生命周期

生命周期

clean

default

site

阶段(phase),执行顺序由上至下

pre-clean

validate

pre-site

clean

initialize

site

post-clean

generate-sources

post-site

process-sources

site-deploy

generate-resources

process-resources

compile

process-classes

generate-test-sources

process-test-sources

generate-test-resources

process-test-resources

test-compile

process-test-classes

test

prepare-package

package

pre-integration-test

integration-test

post-integration-test

verify

install

deploy

        用户在mvn命令后可以指定三个生命周期中的任何阶段,则Maven会按以下逻辑执行:首先会得到该阶段所属生命周期,从该生命周期中的第一个阶段开始按顺序执行,直至该阶段本身。例如执行mvn clean命令会依次执行clean生命周期中的pre-clean阶段及clean阶段。mvn命令后可以指定多个阶段,Maven会按照输入的顺序依次执行,每次执行都会按照之前描述的逻辑执行。

        之前提到实际的工作还是由插件来完成的,这意味着插件需要和阶段绑定起来。Maven已经事先将很多核心插件绑定到对应的阶段,这样用户几乎不用配置就有构建Maven项目。Maven的内置绑定如下:

 

生命周期

阶段(phase)

插件目标

clean

clean

maven-clean-plugin:clean

default

process-resources

maven-resources-plugin:resources

compile

maven-compiler-plugin:compile

generate-test-resources

maven-resources-plugin:testResouces

test-compile

maven-compiler-plugin:testCompile

test

maven-surefire-plugin:test

package

打包类型是jar时:maven-jar-plugin:jar;

打包类型是war时:maven-war-plugin:war

install

maven-install-plugin:install

deploy

maven-deploy-plugin:deploy

site

site

maven-site-plugin:site

site-deploy

maven-site-plugin:deploy

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2295674.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ASP.NET Core WebSocket、SignalR

目录 WebSocket SignalR SignalR的基本使用 WebSocket WebSocket基于TCP协议&#xff0c;支持二进制通信&#xff0c;双工通信。性能和并发能力更强。WebSocket独立于HTTP协议&#xff0c;不过我们一般仍然把WebSocket服务器端部署到Web服务器上&#xff0c;因为可以借助HT…

【学术投稿】第五届计算机网络安全与软件工程(CNSSE 2025)

重要信息 官网&#xff1a;www.cnsse.org 时间&#xff1a;2025年2月21-23日 地点&#xff1a;中国-青岛 简介 第五届计算机网络安全与软件工程&#xff08;CNSSE 2025&#xff09;将于2025年2月21-23日在中国-青岛举行。CNSSE 2025专注于计算机网络安全、软件工程、信号处…

26~31.ppt

目录 26.北京主要的景点 题目 解析 27.创新产品展示及说明会 题目​ 解析 28.《小企业会计准则》 题目​ 解析 29.学习型社会的学习理念 题目​ 解析 30.小王-产品展示信息 题目​ 解析 31.小王-办公理念-信息工作者的每一天 题目​ 解析 26.北京主要的景点…

网络工程师 (28)IEEE802标准

前言 IEEE 802标准是由电气和电子工程师协会&#xff08;IEEE&#xff09;制定的一组局域网&#xff08;LAN&#xff09;和城域网&#xff08;MAN&#xff09;标准&#xff0c;定义了网络中的物理层和数据链路层。 一、起源与背景 IEEE 802又称为LMSC&#xff08;LAN/MAN Stand…

背包问题1

核心&#xff1a; // f[i][j] 表示只看前i个物品&#xff0c;总体积是j的情况下&#xff0c;总价值是多少 //res maxx(f[n][]0-v] //f[i][j]: //1 不选第i个物品 f[i][j] f[i-1][j] //2 选第i个物品 f[i][j] f[i-1][j-v[i]] w[i]

Spring 中的设计模式详解

控制反转(IoC)和依赖注入(DI) IoC(Inversion of Control,控制反转) 是 Spring 中一个非常非常重要的概念&#xff0c;它不是什么技术&#xff0c;而是一种解耦的设计思想。IoC 的主要目的是借助于“第三方”(Spring 中的 IoC 容器) 实现具有依赖关系的对象之间的解耦(IOC 容器…

人类的算计与机器的算计

近日&#xff0c;国外一视频网站博主通过设定&#xff0c;使DeepSeek和ChatGPT开展了一场国际象棋对弈。前十分钟双方在正常对弈&#xff0c;互有输赢&#xff0c;且ChatGPT逐渐占优。随后DeepSeek突然以对话方式告诉ChatGPT&#xff0c;国际象棋官方刚刚更新了比赛规则&#x…

7 使用 Pydantic 验证 FastAPI 的请求数据

FastAPI 是一个快速、现代的 Web 框架&#xff0c;它提供了自动生成 OpenAPI 文档的功能&#xff0c;支持 Pydantic 模型进行请求和响应数据的验证。Pydantic 提供了强大的数据验证功能&#xff0c;可以帮助你确保请求的有效性&#xff0c;自动进行数据转换&#xff0c;并生成详…

U3D支持webgpu阅读

https://docs.unity3d.com/6000.1/Documentation/Manual/WebGPU-features.html 这里看到已经该有的差不多都有了 WOW VFX更是好东西 https://unity.com/cn/features/visual-effect-graph 这玩意儿化简了纯手搓一个特效的流程 如果按原理说就是compute shader刷position&#…

Mac安装配置使用nginx的一系列问题

brew安装nginx https://juejin.cn/post/6986190222241464350 使用brew安装nginx&#xff0c;如下命令所示&#xff1a; brew install nginx 如下图所示&#xff1a; 2.查看nginx的配置信息&#xff0c;如下命令&#xff1a; brew info nginxFrom:xxx 这样的&#xff0c;是n…

在CT107D单片机综合训练平台上,8个数码管分别单独依次显示0~9的值,然后所有数码管一起同时显示0~F的值,如此往复。

题目&#xff1a;在CT107D单片机综合训练平台上&#xff0c;8个数码管分别单独依次显示0~9的值&#xff0c;然后所有数码管一起同时显示0~F的值&#xff0c;如此往复。 延时函数分析LED首先实现8个数码管单独依次显示0~9的数字所有数码管一起同时显示0~F的值&#xff0c;如此往…

组件库选择:ElementUI 还是 Ant Design

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

从运输到植保:DeepSeek大模型探索无人机智能作业技术详解

DeepSeek&#xff0c;作为一家专注于深度学习与人工智能技术研究的企业&#xff0c;近年来在AI领域取得了显著成果&#xff0c;尤其在无人机智能作业技术方面展现了其大模型的强大能力。以下是从运输到植保领域&#xff0c;DeepSeek大模型探索无人机智能作业技术的详解&#xf…

超越LSTM!TCN模型如何精准预测股市波动(附代码)

作者&#xff1a;老余捞鱼 原创不易&#xff0c;转载请标明出处及原作者。 写在前面的话&#xff1a;最近我用TCN时间卷积网络预测了标普500指数&#xff08;SPX&#xff09;的每日回报率&#xff0c;发现效果远超传统方法。TCN通过因果卷积和膨胀卷积捕捉时间序列的长期依赖关…

[每周一更]-(第133期):Go中MapReduce架构思想的使用场景

文章目录 **MapReduce 工作流程**Go 中使用 MapReduce 的实现方式&#xff1a;**Go MapReduce 的特点****哪些场景适合使用 MapReduce&#xff1f;**使用场景1. 数据聚合2. 数据过滤3. 数据排序4. 数据转换5. 数据去重6. 数据分组7. 数据统计8.**统计文本中单词出现次数****代码…

QML初识

目录 一、关于QML 二、布局定位和锚点 1.布局定位 2.锚点详解 三、数据绑定 1.基本概念 2.绑定方法 3.数据模型绑定 四、附加属性及信号 1.附加属性 2.信号 一、关于QML QML是Qt框架中的一种声明式编程语言&#xff0c;用于描述用户界面的外观和行为&#xff1b;Qu…

查询已经运行的 Docker 容器启动命令

一、导语 使用 get_command_4_run_container 查询 docker 容器的启动命令 获取镜像 docker pull cucker/get_command_4_run_container 查看容器命令 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock cucker/get_command_4_run_container 容器id或容器名 …

协议_CAN协议

物理层特征 信号传输原理&#xff1a; CAN控制器根据CAN_L和CAN_H上的电位差来判断总线电平&#xff0c;总线电平分为显性电平&#xff08;CAN_H与CAN_L压差 2v&#xff09;、隐性电平&#xff08;CAN_H与CAN_L压差 0v&#xff09;&#xff0c;发送方通过总线电平的变化&am…

QT修仙之路2-2 对话框 尚欠火候

警告对话框 相关代码 错误对话框 相关代码 消息对话框 相关代码 询问对话框 相关代码 相关代码 警告对话框 QMessageBox::warning(this,"错误","账号密码不能为空",QMessageBox::Ok);错误对话框 QMessageBox msgBox(QMessageBox::Critical,"错误…

NFT Insider #168:The Sandbox 推出新春{金蛇礼服}套装;胖企鹅合作 LINE Minini

引言&#xff1a;NFT Insider 由 NFT 收藏组织 WHALE Members、BeepCrypto 联合出品&#xff0c; 浓缩每周 NFT 新闻&#xff0c;为大家带来关于 NFT 最全面、最新鲜、最有价值的讯息。每期周报将从 NFT 市场数据&#xff0c;艺术新闻类&#xff0c;游戏新闻类&#xff0c;虚拟…