Maven实战从入门到精通(全)

简介: 目录前言1. 安装及配置2. 核心概念前言了解Maven的具体概念、功能、具体执行步骤以及如何搭建等Maven 具体功能:maven 是自动化构建工具,可以部署项目;管理jar文件,自动下载jar、文档和源代码;管理jar直接的依赖以及版本;编译程序,把java编译为class;测试代码是否正确;打包文件,形成jar文件或者war文件具体构建步骤:构建是面向过程,主要步骤是清理:把之前项目编译的东西删除掉,为新的编译代码做准备。编译: 把程序源代码编译为执行代码, 把java编译成clas

前言

了解Maven的具体概念、功能、具体执行步骤以及如何搭建等
本地仓库资源

在这里插入图片描述

Maven 具体功能:
maven 是自动化构建工具,可以部署项目;管理jar文件,自动下载jar、文档和源代码;管理jar直接的依赖以及版本;编译程序,把java编译为class;测试代码是否正确;打包文件,形成jar文件或者war文件

具体构建步骤:
构建是面向过程,主要步骤是

  1. 清理:把之前项目编译的东西删除掉,为新的编译代码做准备。

    1. 编译: 把程序源代码编译为执行代码, 把java编译成class文件且是批量的,maven可以同时把成千上百的文件编译为class。这与javac 不一样,javac一次编译一个文件。
  2. 测试: maven可以执行测试程序代码,验证你的功能是否正确。批量的,maven同时执行多个测试代码,同时测试很多功能。
  3. 报告: 生成测试结果的文件,具体文件是测试有无通过。

    1. 打包: 项目中所有的class文件,配置文件等所有资源放到一个压缩文件中。这个压缩文件就是项目的结果文件, 通常java程序,压缩文件是jar扩展名的。对于web应用,压缩文件扩展名是.war
  4. 安装: 把5中生成的文件jar,war安装到本机仓库

    1. 部署: 把程序安装好可以执行。

核心概念:
POM :名称是pom.xml(项目对象模型)

     maven把一个项目当做一个模型使用
     控制maven构建项目的过程,管理jar依赖。

约定的目录结构 : maven项目的目录和文件的位置都是规定的。

坐标 : 是一个唯一的字符串,用来表示资源的。

依赖管理 : 管理项目可以使用jar文件

仓库管理(了解) :资源存放的位置

生命周期 (了解) : maven工具构建项目的过程
插件和目标(了解):执行maven构建的时候用的工具是插件
⑧继承
⑨聚合

1. 安装及配置

  1. 从maven的官网下载maven的安装包

    1. 解压安装包,解压到一个目录,非中文目录
  • 子目录 bin :执行程序,主要是mvn.cmd
  • conf :maven工具本身的配置文件 settings.xml
  1. 配置环境变量

    在系统的环境变量中,指定一个M2_HOME的名称, 指定它的值是maven工具安装目录,bin之前的目录
    
    再把M2_HOME加入到path之中,在所有路径之前加入 %M2_HOME%\bin;
  2. 验证,新的命令行中,执行mvn -v

    注意:需要配置JAVA_HOME ,指定jdk路径

具体maven的配置可看我上一篇的文章进行了解
Maven详细配置(全)

2. 核心概念

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.1 约定的目录结构

每一个maven项目在磁盘中都是一个文件夹(项目-Hello)

Hello/
  ---/src
  ------/main           #主程序java代码和配置文件
  ----------/java       #程序包和包中的java文件
  ----------/resources  #java程序中要使用的配置文件
  ------/test  #测试程序代码和文件的(可以没有)
  ----------/java       #测试程序包和包中的java文件
  ----------/resources  #测试java程序中要使用的配置文件
  ---/pom.xml  #maven的核心文件(maven项目必须有)

类似这样的目录结构,以树为结构
在这里插入图片描述

2.2 编译执行

  • 在cmd命令行下运用mvn compile进行编译,编译src/main目录下的所有java文件的
  • cmd下的命令行会出现多个下载文件Downloading:https://repo.maven.apache.org/maven2/org/apache/maven/maven-plugin等等是因为第一次mvn会下载多个插件,maven工具执行的操作本身需要很多插件(java类,以jar文件结尾)来完成,插件是完成某些具体功能,下载插件的网址涉及中央仓库,后续核心概念会讲到。
  • 下载后的插件具体位置放于默认本地仓库中
    C:\Users\86135\.m2
    仓库具体的具体

编译成功之后会在项目的根目录下生成target
maven编译的java程序,最后的class文件都放在target目录中

2.3 仓库

仓库是存放maven使用的jar和我们项目使用的jar

仓库的分类可以分为本地仓库远程仓库

