(学习笔记)Maven基础

1.目前掌握的技术

2.目前的技术在开发中存在的问题【why】

    1. 一个项目就是一个工程

如果项目非常庞大,就不适合继续使用package来划分模块。最好是每一个模块对应一个工程,利于分工协作。

解决方法:借助Maven就可以将一个项目拆分成多个工程。

    1. 项目中需要的jar包必须手动"复制"、 “粘贴”到WEB-INF/lib目录下

带来的问题:同样的jar包重复出现在不同的项目工程中,一方面浪费存储空间,另一方面也会让项目工程比较臃肿。

解决方法:借助于Maven,可以将jar包仅仅保存在"仓库“中,有需要的使用的工程“引用”这个文件接口,并不需要真的把jar包复制过来。

    1. jar包需要别人替我们准备好,或者到官网下载

不同技术的官网提供jar包下载的形式是不同的。

有些技术的官网就是通过Maven或者SVN等专门的工具来提供下载的。

非官方方式下载的jar包,其中的内容可能是不规范的。

解决办法:借助于Maven我们可以以一种规范的方式下载jar包,因为所有知名框架或者第三方工具的jar包已经按照统一的规范存放在了Maven的中央仓库中。所以,以规范的方式下载的jar包,内容也是可靠的。

    1. 一个jar包依赖的其他jar包需要自己手动加入到项目中

文件的上传需要File Upload组件—>IO组件。相互依赖的jar包,如A.jar需要依赖于B.jar,当导入A.jar包时,maven会自动导入B.jar。

3. Maven是什么【what】

    • Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)
    • POM(Project Object Model):项目对象模型

1. Maven是一款服务于java平台的自动化构建工具。(Maven本身也是Java写的)

Make ——> Ant ——> Maven ——> Gradle

2.构建

      1. 概念:以“Java源文件”、“框架的配置文件”、“JSP”、“HTML”、“图片”等资源为“原材料”,去“生产”一个可以运行的项目的过程。
        1. 编译
        2. 部署
        3. 搭建
      2. 编译:Java源文件[User.java]——>编译——>Class字节码文件[User.class]——>交给虚拟机JVM去执行。
      3. 部署:一个BS项目最终运行的并不是动态Web工程本身,而是这个动态Web工程”编译的结果“。
        1. 生的鸡——>处理——>熟的鸡
        2. 动态Web工程——>编译、部署——>编译结果
      4. 构建过程中的各个环节
        1. 清理:将以前编译得到的旧的class字节码文件删除,为下一次编译做准备
        2. 编译:将Java源程序编译成为class字节码文件
        3. 测试:自动测试,自动调用junit程序
        4. 报告:测试程序执行的结果
        5. 打包:动态Web工程打war包,Java工程打jar包
        6. 安装:Maven特定的概念——将打包得到的文件复制到“仓库”中的指定位置
        7. 部署:将动态Web工程生成的war包复制到Servlet容器的制定目录下,使其可以运行
      1. 自动化构建

4.安装Maven核心程序

    1. 检查JAVA_HOME
    2. 解压Maven核心程序的压缩包,放在一个非中文无空格路径下
    3. 配置Maven相关的环境变量
      1. MAVEN_HOME或者M2_HOME
      2. path

5.Maven的核心概念:mvnrepository.com

    1. 约定的目录结构
    2. POM
    3. 坐标:
      1. Maven中的坐标用于描述仓库中资源的位置
      2. Maven坐标主要组成
        1. groupid:定义当前 Maven项目隶属于组织名称(通常是域名反写,例如:org.mybatis)
        2. artifactid:定义当前Maven项目名称(通常是模块名称,例如CRM、SMS)
        3. version:定义当前项目版本号
        4. packaging:定义该项目的打包方式 (不属于Maven的坐标)
        5. 作用:使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交由机器完成。
    4. 依赖
      1. 依赖配置
        1. 依赖指当前项目运行所需的jar,一个项目可以设置多个依赖
        2. 格式:
<!-- 设置当前工程所依赖的所有jar--> 

<dependencies> 

<!-- 设置具体依赖--> 

<dependency> 

<!-- 依赖所属群组id--> 

<groupId>junit</groupId> 

