Maven学习的积累 (八月)

一、Maven简介

 
 

1、什么是Maven

            Apache Maven 是一个软件项目管理和构建工具,可以帮助我们去创建和管理项目
            基于项目对象模型POM(Project Object Model)的概念,帮助开发者构造一个项目完整生命周期
        注: POM是Maven对一个项目的描述,是Maven的核心,一个POM其实就是一个XML文件
 

2、为什么使用Maven

 

2.1 项目管理工具

 
        项目规则很大时一定会将项目进行拆分,将一个项目拆分成多个模块,每个模块对应一个工程,多个工程之间存在依赖关系
 

2.2jar包的管理工具

 
  • 通过仓库管理jar包
                多个项目可能会用到相同的jar包,每个项目都要导入jar包,太过麻烦
                此时可以通过Maven将jar包放到仓库当中,在每个项目中引用仓库的jar包
  • 解决jar包的依赖
                jar包之间存在依赖关系,并且依赖层次很复杂,很难记住
                此时可以使用Maven,帮助我们自动解决jar包间的依赖关系
 
  • 自动下载jar包
                项目中使用的jar数据很多,自己下载并手动添加jar包            
                此时可以使用Maven,帮助我们自动下载所有相关的jar包

2.3 自动化的构建工具

            
        构建过程:编译主代码——> 编译测试代码——>执行单元测试——>生产测试报告——>打包——>部署
 

3. 术语

 

3.1 中央仓库

            
            是一个网络仓库,存储jar包和Maven插件
 
             https://repo1.maven.org/maven2/
             https://mvnrepository.com/
 

3.2 本地仓库

            
            从中央仓库下载的jar包的存放位置,也是一个仓库,只不过是存放在本地电脑上
 

3.3 镜像仓库

 
            对某一仓库做镜像
            

3.4 私服

 
            局域网内部搭建的maven服务器
 
 

4. 单词

        
        repository 仓库
        archetype 原型、骨架(模板)
        artifact 手工制品、成品

 

二、 安装maven

 

            1、下载安装包

                    maven 3.2.5版本要求 jdk1.6,  其后的版本要求 jdk1.7
 
 

            2、解压缩

                    解压到无中文、无空格,不需要安装
 

            3、配置环境变量

                    Maven依赖于JAVA_HOME
 
                   
      echo $JAVA_HOME            echo %JAVA_HOME%
 
                    Maven环境变量:
  • M2_HOME=Maven安装目录
  • mvn  -v

            4、配置本地仓库

                4.1 本地仓库的默认位置

                    ~/.m2/repository
                

                4.2 修改本地仓库的位置

                    编辑maven核心配置文件  conf/setting.xml
<localRepository>/Users/sh4060/Maven/maven-repo</localRepository>

 

                    测试:
cd maven/maven-projects
mvn archetype:generate  #使用maven创建项目
                  提示:
  • 选择创建项目时使用的模板archetype;  回车
  • 输入groupId, 一般为组织域名反向+项目名: com.itany.ums
  • 输入artifactId: test
  • 版本:按回车
  • 包名:按回车
  • 确认:按回车
 
 

              5、配置镜像仓库

                    编辑 conf/setting.xml
<mirrors>
   <mirror>
      <id>aliyun</id>
      <mirrorOf>*</mirrorOf><!-- 所有访问都使用该镜像仓库 -->
      <name>aliyun maven</name>
      <url>https://maven.aliyun.com/nexus/content/groups/public/</url>
   </mirror>
 </mirrors>
            

            

             6、配置Maven的JDK版本

 
                         默认使用maven创建项目使用的是jdk 1.5
 
                         修改maven默认使用的jdk版本,编辑conf/setting.xml,在profiles标签中添加如下内容:
        
  <profiles>
      <profile>
           <id>jdk-1.8</id>

           <activation>
             <activeByDefault>true</activeByDefault>
             <jdk>1.8</jdk>
           </activation>
           <properties>
               <maven.compiler.source>1.8</maven.compiler.source>
               <maven.compiler.target>1.8</maven.compiler.target>
               <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
           </properties>
        </profile>

 

 
 
 

三、 创建Maven项目

 

1.Java 项目的创建

 

1.1 目录结构

 
        Java工程约定的目录结构如下:
|-项目名称
    |-src    //程序代码
       |-main  //程序的主代码
            |-java //源代码    
                |-用于存放源代码,相当于传统的src,如com.itany.usm.dao.UserDao
            |-resources //配置文件
                |-用于存放配置文件
       |-test  //测试代码,目录结构与main中一样
            |-java
            |-resources
    |-pom.xml//maven核心配置文件
     

1.2 基本操作

        
            步骤:
                1.创建Java项目
   mvn  archetype:generate
                
                    制定的信息如下:
    archetype:(maven-archetype-quickstart) #使用骨架构建java项目
    groupId:com.itany.study #制定组织名反向+项目名
    artifactId:sms #制定模块名称
    version:1.0.1  #版本
    package:com.itany.study #包名
 
                2.执行maven操作
        
    cd sms #先切换到项目所在目录
    mvn compile #执行编译
    mvn clean compile test package #一次可执行多命令
 