本地仓库是个人计算机上的文件夹,存放各种jar
设置本机存放资源的目录位置(设置本机仓库):

  1. 修改maven的配置文件/conf/settings.xml, 先备份 settings.xml
  2. 修改 localRepository 指定目录(不要使用中文目录)

远程仓库是在互联网上的,使用网络才能使用的仓库
远程仓库分为中央仓库、中央仓库的镜像和私服
中央仓库是共享一个集中仓库 。 https://repo.maven.apache.org :中央仓库的地址
中央仓库的镜像是中央仓库的备份, 在各大洲,重要的城市都是镜像
私服是用在局域网不对外公布

仓库的具体使用是不需要人为使用
具体如何运作仓库
比如需要使用mysql驱动,maven首先查本地仓库--->私服--->镜像--->中央仓库,如果某个阶段有,之后会类似递归一样返回调用

2.4 pom文件

  • pom是Project Object Model 项目对象模型
  • Maven 把一个项目的结构和内容抽象成一个模型,在 xml 文件中进行声明,以方便进行构建和描述,pom.xml 是 Maven 的灵魂
  • 项目打包的类型packaging,可以是 jar、war、rar、ear、pom,默认是 jar

基本信息有坐标依赖信息
1.坐标是唯一值在互联网中唯一标识一个项目的
项目在仓库中的位置是由坐标来决定的:groupId、artifactId 和 version 决定项目在仓库中的路径,artifactId 和 version 决定 jar 包的名称

<groupId>公司域名的倒写</groupId>
<artifactId>自定义项目名称</artifactId>
<version>自定版本号</version>

具体搜索使用的中央仓库是
中央仓库地址
通过仓库搜索后的驱动配置(以jar包结尾)
在这里插入图片描述
2.packaging: 打包后压缩文件的扩展名,默认是jar ,web应用是war 。默认不写是jar包

3.依赖信息:项目中要使用的各种资源说明
dependencies 和dependency ,相当于是 java代码中import

<dependencies>
    <!--依赖  java代码中 import -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.9</version>
     </dependency>
</dependencies>

4.properties:设置属性

5.build : maven在进行项目的构建时, 配置信息,例如指定编译java代码使用的jdk的版本等

2.5 常用命令

通过命令,完成maven的生命周期的执行
maven可以使用命令,完成项目的清理,编译,测试等等

命令 功能
mvn clean 清理(会删除原来编译和测试的目录,即 target 目录,但是已经 install 到仓库里的包不会删除)
mvn compile 编译主程序(会在当前目录下生成一个 target,里边存放编译主程序之后生成的字节码文件)
mvn test-compile 编译测试程序(会在当前目录下生成一个 target,里边存放编译测试程序之后生成的字节码文件)
mvn test 测试(会生成一个目录surefire-reports,保存测试结果)
mvn package 打包主程序(会编译、编译测试、测试、并且按照 pom.xml 配置把主程序打包生成 jar 包或者 war 包)
mvn install 安装主程序(会把本工程打包,并且按照本工程的坐标保存到本地仓库中)
mvn deploy 部署主程序(会把本工程打包,按照本工程的坐标保存到本地库中,并且还会保存到私服仓库中。还会自动把项目部署到 web 容器中)

2.6 生命周期以及插件

在这里插入图片描述

  • lifecycle为生命周期
  • plugins为插件
  • dependencies为依赖信息

maven的生命周期:就是maven构建项目的过程,清理,编译,测试,报告,打包,安装,部署

maven的插件: maven命令执行时,真正完成功能的是插件,插件就是一些jar文件, 一些类。

编译插件的配置

<build> 
<!-- 配置插件-->
    <plugins> 
        <!-- 配置具体插件-->
        <plugin> 
             <groupId>org.apache.maven.plugins</groupId> 
             <!-- 插件名称-->
             <artifactId>maven-compiler-plugin</artifactId> 
             <!-- 插件版本-->
             <version>3.8.1</version> 
             <!-- 配置插件的信息-->
             <configuration> 
                 <!-- 代码运行在jdk1.8上-->
                 <source>1.8</source> 
                 <target>1.8</target> 
             </configuration> 
         </plugin> 
     </plugins> 
</build>

2.7 单元测试junit

单元测试(测试方法):用的是junit, junit是一个专门测试的框架(工具)。
测试的是类中的方法,每一个方法都是独立测试的, 方法是测试的基本单位(单元)
== maven借助单元测试,批量的测试你类中的大量方法是否符合预期的==

具体的使用步骤是在pom.xml文件中加入单元测试

 <!-- 单元测试 -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>

推荐的创建类和方法的提示:

  1. 测试类的名称 是Test + 你要测试的类名
  2. 测试的方法名称 是:Test + 方法名称

例如要测试HelloMaven ,创建测试类 TestHelloMaven

 @Test
     public void testAdd(){
      测试HelloMaven的add方法是否正确
     }