<!-- 依赖所属项目id--> 

<artifactId>junit</artifactId> 

<!-- 依赖版本号--> 

<version>4.11</version>

<!-- 作用域--> 

<scope>test</scope> 

</dependency> 

</dependencies>
      1. 依赖传递

        1. 依赖具有传递性:
          1. 直接依赖:在当前项目中通过依赖配置建立的依赖关系
          2. 间接依赖:被资源的资源如果依赖其他资源,当前项目间接依赖其他资源。

        1. 依赖传递冲突问题:
          1. 路径优先:当前依赖中出现相同资源时,层级越深,优先级越低,层级越浅,优先级越高。
          2. 声明优先:当资源在相同层级被依赖时,配置顺序靠后的覆盖配置顺序靠前的。
          3. 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的。

      1. 可选依赖
        1. 可选依赖指对外隐藏当前依赖的资源---不透明
<dependency> 
<groupid>junit</groupid> 
<artifactId>junit</artifactId> 
<version>4.12</version> 
<!--可选依赖:不透明--> 
<optional>true</optional> 
</dependency>
      1. 排除依赖
        1. 排除依赖指主动断开依赖的资源,被排除的资源无需指定版本——不需要
<dependency>
 <groupid>junit</groupid>
 <artifactId>junit</artifactId>
 <version>4.12</version>
 <!-- 排除依赖-->
 <exclusions>
 <!-- 排除具体依赖-->
 <exclusion> <groupId>org.hamcrest</groupId>
 <artifactId>hamcrest-core</artifactId>
 </exclusion> </exclusions>
 </dependency>
      1. 依赖范围
        1. 依赖的jar默认情况下可以在任何地方使用,可以通过scope标签设定其作用范围
        2. 作用范围:
          1. 主程序范围有效(main文件夹范围内)
          2. 测试程序范围有效(test文件范围内)
          3. 是否参与打包(package指令范围内)

        1. 依赖范围的传递性:
          1. 带有依赖范围的资源再进行传递时,作用范围将会受到影响

    1. 仓库(repository)
      1. 仓库用于存储资源,包含各种jar包
      2. 仓库的分类:
        1. 本地仓库:自己电脑上存储资源的仓库,连接远程仓库资源

<localRepository>/Users/mahuan/Documents/programFile/maven-repository</localRepository>

        1. 远程仓库:非本机电脑上的仓库,为本地仓库提供资源
          1. 中央仓库:Maven团队维护,存储所有资源的仓库

