maven概念

时间:2023-03-08 16:49:15
 1. 下载并解压Maven;Maven下载页2. 将环境变量M2_HOME设置为解压后的目录;

3. 将M2环境变量设置为M2_HOME/bin(在Windows上是%M2_HOME%/bin,在Unix上是$M2_HOME/bin);
4. 将M2添加到PATH环境变量中(Windows上是%M2%,Unix上是$M2);
 注意:Maven运行需要Java环境,因此也需要安装Java,Java版本1.5及以上;

POM文件
当你执行一条Maven命令的时候,你会传入一个pom文件(项目对象模型)。Maven会在该pom文件描述的资源上执行该命令。用以描述项目用到的资源,包括源代码目录、测试代码目录等的位置,以及项目依赖的外部jar包。

构建生命周期、阶段和目标(相当一系列操作分组,组之间可独立和包含)
 
Maven的构建过程被分解为构建生命周期、阶段和目标。一个构建周期由一系列的构建阶段组成,每一个构建阶段由一系列的目标组成。
 依赖和仓库
 
依赖是你的项目用到的jar文件(java库)。如果在本地仓库中不存在该依赖,则Maven会从*仓库程or远程仓库下载并放到本地仓库。
 插件(相当于 clean install)
 
构建插件可以增加额外的构建目标。如果Maven标准的构建阶段和目标无法满足项目构建的需求,可以在POM文件里增加插件。

详解: 
 POM文件即pom.xml,应该放在项目的根目录下。
 每一个项目都有一个POM文件。一个项目如果分为多个子项目,一般来讲,父项目有一个POM文件,每一个子项目都有一个POM文件。在这种结构下,既可以一步构建整个项目,也可以各个子项目分开构建。

<groupId>com.jenkov</groupId>
<artifactId>java-web-crawler</artifactId>
<version>1.0.0</version>

*groupId” 是一个组织或者项目(比如开源项目)的唯一ID。大多数情况下使用项目的java包的根名称作为group ID。该项目将会位于Maven仓库目录中com/jenkov中。
 *artifactId* 正在构建的项目的名称。artifact ID是Maven仓库中group ID目录下的子目录名。artifact ID也是构建完项目后生成的jar包的文件名的一部分。
 *versionId* 项目的版本号。 版本号是artifact ID目录下的子目录名。版本号也用作构建结果名称的一部分。jar包文件名的一部分

上文中的groupId,artifactId和version属性,在项目构建后会生成一个jar文件,位于Maven仓库的如下路径中(目录和文件名):MAVEN_REPO/com/jenkov/java-web-crawler/1.0.0/java-web-crawler-1.0.0.jar

Maven有两个配置文件。配置文件里的设置,对所有的pom文件都是有效的。比如,你可以配置:
本地仓库的路径;当前的编译配置选项等等

配置文件名为settings.xml,两个配置文件分别为:
+ Maven安装目录中:$M2_HOME/conf/settings.xml
 + 用户主目录中:${user.home}/.m2/settings.xml
 如果两个文件都存在,则用户目录下的配置会覆盖Maven安装目录中的配置。

让Maven跑起来
 mvn install
 该命令执行`install`阶段(是默认构建阶段的一部分),编译项目,将打包的JAR文件复制到本地的Maven仓库。事实上,该命令在执行install之前,会执行在构建周期序列中位于install之前的所有阶段。

执行多个构建周期或阶段,如:

mvn clean install

该命令首先执行clean构建周期,删除Maven输出目录中已编译的类文件,然后执行install构建阶段。

也可以执行一个Maven目标(构建阶段的一部分),将构建阶段与目标名以冒号(:)相连,作为参数一起传给Maven命令。例如:

mvn dependency:copy-dependencies

该命令执行`dependency`构建阶段中的`copy-dependencies`目标。

依赖几种方式:

1. Maven内嵌有依赖管理的功能。你只需要在pom文件里指定依赖jar包的名称、版本号,Maven会自动下载并放到你的Maven本地仓库中。如果这些外部jar包依赖了其它的库,它们也会被下载到你的Maven本地仓库。在pom文件的dependencies属性中指定项目依赖:

 <dependencies>
            <dependency>
                <groupId>org.jsoup</groupId>
                <artifactId>jsoup</artifactId>
                <version>1.7.1</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.8.1</version>
                <scope>test</scope>
            </dependency>
        </dependencies>

如果本地仓库中已经有了这两个依赖,Maven就不会去下载了。只有本地仓库中没有的依赖才会被下载。
2.指定的依赖在Maven的*仓库里没有。你可以直接下载这些依赖,然后放到Maven的本地仓库。这些依赖必须放到与groupId、 artifactId和version匹配的子目录中。上面示例中的两个依赖将会被放到以下子目录中:
MAVEN_REPOSITORY_ROOT/junit/junit/4.8.1
MAVEN_REPOSITORY_ROOT/org/jsoup/jsoup/1.7.1
3.外部依赖指的是不在Maven的仓库(包括本地仓库、*仓库和远程仓库)中的依赖(jar包)。

