暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Java框架笔记之Maven

java学途 2021-06-21
504


不点蓝字,我们哪来故事?




Maven是什么?为什么要使用Maven?

1、项目遇到的问题

  • 构建:编译代码,运行测试,打包,部署应用,运行服务器等;

  • 依赖:项目依赖大量的第三方包,第三方包又依赖另外的包;对依赖包的管理非常麻烦。


2、Maven 定义和作用

  1. Maven 翻译为“知识的积累”,“专家”,“行家”,是一个跨平台的项目管理工具

  2. Maven 主要用作基于 Java 平台的项目(Maven 本身也是 Java 编写的)的构建、依赖包管理和项目信息管理

  3. Maven 能提供一种项目的配置,配置好的项目,只需要运行一条简单的命令,就能完成重复的,繁琐的构建动作;

  4. Maven 能提供一种项目的依赖配置,配置好的项目,Maven 能自动的从 Maven 的中央仓库中帮我们下载并管理项目依赖的 jar 包,并且还能自动的管理这些 jar 包依赖的其他 jar 包;

  5. Maven 提供了一种标准的项目目录结构,测试命名规则等项目的最佳实践方案,统一了不同项目的学习成本(约定大于配置)。


Maven的目录结构

maven项目采用约定优于配置的原则:

  • src/main/java:约定用于存放源代码,

  • src/test/java:用于存放单元测试代码,(测试代码的包应该和被测试代码包结构保持一致,方便测试查找)

  • src/target:用于存放编译、打包后的输出文件。

这是全世界maven项目的通用约定,请记住这些固定的目录结构。

  项目名称

├───src

│   ├───main

│   │    └───java 项目java代码,不包含测试代码

│   │    └───resources 项目配置文件(资源库)

│   │    └───webapp web应用的目录,WEB-INF,jsp等

│   └───test

│       └───java 测试的java代码

│       └───resources 测试项目配置文件(资源库)

└───target

   │   └───classes

   │      └───cnblogs

   └───pom.xml   添加依赖,工程描述文件

ps:记住红色目录名


3、安装 Maven

  1. 检查JDK安装的情况(需要1.6以上的版本):

    1. 添加JAVA_HOME,需要指向JDK安装目录;

    2. 添加PATH,添加%JAVA_HOME%\BIN;

  2. 安装Maven:

    1. apache-maven-3.2.5-bin.zip解压到目录中(目录路径最好不要有空格和中文);

    2. 设置系统环境变量,MAVEN_HOME,指向maven的根目录


    3. 打开cmd窗口,敲入mvn –v 查看



3. 验证Maven安装

4. 额外的配置:

  1. Maven在构建大型业务项目的时候,十分消耗内存,可以为Maven的运行配置JVM内存:设置MAVEN_OPTS环境变量(中间是空格)

  2. -Xms128m -Xmx512m


4、Maven 目录结构

bin:包含了 Maven 的运行脚本文件;

boot:Maven 的依赖的类加载器;

conf:非常重要,Maven 的全局配置文件(settings.xml),定制 Maven 的运行行为;

lib:Maven 依赖的 jar 包(里面的 maven-model-builder-3.2.5.jar,后面再介绍)。


Maven 设置

1、.m2 目录

运行过 Maven 命令才会生成该目录,该目录默认情况下存放 Maven 本地仓库,本地仓库是一个 repository 文件夹,里面主要是一些下载的 jar 文件。

通过 mvn install 命令会把自己项目打成包存放在本地仓库中。

2、修改本地仓库的位置

本地仓库默认位置在 ${user.home}/.m2/repository,本地仓库不建议在系统盘,最佳实践:

2.1、将 Maven 根目录的 conf/settings.xml 拷贝到 .m2 中,作为个人 Maven 配置文件;

2.2、在 settings.xml 文件中 <localRepository> 修改本地仓库的位置。

3、配置中央仓库镜像

