二、maven 基础知识(学习笔记)

1. maven 坐标和依赖

1.1 坐标

<groupId>com.sdc</groupId>

<artifactId>parent</artifactId>

<version>0.0.1-SNAPSHOT</version>

<packaging>pom</packaging>

 

groupId: 定义当前Maven项目隶属的实际项目。

 

artifactId:该元素定义实际项目中的一个Maven项目(模块),推荐的做法是使用实际项目名称作为artifactId的前缀。

 

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

 

packaging:该元素定义Maven项目的打包方式(默认jar[war,pom,maven-plugin,ear])。

 

classifier:该元素用来帮助定义构架输出的一些附属构件(次元素不能直接定义,因为生成的附属构件有支持的插件实现)。

 

上述5个元素中,groupId、artifactId、version是必须定义的,packaging时可选项(默认jar),而classifier是不能直接定义的。

 

1.2 依赖

    <dependency>

       <groupId>...</groupId>

       <artifactId>..</artifactId>

       <version>...</version>

       <type>依赖的类型,对应于项目左边定义的packaging。(默认jar</type>

       <scope>依赖的范围</scope>

       <optional>标记依赖是否可选</optional>

       <exclusions>

           <exclusion>

              用来排除传递性依赖

           </exclusion>

           ...

       </exclusions>

    </dependency>

 

1.2.1 依赖范围

依赖范围就是用来控制依赖与这三种classpath(编译classpath、测试classpath、运行classpath)的关系,Maven有一下几种依赖范围:

 

① compile:编译依赖范围。默认依赖范围。对于编译、测试、运行三种classpath都有效。例子:spring-core 在三个范围内都需要使用该依赖。

 

② test:测试依赖范围。只对于测试classpath有效。典型的例子:jUnit。

 

③ provided:已提供依赖范围。对于编译和测试classpath有效,但在运行时无效。例子:servlet-api。

 

④ runtime:运行时依赖范围。对于测试和运行classpath有效,但在编译主代码时无效。例子:jdbc驱动实现。

 

⑤ system:系统依赖范围。与provided依赖范围一致。但使用system范围的依赖时必须通过systemPath元素显示地指定依赖文件的路径。(可在成构建的不可移植,慎用)

 

⑥ import(Maven 2.0.9及以上):导入依赖范围。(继承)

 

1.2.2 依赖传递

Maven 依赖调解(DependencyMediation)的第一原则是:路径最近者优先。

Maven定义了依赖调解的第二原则:第一声明者优先。

 

1.2.3 可选依赖

<optional>true</optional> : 对直接依赖当前项目(A)的项目(B)会产生影响。但对依赖项目(B)的项目(C)而言,项目(A)不会对项目(C)产生任何影响。

 

1.2.4 优化依赖

查看已解析依赖:mvn dependency:list

(已解析依赖:经过依赖处理后,确保任何一个构件只有唯一额版本在依赖中存在、)

 

查看依赖树:mvn dependency:tree

 

分析依赖关系:mvn dependency:analyze

(只会分析编译主代码和测试代码需要用到的依赖,一些执行测试和运行时需要的依赖它就发现不了。例:spring-core和spring-beans是运行项目必要的类库,但分析时可能显示费必须依赖,但显然是不能直接删除spring依赖的)

 

2. 仓库

任何一个依赖、插件或者项目构建的输出,都可以称为构件。

 

2.1 仓库的布局

groupId/artifactId/version/artifactId-version.packaging

 

2.2 仓库的分类

对Maven来说,仓库只分为两类:本地仓库和远程仓库。

 

Maven仓库->|

           |->本地仓库

           |->远程仓库->|

                        |->中央仓库

                        |->私服

                        |->其他公共库

 

①本地仓库的配合 ~/.m2/setting.xml

<localRepository>E:/m2re</localRepository>

 

②远程仓库的配置 pom.xml

<repositories>

    <repository>

       <id>jboss</id>

       <name>JBoss Repository</name>

       <url>http://repository.jboss.com/maven2/</url>

       <releases>

           <enabled>true</enabled>

       </releases>

       <snapshots>

           <enabled>false</enabled>

       </snapshots>

    </repository>

  </repositories>

 

releasessnapshots的其他标签

       <snapshots>

           <enabled>false</enabled>

           <updatePolicy>daily</updatePolicy>

           <checksumPolicy>ignore</checksumPolicy>

       </snapshots>

 

updatePolicy 配置从远程仓库检查更新的频率。默认daily,每天一次。

never - 从不检查更新

always - 每次构件都检查

interval:X - 每隔X分钟检查一次(X任意整数)

 

checksumPolicy用来配置Maven检查检验和文件的策略。

默认 warn Maven会在执行构建时输出警告信息。

fail - Maven遇到校验和错误就让构件失败。

ignore - 使Maven完全忽略校验和错误。

 

2.3 部署至远程仓库

参考部署至私服 nexus(仓库配置和认证信息)。

 

2.4 镜像

</mirrors>

    <mirror>

       <id>nexus</id>

       <mirrorOf>*</mirrorOf>

       <name>Human Readable Name for this Mirror.</name>

       <url>http://localhost:8081/nexus/content/groups/public/</url>

    </mirror>

</mirrors>

 

镜像高级配置:

<mirrorOf>*</mirrorOf> : 匹配所有远程仓库。

<mirrorOf>external:*</mirrorOf> : 匹配所有远程仓库,使用localhost除外,使用file://协议的除外。即皮蓬所有不在本机上的远程仓库。

<mirrorOf>repo1,repo2</mirrorOf> : 匹配仓库repo1repo2

<mirrorOf>*,!repo1</mirrorOf> : 匹配所有远程仓库,repo1除外。

 

由于镜像仓库完全屏蔽了被镜像仓库,当镜像仓库不稳定或者停止服务的时候,Maven仍将无法访问被镜像仓库,因而将无法下载构件。

 

3. maven 的生命周期和插件

3.1 生命周期

Mavne拥有三套相互独立的生命周期:clear、default、site。

每个生命周期包含一些阶段(phase),这些阶段使用顺序的。

 

3.1.1 clean生命周期

clean生命周期的目的是清理项目,它包含三个阶段:

pre-clean

clean

post-clean

 

3.1.2 default 生命周期

定义了真正构件时,所需要执行的所有步骤,它是所有生命周期中最核心的部分。

validate

initialize

generate-sources

process-sources处理项目主资源文件。(对src/main/resources目录内容进行变量替换,复制到项目输出的主classpath目录中)

generate-resources

process-resources

compile编译项目的主源码。(编译src/main/java目录下的java文件至项目输出的主classpath目录中)

process-classes

generate-test-sources

process-test-sources处理项目测试资源文件。(对src/test.resources目录的内容进行变量替换,复制到项目输出的测试classpath目录中)

generate-test-resources

process-test-resources

test-compile编译项目的测试代码。(编译src/test/java目录下的Java文件至项目输出的测试classpath目录中)

process-test-classes

test使用单元测试框架进行测试,测试代码不会被打包或部署。

prepare-package

package接受编译好的代码,打包成可发布的格式,如JAR。

integration-test

post-integration-test

verify

install将包安装到Maven本地仓库,供本地其他Maven项目使用。

deploy将最终的包复制到远程仓库,供其他开发人员和Maven项目使用。

 

3.1.3 site生命周期

目的是建立和发布项目站点,包含如下阶段:

pre-site执行一些在生成项目站点之前需要完成的工作。

site生成项目站点文档。

post-site执行一些在生成项目站点之后需要完成的工作。

site-deploy将生成的项目站点发布到服务器上。

 

3.1.4 命令行与生命周期

$mvnclean : pre-clean - clean。

 

$mvntest : default 周期到 test阶段之前所有阶段。

 

$mvnclean install : pre-clean - clean 和 default 周期到 test阶段之前所有阶段。

 

$mvn clean deploy site-deploy : pre-clean -clean 和default 周期到 test阶段之前所有阶段以及 site 所有阶段。

 

3.2 插件

 

3.2.1 生命周期和插件目标的对应关系

clean生命周期

clean maven-clean-plugin:clean

 

default生命周期

process-resources

maven-resources-plugin:resources

复制主资源文件至主输出目录

compile

maven-compiler-plugin:compile

编译主代码至主输出目录

process-test-resources

maven-resources-plugin:testResources

复制测试资源文件至测试输出主目录

test-compile

maven-compiler-plugin:testCompile

编译测试代码至测试输出目录

test

maven-surefire-plugin:test

执行测试用例

package

maven-jar-plugin:jar

创建项目jar包

install

maven-install-plugin:install

将项目输出构件安装到本地仓库

deploy

maven-deploy-plugin:deploy

将项目输出构件部署到远程仓库

 

site生命周期

site maven-site-plugin:site

site-deploy maven-site-plugin:deploy

 

3.2.2 自定义绑定

<build>

    <plugins>

       <plugin>

           <groupId>org.apache.maven.plugins</groupId>

           <artifactId>maven-source-plugin</artifactId>

           <version>2.1.1</version>

           <executions>

              <execution>

                  <id>attach-sources</id>

                  <phase>verify</phase>

                  <goals>

                     <goal>jar-no-fork</goal>

                  </goals>

              </execution>

           </executions>

       </plugin>

    </plugins>

  </build>

注:绑定在default生命周期verify阶段绑,打包源文件

 

3.2.3 maven-help-plugin的使用

执行mavne-help-plugin的describe目标。

$mvn help:describe -Dplugin=groupId:artifactId:version

$mvn help:describe-Dplugin=org.apache.maven.plugins:maven-compiler-plugin:2.1

 

去掉版本信息,查看最新版本

$ mvn help:describe-Dplugin=org.apache.maven.plugins:maven-compiler-plugin

 

可以使用插件目标前缀替换坐标

$ mvn help:describe -Dplugin= compiler

 

仅仅描述摸个插件的目标信息,可以加上goal参数

$ mvn help:describe -Dplugin= compiler-Dgoal=compile

 

加上detail参数输出更详细信息

$ mvn help:describe-Dplugin= compiler -Ddetail

 

4. 聚合与集成

parent : pom.xml

<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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.sdc</groupId>

    <artifactId>parent</artifactId>

    <version>0.0.1-SNAPSHOT</version>

    <packaging>pom</packaging>

    <name>com.sdc.parent</name>

 

    <modules>

       <module>../common</module>

    </modules>

 

    <dependencyManagement>

       <dependencies>

           <dependency>

              <groupId>junit</groupId>

              <artifactId>junit</artifactId>

              <version>4.10</version>

           </dependency>

           <dependency>

              <groupId>dom4j</groupId>

              <artifactId>dom4j</artifactId>

              <version>1.6</version>

           </dependency>

       </dependencies>

    </dependencyManagement>

   

</project>

 

model : pom.xml

<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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

 

  <artifactId>common</artifactId>

  <packaging>jar</packaging>

 

  <name>common</name>

  <url>http://maven.apache.org</url>

   

<parent>

    <groupId>com.sdc</groupId>

    <artifactId>parent</artifactId>

    <version>0.0.1-SNAPSHOT</version>

    <relativePath>../parent/pom.xml</relativePath>

  </parent>

   

  <properties>

    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

  </properties>

 

  <dependencies>

    <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

    </dependency>

    <dependency>

       <groupId>dom4j</groupId>

       <artifactId>dom4j</artifactId>

    </dependency>

  </dependencies>

</project>

 




学习资料:《MAVEN实战》  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值