MAVEN 的学习笔记

maven 项目的核心就是 pom.xml

maven的主要命令:

  • mvn clean compile
  • mvn clean test
  • mvn clean package
  • mvn clean install

这里主要是在eclipse中使用maven,因此只使用到了一部分命令,整理下来方便以后查阅。
生成清除Eclipse项目结构:

mvn eclipse:eclipse
mvn eclipse:clean

清理(删除target目录下编译内容)

mvn clean

仅打包Web页面文件

mvn war:exploded

编译项目

mvn compile

打包发布

mvn package

打包时跳过测试

mvn package -Dmaven.test.skip=ture

创建一个简单的Java工程:

mvn archetype:create -DgroupId=com.mycompany.example -DartifactId=Example

创 建一个java的web工程:

mvn archetype:create -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=com.mycompany.app -DartifactId=my-webapp

打包:mvn package
编译:mvn compile
编译测试程序:mvn test-compile
清空:mvn clean
运行测试:mvn test
生成站点目录: mvn site
生成站点目录并发布:mvn site-deploy
安装当前工程的输出文件到本地仓库: mvn install
安 装指定文件到本地仓库:

mvn install:install-file -DgroupId=<groupId> -DartifactId=<artifactId> -Dversion=1.0.0 -Dpackaging=jar -Dfile=<myfile.jar>

查看实际pom信息: mvn help:effective-pom
分析项目的依赖信息:mvn dependency:analyze 或 mvn dependency:tree
跳过测试运行maven任务: mvn -Dmaven.test.skip=true XXX
生成eclipse项目文件: mvn eclipse:eclipse
查看帮助信息:mvn help:helpmvn help:help -Ddetail=true
查看插件的帮助信息:mvn <plug-in>:help,比如:mvn dependency:help 或 mvn ant:help 等等。
执行test 之前会先执行compile的,执行package之前是会先执行test的,而类似的,instal之前会执行package。

maven 坐标和依赖

maven的一大功能就是管理项目依赖。为了能自动化地解析任何一个Java构件,maven就必须将它们进行唯一化标识(ps:就像我们数据库中表的唯一主键一样),这就依赖管理的底层基础——坐标。

maven 的坐标的元素包括:

  • groupId
  • artifactId
  • version
  • packaging
  • classifier
<dependency>
      <groupId>org.sonatype.nexus/</groupId>
      <artifactId>nexus-indexer</artifactId>
      <version>2.0.0</version>
      <packaging>jar</packaging>
 </dependency>

这是nexus-idexer的坐标定义。

groupId : 定义当前Maven项目所属的实际项目。(ps : Maven 项目和实际项目不一定是一对一的关系)。

artifactId : 定义实际项目中的一个Maven项目(模块),默认情况下Maven生存的构建,其文件名会以artifactId做为开头。

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

packaging : 定义maven项目的打包方式。打包方式通常与所生存的构建的文件扩展名对应。打包方式会影响到构建的生命周期,比如 jar 包和 war 打包会使用不同的命令。不定义packaging的时候,maven 会使用默认值 jar。

classifier : 该元素用来帮助构建输出的一些附属构件。

groupId、artifactId、version 是必须定义的,packaging 是可选的(默认为 jar),而classifier 是不能直接定义的。

依赖的配置

  • groupId、artifactId 和 version: 依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,maven根据基本坐标才能找到需要的依赖。
  • type: 依赖的类型,对应于项目坐标定义的packaging。大部分情况下,该元素不必声明,默认值为 jar。
  • scope : 依赖范围。maven在编译项目主代码的时候需要使用一套classpath。maven 在编译和执行厕所的时候会使用另一套classpath。maven 在实际运行的时候,又会使用一套classpath。
  • * optional:标记依赖是否可选。*
  • * exclusions : 用来排除传递依赖。*

依赖范围

- complie : 编译依赖范围。没有指定,就会默认是哦那个该依赖范围。使用这个
- test : 测试依赖范围。只对测试 classpath 有效。
- provided : 已提供依赖范围。对于编译和测试 classpath 有效,但在运行时无效。
- runtime : 运行时有效依赖。对于测试和运行 classpath 有效,但在便于主代码时无效。
- system : 系统依赖范围。该依赖与三种 classspath 的关系,和provided 依赖范围完全一致。(使用system 范围的依赖时必须通过 systemPath 元素显示的指定依赖文件的路径。此类依赖不通过Maven 仓库解析的,而是于本机系统绑定,可能造成构建不可移植)
依赖范围(scope)对于编译 classpath 有效对于测试 classpath 有效对于运行时 classpath 有效
compileYYY
test-Y-
providedYY_
runtime-YY
system-Y-

传递性依赖和依赖范围

依赖范围不仅可以控制依赖与三种 classpath 的关系,还对传递性依赖产生影响。

.comiletestprovidedruntime
compilecomile--runtime
testtest--test
providedprovided-providedprovided
runtimeruiment--runtime

依赖调解

例子:
A -> B -> C - > X(1.0)
A -> D -> X(2.0)
Maven 依赖调解的第一原则是:路径最近者优先。
第二原则是:第一声明者优先。

可选依赖