其中testAdd叫做测试方法,它的定义规则
     1.方法是public的,必须的
     2.方法没有返回值, 必须的
     3.方法名称是自定义的,推荐是Test + 方法名称
     4.在方法的上面加入 @Test

举个列子:
在main的函数中

public class HelloMaven {

  public int add(int n1,int n2){
    return n1+n2;
  }

  public static void main(String args[]){
      HelloMaven hello = new HelloMaven();
      int res = hello.add(10,20);
        System.out.println("10+20="+res);
  }
}

测试类应该这样书写

public class MyTest {
 @Test
 public void testAdd(){
     System.out.println("执行 HelloMaven 类 addNumber()方法");

     HelloMaven hello =new HelloMaven();
    int res = hello.add(n1,n2);
     // 期望值,实际值.如果两个值相等则为正确的,不等就会抛出异常,会出错
     Assert.assertEquals(30,res);
     } 
 }

具体 Assert.assertEquals的参数设置可以查看我上一篇文章
java之Assert.assertEquals详细分析

3. 结合idea

3.1 设置maven

idea中内置了maven ,一般不使用内置的, 因为用内置修改maven的设置不方便。使用自个安装的maven,覆盖idea默认的设置,让idea指定maven的安装具体位置
在这里插入图片描述

  • Maven Home path: maven的安装目录
  • User Settings File : maven安装目录conf/setting.xml配置文件
  • Local Repository : 本机仓库的目录位置

修改设置为自已安装的maven
在这里插入图片描述
在将Runner设置jre为1.8且在VM Options中设置一个参数,参数为-DarchetypeCatalog=internal。新建的时候就回会比较快,是因为模式联网用maven的时候会下载一个7M的东西,添加参数会不下载且比较快。
在这里插入图片描述
配置以后的新工程设置都是maven的
在老版的idea中用file--other settings--Settings for New Project
在新版的idea中为
在这里插入图片描述

3.2 新建javase项目

具体idea版本不一样,界面稍微不太一样,不过大同小异
常用的目录结构已经创建好
使用模板创建maven项目,以下的模板没有resources
在这里插入图片描述
在这里插入图片描述
具体创建之后的目录结构为
在这里插入图片描述
蓝色为java文件,绿色为测试文件,添加后的resources需要设置为
在这里插入图片描述
讲解pom.xml的其他配置信息
以下为项目信息name以及通过网址访问的url项目,可用可不用
在这里插入图片描述

3.3 创建web工程

在这里插入图片描述

新建的项目默认目录是
在这里插入图片描述
需要新建一些java和resources的目录以及做一些标记
在这里插入图片描述
查看pom.xml下的文件
web下默认是war后缀的包

<groupId>org.example</groupId>
<artifactId>8.6ceshi</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
  • 以下的name为项目名,url为访问项目的网站,暂时没用到可以删除
  • 默认jdk为1.8,将其修改为1.8

在这里插入图片描述
以下build为插件的信息,即插件的管理。具体列出来与不列出来之后都会生成,主要是为了方便版本配置,可以删除
具体有清楚插件、资源插件、编译插件、生成报告插件、打包插件、安装插件、部署插件等
在这里插入图片描述
此时大概已经配置完毕


对比maven的好处:
以前写servlet的时候需要在dependencies中加入tomcat等信息

在这里插入图片描述

现在只需要用maven的管理即可,在pom.xml下加依赖信息即可
比如servlet和jsp的依赖信息

<dependency>
     <groupId>javax.servlet</groupId>
     <artifactId>javax.servlet-api</artifactId>
     <version>3.1.0</version>
     <scope>provided</scope>
</dependency> 
<dependency>
     <groupId>javax.servlet.jsp</groupId>
     <artifactId>jsp-api</artifactId>
     <version>2.1</version>
     <scope>provided</scope>
</dependency>

3.4 常用技巧

1. 刷新pom.xml
pom文件加入依赖后,有下划线,代表还未更新到,需要刷新
可以通过点击pom.xml右键进行刷新
在这里插入图片描述
或者在maven的项目中进行刷新

在这里插入图片描述
2.更新目录文件为测试或者跟目录权限等
在这里插入图片描述
或者点击工程目录中的
在这里插入图片描述

3.导入一个存在的项目

如果本身项目有pom.xml,则需设置为maven
在设置中进行添加模块
在这里插入图片描述
导入的项目为maven
在这里插入图片描述
jdk设置为1.8
在这里插入图片描述

4. 其他细节信息

在这里插入图片描述
在这里插入图片描述

4.1 依赖范围

有无此功能 compile test provided
对主程序是否有效
对测试程序是否有效
是否参与打包
是否参与部署

依赖范围:使用scope表示的
scope的值有 compile, test, provided ,默认是compile
使用的范围是在maven构建项目的那些阶段中起作用
maven构建项目 编译, 测试 ,打包, 安装 ,部署 过程(阶段)
比如