2.Web项目的创建

 

        1.1 目录结构

                Web项目的约定目录结构如下:
|-项目名称
    |-src    //程序代码
       |-main  //程序的主代码
            |-java //源代码    
                |-用于存放源代码,相当于传统的src,如com.itany.usm.dao.UserDao
            |-resources //配置文件
                |-用于存放配置文件
             |-webapp //网站根目录,相当于传统web项目WebRoot
                |-WEB-INF
                     |-web.xml
       |-test  //测试代码,目录结构与main中一样
            |-java
            |-resources
    |-pom.xml//maven核心配置文件
 

        1.2 基本操作

                   步骤:
                    1.创建 web项目
        mvn  archetype:generate
                 指定信息如下:
        archetype:(maven—archetype-webapp)  #使用模板创建web项目
 
                    2.执行maven操作
       
        mvn clean compile package
 
                    3.发布
 
                        tomcat
                
                        mvn自带的Tomcat插件
 
 
 
 

四、 Maven命令

 
1. 常用命令
 
 
命令
作用
描述
archetype
创建maven项目
根据模板生成项目的骨架
clean
清理
删除target目录
compile
编译
将main中的源代码编译成字节码,放在target/calsses目录下
test
测试
执行测试类(使用Junit),并生成测试的报告
package
打包
将java项目打包成jar文件,将web项目打包成war文件,放在target目录
install
安装
将项目jar包安装在本地仓库中,供其他项目使用
deploy
发布/安装
将项目jar包安装在中央仓库中,供其他项目使用,需要账户密码(了解)
site
站点
生成关于项目介绍的网页
注意:
  • 所有的命令都要跟在mvn的后面,如mvn archetype
  • 所有的命令都必须在某个项目根目录
  • 多个命令可以一起执行
 
 
2.生命周期
 
            一个项目的构建build的过程通常包括:清理、编译、测试、打包、集成测试、部署等
 
            Maven定义了三套生命周期:clean、default、site
 
            每个生命周期之间是互相独立的,每个生命周期都包含多个阶段,
 
            default生命周期包含:compile、test、package
 
 
 
 

五、 在IDE中使用Maven

 
 
 

1.IDE工具

 
  • MyEclipse
  • 集成Maven插件
  • Eclipse
  • Eclipse for Java EE
  • IDEA
  • 集成Maven
 
配置maven
  • 指定maven安装目录和配置文件
  • 自动更新maven项目:勾选import maven Projects automatically
 
 
目录的类型
 
    IDEA中目录是分类型的,常用的四种:
  • Sources root 主代码的目录 src/main/java
  • Test Source Root 测试代码的目录 src/test/java
  • Resources Root 主代码所需资源的目录src/main/resources
  • Test Resources Root测试代码所需资源的目录src/test/resources
注:再IDEA中默认创建的目录都是普通的Directory,创建后需要设置目录的类型
 

 

六、 pom.xml 文件

 
 

1.简介

 
    pom:project object model项目对象模型
 
    pom.xml是Maven的核心配置文件
 
一个Maven项目有且只有一个pom.xml文件,该文件必须在项目的根目录下
 
 
 

2.坐标

 

   2.1什么是坐标

 
            用来唯一的标识每个标识,必须为maven项目自定义坐标,坐标必须唯一
 
            目的是为了让其他的maven项目可以使用该项目生成的jar包
 

    2.2坐标详解

 

            Maven坐标是通过一些元素来定义的:groupId、artifactId、version
 
<!—

        坐标:
            groupId:组织Id,表示当着模块所隶属的项目
            artifactId:模块id
            version:当前的版本

    ——>
<groupId> com.itany.study</groupId>
<artifactId>maven01</artifactId>
<version>1.0-SNAPSHOT</version>

 

 

3.dependency

 

3.1 基本配置

 
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.38</version>
</dependency>

 

 

3.2 scope作用域

 
        表示依赖的作用域,用来配置以来的jar包可以使用的范围
 
取值
含义
举例
compile
该依赖可以在整个项目中使用,参与打包部署
commons—fileupload
test
该依赖只能在测试代码中使用,不参加打包部署
junit
 
provided
该依赖编写源代码时需要,不参与打包部署
servlet-api、jsp-api
runtime
该依赖编写代码时不需要,运行时需要,参与打包部署
mysql-connector
system
表示使用本地系统路径下的jar包,需要和systemPath一起使用
ojdbc.jar
 
 
 

4. properties 

 
        全局属性,一般情况下用于定义全局的
 
<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <maven.compiler.source>1.7</maven.compiler.source>
  <maven.compiler.target>1.7</maven.compiler.target>
  <mysql-connector-java.version>5.1.38</mysql-connector-java.version>
  <junit.version>4.11</junit.version>
</properties>

 

 
 

5.repositories

 
        用来配置当前工程使用的远程仓库
 
        依赖查找顺序:本地仓库——>setting.xml中配置的远程仓库
 
<!--  配置远程仓库 -->
  <repositories>
       <!--  有些最新的jar包,可能在中央仓库上并没有提供,此时可以使用jar包官方提供的仓库 -->
    <repository>
        <id>spring_repo</id>
        <url>http://repo.spring.io/milestone</url>
    </repository>
  </repositories>