<dependency>
  <groupId>mydependency</groupId>
  <artifactId>mydependency</artifactId>
  <scope>system</scope>
  <version>1.0</version>
  <systemPath>具体路径\war\WEB-INF\lib\mydependency.jar</systemPath>
</dependency>  

4.快照依赖指的是那些还在开发中的依赖(jar包)。与其经常地更新版本号来获取最新版本,不如你直接依赖项目的快照版本。快照版本的每一个build版本都会被下载到本地仓库,即使该快照版本已经在本地仓库了。
(在pom文件的最开头(设置groupId和artifactId的地方),在版本号后追加-SNAPSHOT,则告诉Maven你的项目是一个快照版本。如:<version>1.0-SNAPSHOT</version> 应该是快照项目每次编译产生一个最新快照)
 在配置依赖时,在依赖项目的版本号后追加-SNAPSHOT表明依赖的是一个快照版本。

Maven仓库设置:
Maven根据顺序去仓库中搜索依赖。首先是本地仓库,然后是*仓库,最后,如果pom文件中配置了远程仓库,则会去远程仓库中查找。

本地仓库

本地仓库就是开发者电脑上的一个目录。该仓库包含了Maven下载的所有依赖。一般来讲,一个本地仓库为多个不同的项目服务。因此,Maven只需下载一次,即使有多个项目都依赖它(如junit)。仓库默认在你本机的用户目录下。可以在配置文件
 (user-home/.m2/settings.xml)中修改本地仓库的路径:

<settings>
    <localRepository>
        d:\data\java\products\maven\repository
    </localRepository>
</settings>

*仓库

Maven的*仓库由Maven社区提供。默认情况下,所有不在本地仓库中的依赖都会去这个*仓库查找。然后Maven会将这些依赖下载到你的本地仓库。访问*仓库不需要做额外的配置。

远程仓库

远程仓库一般用于放置组织内部的项目,该项目由多个项目共享。远程仓库中的依赖也会被Maven下载到本地仓库中。可以在pom文件里配置远程仓库。

<repositories>
   <repository>
       <id>jenkov.code</id>
       <url>http://maven.jenkov.com/maven2/lib</url>
   </repository>
</repositories>
 
 
Maven有三个内嵌的构建生命周期: 
 default生命期关注的是项目的编译和打包。clean生命期关注的是从输出目录中删掉临时文件,包括自动生成的源文件、编译后的类文件,之前版本的jar文件等。site生命期关注的是为项目生成文档。实际上,site可以使用文档为项目生成一个完整的网站。
 default生命期更多的关注于构建代码。由于你不能直接执行default生命期,你需要执行其中一个构建阶段或者构建目标。default生命期包含了相当多的构建阶段和目标,最常用的构建阶段有: 

构建阶段 描述
validate 验证项目的正确性,以及所有必需的信息都是否都存在。同时也会确认项目的依赖是否都下载完毕。
compile 编译项目的源代码test 选择合适的单元测试框架,对编译后的源码执行测试;这些测试不需要代码被打包或者部署。
package 将编译后的代码以可分配的形式打包,如Jar包。
install 将项目打包后安装到本地仓库,可以作为其它项目的本地依赖。
deploy 将最终的包复制到远程仓库,与其它开发者和项目共享。

Archetype

可以讲Archetype理解成Maven项目的模板,例如maven-archetype-quickstart就是最简单的Maven项目模板,只需提供基本的元素,如groupId,artifactId,version等,它就能生成项目的基本结构及POM文件。

Maven Archetype Plugin

使用Archetype的一般步骤

  • 命令——mvn archetype:generate
  • 输入命令后,Archetype插件会输出一个Archetype列表供用户选择;选择自己想要使用的Archetype,输入对应编号
  • 提示输入一些基本参数,如groupId,artifactId,version,package等
  • Archetype插件生成项目骨架

常用Archetype

maven-archetype-quickstart

默认的Archetype,基本内容包括:

  • 一个包含junit依赖声明的pom.xml
  • src/main/java主代码目录及一个名为App的类
  • src/test/java测试代码目录及一个名为AppTest的测试用例

maven-archetype-webapp

一个最简单的Maven war项目模板,当需要快速创建一个Web应用的时候可以使用它。生成的项目内容包括:

  • 一个packaging为war且带有junit依赖声明的pom.xml
  • src/main/webapp/目录
  • src/main/webapp/index.jsp文件
  • src/main/webapp/WEB-INF/web.xml文件

创建自己的Archetype

Archetype Catalog

Catalog用来指定maven-archetype-plugin读取archetype-catalog.xml文件的位置:

  • internal——maven-archetype-plugin内置的
  • local——本地的,位置为~/.m2/archetype-catalog.xml
  • remote——指向Maven*仓库的Catalog
  • file://
  • http://