<!-- 配置具体的仓库的下载镜像--> <mirror> <!-- (必填项)此镜像的唯一标识符,用来区分不同的mirror元素 --> <id>nexus-aliyun</id> <!-- (必填项)对哪种仓库进行镜像,简单来说就是代替哪个仓库 --> <mirrorOf>central</mirrorOf> <!-- (选填项)镜像名称--> <name>Nexus aliyun</name> <!-- (必填项)镜像URL--> <url>https://repo.maven.apache.org/maven2/</url> </mirror>

          1. 私服:部门/公司范围内存储资源的仓库,从中央仓库中获取资源
          2. 全局setting和用户setting的区别
            1. 全局setting定义了当前计算器中Maven的公共配置
            2. 用户setting定义了当前用户的配置(可以在自定义仓库外面再复制一个setting.xml,作用是比如自己公司有自己的私服,所以在这个XML文件中修改镜像的下载地址。
      • 私服的作用:
        1. 保存具有版权的资源,包含购买或自主研发的jar
          1. 中央仓库的jar都是开源的,不能存储具有版权的资源
        2. 一定范围内共享资源,仅对内部开放,不对外共享
    • 生命周期/插件/目标
      1. 构建生命周期
        1. 编译——>对测试代码编译——>测试——>打包——>安装;

        1. Maven构建生命周期描述的是一次构建过程经历了多少个事件
        2. Maven对项目构建的生命周期分为三套
          1. clean:清理工作
            1. clean生命周期

          1. default:核心工作,例如编译、测试、打包、部署等等
            1. defaylt生命周期

          1. site:产生报告,发布站点等
            1. site生命周期

      1. 插件(到Maven官网,查看插件功能)
        1. 插件与生命周期内的阶段进行绑定,在执行到对应生命周期时执行对应的插件功能

        1. 默认Maven在各个生命周期上绑定有预设功能
        2. 通过插件可以自定义其他功能

总结:生命周期表示几岁,插件表示对应几岁所干的那件事

    1. 继承
    2. 聚合

6.第一个Maven工程

    • 创建约定的目录结构
      1. 根目录:工程名;
      2. src目录:源码;
      3. pom.xml文件:Maven工程的核心配置文件;
<?xml version="1.0" encoding="UTF-8"?> <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.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 项目分组-->
 <groupId>org.mh.example</groupId>
 <!-- 项目名称-->
 <artifactId>My_Study_Maven_A</artifactId>
 <!-- 版本号-->
 <version>1.0-SNAPSHOT</version>
 <properties>
 <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target>
 </properties>
 </project>

​​​​​​​

      1. main目录:存放主程序;
      2. test目录:存放测试程序;
      3. Java目录:存放Java源文件;
      4. resource目录:存放框架或其他工具的配置文件;
    • 为什么要遵守约定的目录结构?
      • Maven要负责我们这个项目的自动化构建,以编译为列,Maven要想自动进行编译,那么它必须知道Java源文件保存在哪里。
      • 如果我们自己自定义的东西想要让框架或工具知道,有两种办法:
        • 以配置的方式明确告诉框架

classpath:spring-context.xml

        • 遵守框架内部已经存在的约定

log4j.properties

log4j.xml

约定 > 配置 > 编码

7.常用Maven命令

    1. 注意:执行与构建过程相关的Maven命令,必须进入pom.xml的目录

于构建过程相关:编译、测试、打包、....

    1. 常用命令
      1. mvn clean:清理
      2. mvn compile:编译主程序
      3. mvn test-complie:编译测试程序
      4. mvn test:执行测试
      5. mvn package:打包 ---- 包含了前面很多操作,它要确保要打包的项目没有问题。
      6. mvn install:安装到本地仓库 --- 将刚刚打包的jar包放入到本地仓库中去

8.关于联网问题

    1. Maven的核心程序中仅仅定义了抽象的生命周期,但是具体的工作必须由特定的插件来完成。而插件本身并不包含在Maven的核心程序中。
    2. 当我们执行的Maven命令需要用到某些插件时,Maven核心程序会首先到本地仓库中查找。
    3. 本地仓库的默认位置:[系统中当前用户的家目录:\.m2\repository]
    4. Maven核心程序如果在本地仓库找不到需要的插件,那么它会自动连接外网,到中央仓库去下载。
    5. 如果此时无法连接外网,则构建失败。

构建Web项目后的pom.xml文件的详细解释:

<?xml version="1.0" encoding="UTF-8"?>

<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.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!--    指定pom的模型版本 -->
  <modelVersion>4.0.0</modelVersion>
<!--    组织id-->
  <groupId>org.example</groupId>
<!--    项目id-->
  <artifactId>My_Study_Maven_Web_A</artifactId>
<!--    版本号:release:完成版;sanapshot:开发版-->
  <version>1.0-SNAPSHOT</version>
    <!--    打包方式:Java工程打jar包,Web工程打war包-->
  <packaging>war</packaging>

  <name>My_Study_Maven_Web_A Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <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>
  </properties>

<!--    工程的全部依赖-->
  <dependencies>
<!--      具体依赖-->
    <dependency>
<!--        组织id-->
      <groupId>junit</groupId>
<!--        项目id-->
      <artifactId>junit</artifactId>
<!--        版本号-->
      <version>4.11</version>
<!--        作用域-->
      <scope>test</scope>
    </dependency>
  </dependencies>

  <!-- 构建 -->
  <build>
    <!-- 设置插件-->
    <plugins>
<!--      具体的插件-->
      <plugin>
          <groupId>org.apache.tomcat.maven</groupId>
          <artifactId>tomcat7-maven-plugin</artifactId>
          <version>2.1</version>
<!--          设置端口-->
          <configuration>
<!--              端口号-->
            <port>80</port>
<!--               设置虚拟路径-->
            <path>/</path>
          </configuration>
      </plugin>
    </plugins>
  </build>
</project>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值