//该代码在test中才测试有效
<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
</dependency>

如果是provided 则为提供者
代表编译测试用的jar包,但是项目进行打包安装的时候不需要这个jar包
比如下方的servlet包

 <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>    
      <scope>provided</scope> 
 </dependency>

4.2 常用属性

<properties> 设置maven的常用属性
在这里插入图片描述
在maven的全局变量中
可以自定义属性

  1. <properties> 通过自定义标签声明变量(标签名就是变量名)
  2. 在pom.xml文件中的其它位置,使用 ${标签名} 使用变量的值

自定义全局变量一般是定义 依赖的版本号, 当你的项目中要使用多个相同的版本号,先使用全局变量定义, 在使用${变量名}

比如以下这行代码

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

<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
  </dependency>
</dependencies>

将其修改为全局变量,如果版本号一致的有多个,可以统一一起修改而不繁琐

<junit.version>4.11</junit.version>

 <version>${junit.version}</version>

完整代码演示:


<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <maven.compiler.source>1.8</maven.compiler.source>
  <maven.compiler.target>1.8</maven.compiler.target>
  <junit.version>4.11</junit.version>
</properties>

<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>${junit.version}</version>
    <scope>test</scope>
  </dependency>
</dependencies>

4.3 资源插件

  • 默认没有使用resources的时候, maven执行编译代码时, 会把src/main/resource目录中的文件拷贝到target/classes目录中,对于src/main/java目录下的非java文件不处理,不拷贝到target/classes目录中
  • 要想加入其他非java文件进行处理,需要添加以下代码,在build中加入其resources

把扩张名为xml和properties中都扫描到
并且之后生成都放到target/classes目录中

  <build>
    <resources>
    <resource>
    <directory>src/main/java</directory><!--所在的目录-->
    <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
    <include>**/*.properties</include>
    <include>**/*.xml</include>
    </includes>
    <!—filtering 选项 false 不启用过滤器, *.property 已经起到过滤的作用了 -->
    <filtering>false</filtering>
    </resource>
    </resources>
  </build>
相关文章
|
4月前
|
XML 前端开发 Java
SpringMVC入门到实战------2、SpringMVC创建实例Hello SpringMVC(maven+tomcat)
这篇文章是SpringMVC框架的入门教程,详细指导了如何在IDEA中使用Maven和Tomcat创建SpringMVC工程,包括添加依赖、配置web.xml、编写控制器、创建配置文件、配置Tomcat服务器以及进行基本的测试,展示了一个简单的Hello SpringMVC示例。
SpringMVC入门到实战------2、SpringMVC创建实例Hello SpringMVC(maven+tomcat)
|
7月前
|
Java Apache Maven
【Maven从入门到如土】Maven 核心程序解压和配置
【Maven从入门到如土】Maven 核心程序解压和配置
110 0
|
7月前
|
XML Java Shell
【深入浅出Maven开发实战】「入门教程系列」带你零基础学习和开发使用Maven开发工具实战指南(实战技术总结)(一)
【深入浅出Maven开发实战】「入门教程系列」带你零基础学习和开发使用Maven开发工具实战指南(实战技术总结)
219 1
|
7月前
|
XML Java Maven
【深入浅出Maven开发实战】「入门教程系列」带你零基础学习和开发使用Maven开发工具实战指南(实战技术总结)(二)
【深入浅出Maven开发实战】「入门教程系列」带你零基础学习和开发使用Maven开发工具实战指南(实战技术总结)
122 0
|
6月前
|
存储 搜索推荐 Java
rodert教你学Maven-实战这一篇就够了(上)
rodert教你学Maven-实战这一篇就够了
52 1
 rodert教你学Maven-实战这一篇就够了(上)
|
6月前
|
Java Linux 网络安全
在Linux上搭建Maven仓库的实战教程
在Linux上搭建Maven仓库的实战教程
360 0
|
6月前
|
存储 Java 测试技术
rodert教你学Maven-实战这一篇就够了(下)
rodert教你学Maven-实战这一篇就够了
37 0
|
7月前
|
Java Maven
Maven实战 Item4 -- Maven核心概念_maven junit version(1)
Maven实战 Item4 -- Maven核心概念_maven junit version(1)
|
7月前
|
前端开发 JavaScript Java
Maven实战 Item3 -- Maven项目构建2_构建一个maven2 3项目
Maven实战 Item3 -- Maven项目构建2_构建一个maven2 3项目
|
7月前
|
JavaScript 安全 前端开发
Maven实战 Item2 -- Maven项目构建(手动)_term2 配置maven(2)
Maven实战 Item2 -- Maven项目构建(手动)_term2 配置maven(2)

推荐镜像

更多