</project>

 

 
 
 

6.plugins

 
        配置插件,是一种工具
        
 
       
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-clean-plugin</artifactId>
      <version>2.6.1</version>
    </plugin>

    <plugin>
      <groupId>org.apache.tomcat.maven</groupId>
      <artifactId>tomcat7-maven-plugin</artifactId>
      <version>2.2</version>
      <configuration>
      <path>/maven01</path>
      <port>8888</port>
    </configuration>
    </plugin>
  </plugins>
</build>

 

 

7.超级POM

 
        所有的pom.xml文件都继承一个父POM,这个父POM称为超级POM
 

七、 Maven中的关系

 

1.继承 

        一个Maven项目可以继承自另一个Maven项目,分别称为子项目、父项目
 
        场景:多个子项目中使用的是像马桶的依赖或者插件,此时可以把相同的配置抽取到一个父项目中,进行统一的管理,保持一致性
 
 
        步骤:
                1.将父项目的打包方式设置为pom
<!--
    打包方式:
        jar:Java项目的打包方式,默认值
        war:Web项目的打包方式
        pom:父项目的打包方式
        -->
  <packaging>pom</packaging>

 

             
               2. 在子项目中引用父项目,指定父项目的坐标
 
<!--  引用父项目,指定父项目的坐标-->
<parent>
  <groupId>com.itany.study</groupId>
  <artifactId>parent</artifactId>
  <version>1.0-SNAPSHOT</version>
  <!-- 指定父项目的pom.xml文件的相对物理路径-->
  <relativePath>../parent/pom.xml</relativePath>
</parent>

 

 
 
     问题:有时并不是父项目的所有依赖都需要被子项目继承,但是又希望能够通过父项目对依赖进行统一管理,如版本的控制
     解决:使用dependencyManagement
     步骤:
            1.在父项目中配置dependencyManagement
 
<dependencyManagement>
  <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
  <dependencies>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

 

 
            2.在子项目中引用父项目中的依赖
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
</dependency>

 

 
 

2.聚合

 
 
 
 
        将多个子项目添加到一个父项目中,然后通过父项目进行操作,从而实现对所有聚合的子项目的操作
 
<!--  聚合子项目,指定子项目的跟目录-->
  <modules>
  <module>../child01</module>
  <module>../child02</module>
  </modules>

 

 
 

3.依赖

 
        项目C——>项目B——>项目A
 
        概念:如果项目C依赖于项目B,项目B依赖项目A,则项目C也依赖于项目A,这叫依赖的传递性
 
        配置依赖关系:child03——>child02——>child01
<!—依赖于child01-->  
<dependency>
    <groupId>com.itany.study</groupId>
    <artifactId>child01</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

 

  

  3.1控制依赖的传递

 
                并不是所有的依赖都会被传递:
  • scope为compile的依赖会被传递
  • scope为test的依赖不会被传递
  • 配置optional为true的依赖不会被传递
<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <optional>true</optional>
</dependency>

 

  3.2 不会出现jar包的冲突

 
            使用Maven不会jar包冲突,通过两个原则保证:
  • 就近原则  child03——>child02——>child01 01和02有同一jar包不同版本  03优先用近的02
  • 优先定义原则  先定义哪个用哪个
 

        3.3 不要传递的依赖

                    方式1:在依赖的配置中配置不允许传递
<optional>true</optional>

 

 
           方式2:在当前项目中配置不接受传递的特定依赖
 
  
<!—依赖于child01-->  
    <dependency>
        <groupId>com.itany.study</groupId>
        <artifactId>child01</artifactId>
        <version>1.0-SNAPSHOT</version>
    <!--不接受特定的依赖-->
        <exclusions>
          <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
          </exclusion>
        </exclusions>
    </dependency>
 

八、 Maven综合应用

 

1、分析

 
        将项目分为多个工程,可以按层次分,也可以按模块,或同时按层次和模块分
 
        以ums为例,使用maven创建和管理项目:
  • 父工程:ums-parent
  • dao工程:ums-dao
  • sevice工程:ums-service
  • action工程:ums-action
    

2、步骤

 

        2.1 创建工程

 

        2.2 配置依赖

                
                1.在父工程添加依赖
                2.在子工程中引用依赖

 

2.3 配置dao工程

 
    映射文件存储位置,两种方式:
  • 将映射文件放在resource目录下   会被打包部署
  • 将映射文件放在java目录下   默认只会对该目录下的java代码进行打包部署,如果希望对该目录下的配置文件也进行打包,需要额外的配置
 
 
<resources>
    <resource>
      <directory>src/main/java</directory>
      <includes>
        <include>**/*.xml</include>
        <include>**/*.properties</include>
      </includes>
      <filtering>false</filtering>
    </resource>
    <resource>
      <directory>src/main/resources</directory>
      <includes>
        <include>**/*.xml</include>
        <include>**/*.properties</include>
      </includes>
      <filtering>false</filtering>
    </resource>
</resources>

 

 

2.4 配置service

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值