原因:有网情况,官方中央仓库在国外,下载很慢;无网情况(但在局域网),不能下载。


    3.1、有网情况

    在 setting.xml 中配置国内的阿里镜像:

    <mirror>  
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>
    </mirror>

        3.2、无网情况(很少用到)

        先在局域网找一个主机(可以上网)搭建 Maven 私服。

        再在 setting.xml 中配置 Maven 私服镜像:

      <mirror>  
      <id>localmaven</id>
      <name>local maven</name>
      <url>Maven 私服地址</url>
      <mirrorOf>central</mirrorOf>
      </mirror>


      Eclipse 中 Maven 的配置

      1、Eclipse 版本问题

      使用 Eclipse 4.5+ 不用安装 Maven 插件,而 STS、IDEA 也自带 Maven 插件。

      2、Maven 插件配置

      2.1、配置安装的 Maven

      2.2、配置用户设置

      2.3、其他设置


      搭建 Maven 项目(JavaSE 项目)

      1、创建项目

      1.1、选择建的是 Maven 项目

      1.2、选择跳过骨架建项目

      1.3、填写对应项目信息

      填完之后点击 Finish。


      2、pom.xml 文件介绍和添加依赖

      2.1、项目信息

      2.2 、依赖

      依赖配置相当于拷贝 jar。

      2.2.1、建索引添加依赖

      先打开 Maven Repositories 视图,禁用全局仓库索引,重建本地仓库索引:


      在 pom.xml 中右键选择 Maven - Add Dependency:

      在添加依赖的对话框中选择需要添加的依赖:

      2.2.2、从网站拷贝添加依赖

      网站:http://mvnrepository.com。


      选择所要的依赖和其版本:


      拷贝依赖:

      拷贝这个页面下面还会显示这个依赖所需的依赖,有些必须的 Compile Dependencies,Maven 会自动引入,还有显示其依赖的最低版本。


      3、使用 Maven 命令

      3.1、清除字节码

      右键项目:


      3.2、打包

      菜单自有命令有限,没有把包的菜单,所以可以右键项目:



      执行完生成的包文件会在项目中的 target 目录里。


      搭建 Maven 项目(JavaWeb 项目)

      1、选择跳过的骨架

      注意:此时项目的打包方式是 war。


      2、修改项目

      2.1、修改项目编译运行版本及编码

        <build>
        <plugins>
        <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
        <source>1.8</source><!-- 更新项目(Maven | Update Project)之后,会修改项目的编译版本 -->
        <target>1.8</target><!-- 更新项目之后,会修改项目的运行版本 -->
        <encoding>utf-8</encoding><!-- 更新项目之后,Java 编译器读取你的文件用的编码 -->
        </configuration>
        </plugin>
        </plugins>
        </build>

        2.2、添加 web.xml

          <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns="http://java.sun.com/xml/ns/javaee"
          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
          version="3.0">
          </web-app>

          2.3、添加依赖


          3、编写 Servlet


          4、配置 Tomcat 插件

            <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.1</version>
            <configuration>
            <port>80</port> <!-- 端口:tomcat默认端口是8080,浏览器端口是80,具体看是否更改过Tomcat的默人端口 -->
            <path>/</path> <!-- 上下路径 -->
            <uriEncoding>UTF-8</uriEncoding> <!-- 针对 GET 方式乱码处理 -->
            </configuration>
            </plugin>


            5、启动项目

            右键项目 Debug As - Maven build...,出来对话框,输入 tomcat7:run,选择 Debug 安装启动即可。


            概念解释

            1、Maven 中的坐标

            标识项目在仓库中的位置。主要由下面构成:

            • groupId:项目名称,一般使用公司或组织域名倒写,域名具有唯一性,区分不同公司;

            • artifactId:项目中 Maven 项目/模块名称,区分同一个公司的项目;

            • version:项目版本,区分同一个项目不同时期的特点。


            2、依赖

            配置项目所要依赖的 jar,在 pom.xml 使用 dependency 元素配置,通过坐标先从仓库找


            2.1、scope

            Maven 在编译,测试,运行的时候,各需要一套 classpath;(比如编译的时候会有编译的 classpath;测试的时候会有测试的 classpath;)scope 表明该依赖的项目和三个 classpath 的关系,即表示依赖什么阶段起作用,什么阶段不起作用。


            scope 主要可选值:

                1)compile:默认,适用于所有阶段,会随着项目一起发布,在编译,测试,运行时都有效;

                2)provided:编译和测试阶段使用;典型的如 servlet-api.jar,打包时不需要,容器来提供;

                3)runtime:测试和运行阶段使用,用于接口和实现分离,典型的如 jdbc 具体驱动实现;

                4)test:测试阶段使用,不会随项目发布,如 junit。

            在 pom.xml 中可通过 scope 元素来完成:


            2.2、依赖传递性

                 1)Maven的依赖是具有传递性的,比如 A -> B,B -> C,那么 A 间接的依赖于 C,这就是依赖的传递性,其中 A 对于 B 是第一直接依赖,B 对于 C 是第二直接依赖,C 为 A 的传递性依赖。

                 2)解决依赖繁琐的问题,比如说 A -> B -> C -> D -> ...。

                3)测试 junit4.8 和 junit4.9 的区别;并查看 junit4.9 依赖项目中的 pom.xml 文件。

                4)依赖的传递作用域(了解):


            2.3、optional

            依赖的可选:可选项目不会被传递。解决依赖传递带来问题,比如说你只依赖一个 mybatis3.4.5,仅做一个 HelloWorld 案列 ,但 mybatis.3.4.5 的其他功能的依赖会作为传递性依赖引入到项目中(对比 junit4.12、mybatis3.4.5)。

            在 pom.xml 中可通过  optional 元素来完成:

            2.4、exclusion

            排除传递性依赖。解决依赖传递之间版本冲突的问题,排除低版本。

            在 pom.xml 中可通过  exclusions 元素来完成:


            3、仓库

            3.1、仓库定义

            仓库用于统一管理和存放依赖包的地方,仓库中依赖包存放的方式和坐标的对应关系:groupId/artifactId/version/artifactId-version.packing(其中 packing 跟打包方式有关,打包方式有 jar、war、pom)。


            3.2、仓库分类

            本地仓库和远程仓库;组件仓库和插件仓库。

            安装 Maven 环境后,都需要设置本地仓库,在用户本地缓存下载插件或者项目 jar 包 ,先从本地仓库寻找,若本地仓库存在,直接使用;若本地仓库没有,连接中央仓库下载。

            远程仓库:

            中央仓库:由 Maven 官方统一维护一套 Maven 仓库 (提供所有 Maven 支持插件和依赖 );

            私服:存放第三方收费的 jar 包 (中央仓库没有的)和公司内部自己开发的 jar 包 ;

            其他公共库,比如阿里 Maven 仓库。


            3.3、中央仓库

            在 maven-model-builder-3.3.9.jar 中:

              <repositories>
              <repository>
              <id>central</id>
              <name>Central Repository</name>
              <url>https://repo.maven.apache.org/maven2</url>
              <layout>default</layout>
              <snapshots>
              <enabled>false</enabled>
              </snapshots>
              </repository>
              </repositories>

              id:仓库的 id,只有中央仓库 id 为 central,仓库的 id 必须唯一,若其他仓库 id 覆盖 central,则相当于覆盖了中央仓库;

              url:仓库的 URL 地址;

              layout:仓库的布局,Maven2 以上都用 default;

              snapshots:代表不从中央仓库中下载快照版本。

              可以在 settings.xml 中配置其他的公共仓库。


              3.4、仓库镜像

              若一个仓库完全和中央仓库同步,我们就可以选择这种仓库作为中央仓库的镜像仓库,覆盖中央仓库。

              在 settings.xml 中配置:

                <mirror>
                <id>alimaven</id>
                <name>aliyun maven</name>
                <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
                <mirrorOf>central</mirrorOf>
                </mirror>

                <mirrorOf>,对哪些仓库做镜像,可以如下配置:

                • *:匹配所有的仓库

                • external:*:所有远程仓库(localhost,file 除外);

                • rep1,rep2:rep1 和 rep2;

                • *,!rep1:除了仓库 rep1 其他所有的。


                UML

                UML 应用于软件工程领域,UML 用来描述建模的概念有:类、对象、关联、职责、行为、接口、用例、包、顺序、协作,以及状态。

                UML可以辅助我们分析和设计复杂的系统它用于帮助软件开发人员进行思考和记录思路的结果


                ————  e n d ————


                觉得文章不错,欢迎点在看转发,长按识别二维码关注公众号 java学途,了解更多精彩。




                点在看,让更多看见。



                文章转载自java学途,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论