例子:
A -> B
B -> X(可选)
B ->Y(可选)
根据传递性依赖的定义,如果所有这三个依赖的范围都是compile,那么X、Y就是 A 的 compile 范围传递性依赖。然而,由于这里 X,Y 是可选依赖,依赖将不会得以传递。

##可选依赖配置
<project>
  ...
  <dependencies>
    <!-- declare the dependency to be set as optional -->
    <dependency>
      <groupId>sample.ProjectA</groupId>
      <artifactId>Project-A</artifactId>
      <version>1.0</version>
      <optional>true</optional> <!-- value will be true or false only -->
    </dependency>
  </dependencies>
</project>

## 不可选依赖配置
<project>
  ...
  <dependencies>
    <!-- declare the dependency to be set as optional -->
    <dependency>
      <groupId>sample.ProjectA</groupId>
      <artifactId>Project-A</artifactId>
      <version>1.0</version>
    </dependency>
  </dependencies>
</project>

排除依赖

代码中使用 exclusions 元素声明排除依赖,exclusions 可以包含一个或者多个 exclusion 子元素,因此可以排除一个或者多个传递性依赖。
声明 exclusion 的时候只需要 groupId 和 artifactId,而不需要 version 元素。

归类依赖

使用 properties 元素。


<project>
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.company</groupId>
        <artifactId>lol</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>LOL</name>
        <properties>
            <framework.version>3.2.3.RELEASE</framework.version>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>${framework.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>${framework.version}</version>
            </dependency>
            ...
        </dependencies>
        ...
    </project>

优化依赖

查看已解析的依赖: mvn dependency : list
查看当前项目的依赖树: mvn dependency : tree

生命周期

maven 的生命周期就是为了对所有的构建过程进行抽象和统一。
项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有构建步骤。

三套生命周期

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

clear 生命周期

目的:清理项目。
pre-clean 执行一些清理前需要完成的工作。
clean 清理上一次构建生成的文件。
post-clean 执行一些清理后需要完成的工作。

default 生命周期

目的:定义真正构建时所需要执行的所有步骤。是最核心的部分。
validate
initialize
generate-sources
process-sources 处理项目主资源文件。对src/main/resources 目录的内容进行变量替换等工作后,复制到项目输出的主 classpath 目录中。
generate-resources
process-resources
compile 编译项目的主源码。 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。
pre-integration-test
integration-test
post-integration-test
verify
install 将包安装到 Maven 本地仓库,供本地其他 Maven 项目使用。
deploy 讲最终的包复制到远程仓库,供其他开发人员和 Maven 项目使用。

site 生命周期

目的:建立和发布项目站点。
pre-site 执行一些在生成项目站点之前需要完成的工作。
site 生成项目站点文档。
post-site 执行一些在生成项目站点之后需要完成的工作。
site-deploy 将生成的项目站点发布到服务器上。

命令行执行

  • $mvn clean: 调用clean 生命周期的 clean 阶段。实际执行的阶段为 clean 生命周期的 pre-clean 和 clean 阶段。
  • $mvn test:调用default生命周期的 test 阶段。实际执行的阶段为default生命周期的validate到test的所有阶段。
  • $mvn clean install:调用clean生命周期的clean阶段和default生命周期的install阶段。实际执行的是clean生命周期的pre-clean、clean阶段和default生命周期的validate到install的所有阶段。该命令结合了两个生命周期,是执行真正项目构建之前清理项目的一个很好的实践。
  • $mvn clean deploy site-deploy:调用了clean生命周期的clean阶段和default生命周期的deploy阶段,以及site生命周期的site-deploy阶段。实际执行的是clean生命周期的pre-clean、clean阶段和default生命周期的所有阶段,以及site生命周期的所有阶段。

Maven的插件

Maven的生命周期与插件相互绑定,用以完成实际的构建任务。具体而言是生命周期的阶段与插件的目标相互绑定,以完成某个具体的构建任务。

内置绑定
Maven在核心为一些主要的生命周期阶段绑定了很多插件的目标
clean生命周期阶段与插件目标的绑定关系

生命周期阶段插件目标
pre-clean
cleanmaven-clean-plugin:clean
post-clean

site生命周期阶段与插件目标的绑定关系

生命周期阶段插件目标
pre-site
sitemaven-site-plugin:site
post-site
site-deploymaven-site-plugin:deploy

default生命周期与内置插件绑定关系及具体任务(打包类型: jar)

生命周期阶段插件目标执行任务
process-resourcesmaven-resources-plugin:resources复制主资源文件至主输出目录
compilemaven-compile-plugin:compile编译主代码至主输出目录
process-test-resourcesmaven-resources-plugin:testRresources复制测试资源文件至测试输出目录
test-compilemaven-compiler-plugin:testCompile编译测试代码至测试输出目录
testmaven-surefire-plugin:test执行测试用例
packagemaven-jar-plugin:jar创建项目jar包
installmaven-install-plugin:install将项目输出构件安装到本地仓库
deploymaven-deploy-plugin:deploy将项目输出构件部署到远程仓库

仓库

对于 SNAPSHOT 快照 ,生效时间的第二天。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值