Maven学习

基础知识

maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具,可以帮助我们更有效的管理项目,极大可能的避免因运行环境不同导致的项目不能运行的问题。

maven文件目录

bin: mvn运行的一些脚本,m2.conf 配置文件

boot: 类加载器

conf :配置文件

lib :mvn运行时类库

Maven目录结构

maven项目目录

Maven学习_第1张图片

创建maven项目目录

用archetype插件来创自动建目录,有两种方式

  • mvn arcgetype:generate 按照提示里创建
  • mvn archetype:generate -DgruopId =xx -DartifactedId=xx -Dversion=xx -Dpackage=xx 一次性创建

groupId:一般为组织名,公司名网址的反写+项目名

artifactId:项目名-模块名

maven中的坐标和仓库

坐标:所有构件都通过坐标唯一确定位置

<img src=" title="" width="434" height="70">

groupId artifactId 和 version组成坐标,在项目里建立包的时候,包名应该与groupId和artifactId相吻合

仓库

  • 本地仓库
  • 远程仓库 :本地找不到会从远程仓库中找,如果远程仓库没有的话则会报错 http://search.maven.org
  • 镜像仓库:外网无法访问时使用,maven-conf–>settings

    • Maven学习_第2张图片
    • mirrorOf表示对哪个仓库进行镜像,比如对central进行镜像,那么所有对central仓库的访问都会转到url的地址中,也可以使用*进行通配操作
  • 仓库位置:默认是在用户目录的(user)下的.m2文件夹中(windows下),修改settings中的localRespository即可

maven的生命周期和插件

完整项目的构建过程包括:清理,编译,测试,打包,继承测试,验证,部署

maven生命周期包括 clean ,compile ,test,package,install操作 (package的时候test和compile会自动进行),执行声明周期的某个阶段时,前面的阶段会被依次执行,主要分为以下三个主要的步骤:

clean 清理项目:pre-clean执行清理前的工作==>clean清理上一次构建生成的所有文件=>post-clean执行清理后的文件

default 构建项目:最核心的,compile test package install

site 生成项目站点:pre-site 在生成项目站点前要完成的工作=>site生成项目的站点文档=>post-site在生成项目站点后要完成的工作=>site-deploy发布生成的站点到服务器上

常用命令

mvn -v 查看版本

mvn compile 编译

mvn test 测试

mvn package 打包

mvn clean 删除上次编译字节码文件

maven install 安装jar包到本地仓库中

pom解析

pom.xml常用元素



#project 指明了pom的一些约束信息
<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指明了当前pom的版本
  <modelVersion>4.0.0modelVersion>
  <properties>
  #属性,类似于表达式,后面用${version}引用即可
        <property>
           <version>1.0.0version>
        property>
  properties>
#下面的一组坐标指明当前的maven属于的实际项目
  <groupId>com.tobinwang.demo2groupId>
  <artifactId>demo2-test1artifactId>
  <version>1.0.0version>
#第一个0表示大版本号,第二个0表示分支版本号,第三个0表示小版本号
#snapshot 快照|alpha 内部测试|beta 公测|Release 稳定|GA正式发布

  <packaging>packaging>
  #打包方式,不指定的话默认为jar,还可以打包成war等等

  #name项目描述名
  <name>demo2-test1name>
  
  #项目地址
  <url>http://www.example.comurl>
  #项目描述
  <description>this is a test project description>
  #开发人员
  <developers> developers>
  #许可证信息
  <licenses>licenses>
  #组织信息
  <organization>organization>

  <properties>
    <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    <maven.compiler.source>1.7maven.compiler.source>
    <maven.compiler.target>1.7maven.compiler.target>
  properties>

  #dependencies依赖列表
  <dependencies>
    <dependency>
    #依赖包的坐标
      <groupId>junitgroupId>
      <artifactId>junitartifactId>
      <version>4.11version>
    #scope依赖范围,如只在test范围类有用
      <scope>testscope>
      #设置依赖是否可选,如果为False那么子项目默认是继承,如果为True那么就要显式的引入依赖
      <optional>optional>
      #排除依赖传递列表,比如A依赖B,B依赖C,如果A不想用C,就用排除依赖
      <exclusions>
      <exclusion>exclusion>
      exclusion?
    dependency>
  dependencies>

  #dependencyManagement用来管理依赖
  <dependencyManagement>
        <dependencies>
            <dependency> dependency>
        dependencies>
  dependencyManagement>

#为构建行为提供相应的支持
  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <artifactId>maven-clean-pluginartifactId>
          <version>3.0.0version>
        plugin> 
      plugins>
    pluginManagement>
  build>

  #parent继承父类的pom
  <parent> parent>
  <modules>
  #指定子模块,这样编译的时候可以一起编译
    <module>module>
  modules>

project>

GroupID是项目组织唯一的标识符, 比如我的项目叫test001 那么GroupID应该是 com.lixiaoming.test001 域名.公司名.项目名

ArtifactID就是项目的唯一的标识符, 一般是 项目名-xxx 比如test001-model

在pom中配置依赖时,GroupID一般为组织名(比如org.apache.spark),ArtifatID一般为包名

非编译器环境下建立mvn项目

目录结构如上所示,根目录下有src和xml文件,src下要有main和test文件夹,各自文件夹下的包结构要规范

<img src=" title="" width="385" height="98">

pom配置如下图所示,主要添加项目所用到的包,dependency

Maven学习_第3张图片

配置完后,在项目目录下进行编译(mvn compile),然后测试(mvn test)(测试部分的代码应该是没有被mvn compile编译的,当使用mvn test的时候才进行编译),最后打包(mvn package)

pom的dependency-scope属性

scope表示依赖的范围

从官网可以看到一共有六个属性值,分别为compile,provided,runtime,test,system,import

Maven学习_第4张图片

compile:在测试编译运行的时候都有效

provided:在编译和测试的时候有效

runtime:在测试和运行时有效

test:只在测试的时候有效

system:在编译和测试时有效,与本地系统(路径)相关

import:表示从其他pom中继承过来的依赖,比如

<dependency>
  <groupId> mavengroupId>
  <artifactId>AartifactId?
  <verison>1.0.0version>
  <type>pomtype>
  <scope>importscope>
  表示引入项目A的依赖关系

pom的依赖和依赖冲突

依赖:

在一个项目中的dependency中田添加另一个项目的坐标即可,一般会产生传递依赖,如果不需要传递依赖,就要配置exclusion标签,加坐标即可(被排除的包)

 <exclusions>
      <exclusion>
          <groupId> mavengroupId>
          <artifactId>AartifactId>
          <verison>1.0.0version>
      exclusion>
  exclusion>

依赖冲突:

原则:

1.短路优先:优先解析路径短的版本

A-->B-->C-->x
A-->D-->X 

2.路径相同长度时,谁先声明谁优先

聚合和继承

聚合
<packaging>pompackaging>
<modules>
<module>module1module>
<module>module2module>
<module>module3module>
modules>

使用module时,packaging要使用pom

继承

避免配置重复,用父类,父类中的公共配置部分放到

<dependencyManagement> dependencyManagement>

在子类中用parent标签引入父类的坐标即可

<parent>
    <groupId> mavengroupId>
    <artifactId>AartifactId>
    <verison>1.0.0version>
parent>

你可能感兴趣的:(研发管理工具)