Maven工程详解

文章目录

一、maven理论及前期准备工作

1、Maven的作用

1、管理jar包和它的文档
2、自动下载jar包、文档和源代码
3、管理jar直接的依赖,a.jar需要b.jar,maven会自动下载b.jar
4、管理所需要的jar包的版本
5、编译程序,将java文件编译为class文件
6、测试代码是否正确
7、打包文件,形成jar文件或war文件
8、部署项目

2、项目的构建

构建是面向过程的,就是一些步骤完成项目代码的编译、测试、运行、打包、部署等。maven支持的构建有:

1、清理:将之前项目编译的东西删除掉,为新的编译代码做准备
2、编译:将程序源代码编译为执行代码,java->class批量的,maven可以同时将成千上百个文件编译为class文件。
3、测试:maven可以执行测试程序代码,验证代码功能是否正确。(批量)
4、报告:生成测试结果的文件
5、打包:将程序中的所有class文件,配置文件等所有资源放到一个压缩文件中。这个压缩文件就是项目的结果文件,通常java程序的压缩文件是以jar作为扩展名的,对于web应用,压缩文件的扩展名是war
6、安装:将打包好的jar/war文件安装到本机仓库 7、部署:把程序安装好可以执行

3、maven的核心概念

1、pom:一个文件,名称是pom.xml,pom意味项目对象模型。maven把一个项目当做一个模型使用,控制maven构建项目的过程、管理jar依赖
2、约定的目录结构:maven项目的目录和文件的位置是有规定的
3、坐标:是一个唯一字符串,用来表示资源的
4、依赖管理:管理你的项目可以使用jar文件
5、仓库管理(了解):资源存放的位置
6、生命周期(了解):maven工具构建项目的过程就是生命周期
7、插件和目标:执行maven构建的时候用到的工具
8、继承
9、聚合

4、maven的下载安装及配置

https://blog.csdn.net/weixin_45890113/article/details/117197183?spm=1001.2014.3001.5501

二、maven的核心概念

1、maven工程约定的目录结构

maven的目录结构是有约定的,约定就是大家都遵循的一个规则,我们新建一个maven工程去观察其目录结构

hello/
----/src
--------/main main下是存放主程序Java代码和配置文件的
------------/java java下存放程序包和包中的java文件的
------------/resources resources下存放Java文件中所要使用的配置文件的
--------/test test下用来放测试程序代码和文件的(不是必要的文件夹)
------------/java java下存放测试用的程序包和包中的java文件的
------------/resources resources下存放测试所用的java文件中所要使用的配置文件的
----/pom.xml pom.xml是maven的核心文件

到文件夹下新建一个类似的目录结构的文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>hello</artifactId>
    <version>1.0-SNAPSHOT</version>
</project>

(1)新建一个类

在main下的java下新建包cn.edu.wbb,并在其下新建HelloMaven类
在这里插入图片描述
HelloMaven.java文件

package cn.edu.wbb;

public class HelloMaven {
    public int add(int a , int b) {
	return a + b ;
    }

    public static void main(String[] args) {
	HelloMaven helloMaven = new HelloMaven();
	int n = helloMaven.add(1,2);
	System.out.println(n) ;
    }
}

(2)编译文件

在hello目录下输入 mav compile 命令,编译main目录下的所有.java文件 ,如图所示(因为我的电脑是用过maven的,没用过maven的话在执行这个命令时会下载一系列的maven所需的文件)
在这里插入图片描述

1、为什么要下载那些文件呢?

maven工具执行的操作需要很多的插件完成

2、下载的文件是写什么?

jar文件,叫做插件,是用来文成某些功能的

3、下载的文件存放的地址

C:\Users\26090.m2\repository 这是默认仓库(本机仓库)
登陆本机下的用户名下有一个 .m2 文件夹下的 repository 中
在这里插入图片描述

(3)编译成功

执行 mvn compile 进行编译成功后,会在项目的根目录下生成一个target目录(结果目录),maven编译的Java程序最后的class文件都存放在target目录中
在这里插入图片描述

(4)执行程序

在这里插入图片描述

(5)修改本地仓库地址

1、修改maven的配置文件,maven安装目录/conf/setting.xml,现将文件进行备份
2、修改 <localRepository> ,将localRepository标签复制出来一份并修改其中内容为你所要保存文件的目录(不要使用中文目录)
在这里插入图片描述

2、仓库

(1)仓库的概念

仓库是用来存放东西的,存放maven使用的jar和我们项目中使用的jar
maven使用的插件(各种jar)
项目中使用的jar(第三方的工具)

(2)仓库的分类

本地仓库:就是个人计算机上的文件夹,存放各种jar
远程仓库:是存放在互联网上的,使用网络才能链接使用的仓库
远程仓库又分为中央仓库、中央仓库的镜像和私服
     ①中央仓库是最权威的,所有的开发人员都共享使用的一个集中的仓库
     ②中央仓库的镜像就是中央仓库的备份,在各大洲、重要的城市都存在
     ③私服是指在公司内部等局域网内使用的,不对外开放

(3)仓库的使用

当开发人员需要用到MySQL驱动时,maven首先查本地仓库,本地仓库没找到时去私服进行查找,私服没找到就到镜像中去找,镜像再找不到就到中央仓库找。

3、pom.xml文件的相关信息
基本信息
modelVersionMaven模型的版本,对于Maven2和Maven3来说,它的值只能是4.0.0
groupId组织id,一般是公司域名的倒写。格式可以是:
1、域名倒写:例如com.baidu
2、域名倒写+项目名:例如com.baidu.appolo
artifactId项目名称,也是模块名称,对应groupId中项目的子项目groupId、artifactId、version 三个元素生成了一个Maven项目的基本坐标,在众多Maven项目中可以唯一定位到某个项目。坐标也决定着将来项目再仓库中的路径及名称
version项目的版本号,如果项目还在开发中,是不稳定版本,通常再版本后面加上-SNAPSHOT
version使用三位数字标识,例如1.1.0
packaging项目打包的类型,可以是jar、war、rar、ear、pom,默认是jar
依赖
dependencies和dependencyMaven的一个重要作用就是管理jar包,为了一个项目可以构建或运行,项目中不可避免的会依赖很多的jar包,再Maven中,这些jar包就被称为依赖,使用标签dependency来配置,而这种依赖的配置正是通过坐标来定位的
配置属性
propertiesproperties是用来定义一些配置属性的,例如project.build.sourceEncoding(项目构建源码编码方式),可以设置为utf-8,防止中文乱码,也可定义相关构建版本号,便于日后统一升级
构建
buildbuild表示与构建相关的配置,例如设置编译插件的jdk版本
继承
parent再Maven中,如果多个模块都需要声明相同的配置,例如:groupId、version、有相同的依赖或者相同的组件配置等,也有类似Java的继承机制,用parent声明要继承的父工程的pom配置
聚合
modules在Maven的多模块开发中,为了统一构建整个项目的所要模块,可以提供一个额外的模块,该模块打包方式为pom,并且在其中使用modules聚合的其他模块,这样通过本模块就可以一键自动识别模块间的依赖关系来构建所有模块,叫Maven聚合。

4、坐标(gav)

Maven把任何一个插件都作为仓库中的一个项目进行管理,用一组(三个)向量组成的坐标来表示。坐标在仓库中可以唯一定位一个Maven项目。

groupId:组织名,通常是公司或组织域名倒序+项目名
artifactId:模块名,通常是工程名
version:版本号

需要特别注意的是,项目在仓库中的位置是有坐标来决定的:groupId、artifactId和version决定项目在仓库中的路径,artifactId和version决定jar包的名称

5、依赖(dependency)

一个Maven项目正常运行需要其他项目的支持,Maven会根据坐标自动到本地仓库中进行查找。对于程序员自己的Maven项目需要进行安装才能保存到仓库中。
pom.xml加入依赖的方式:

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

<!--  Servlet依赖  -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>

6、Maven的生命周期、常用命令及插件

maven的生命周期:是maven构建项目的过程,清理,编译,测试,报告,打包,安装,部署。
对于项目的构建是建立在生命周期模型上的,它明确定义项目生命周期各个阶段,并且对于每一个阶段提供相对应的命令。对于开发者而言仅仅需要掌握一些命令就可以完成项目各个阶段的构建工作。
构建项目时按照生命周期顺序构建,每一个阶段都有特定的插件来完成。不论现在要执行生命周期中的哪一阶段,都是从生命周期的最初阶段开始的。
对于程序员而言,无论我们要进行哪个阶段的构建,组件执行相应的命令即可,无需担心它前面的阶段是否构建,Maven都会进行自动构建。这也就是Maven自动化构建工具给我们带来的好处。

maven的命令:是maven独立使用的,通过命令完成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容器中

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

(1)单元测试(测试方法)

用的是junit,junit是一个专门测试的框架(工具)。
junit测试的内容:测试的是类中的方法,每一个方法都是独立测试的。方法是测试的基本单位(单元)。

(2)使用步骤

1、在pom.xml中加入单元测试的依赖
<!-- 单元测试的依赖 -->
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.11</version>
  <scope>test</scope>
</dependency>
2、在maven项目中的src/test/java目录下创建测试程序

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

1、测试类的名称是 Test+要测试的类名
2、测试的方法名称 test+方法名称

例如要测试HelloMaven中的add()方法
创建测试类TestHelloMaven

public class TestHelloMaven {
    @Test
    public void testAdd() {
        // 测试    
    }
}

其中testAdd叫做测试方法,它的定义规则:

1、方法是必须是public的
2、方法必须是没有返回值的
3、方法名称是在定义的,但是推荐测试的方法名称 test+方法名称
4、在测试方法上面必须加上 @Test

7、插件

插件可以在自己的项目中设置,最常用的是maven编译插件,设置项目使用的jdk版本时通过编译插件指定。
pom.xml文件中<build>中设置

<build>
<!-- 配置插件 -->
    <plugins>
    <!--- 配置具体的插件 ->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <!-- 插件的名称 -->
        <artifactId>maven-compiler-plugin</artifactId>
        <!-- 插件的版本 -->
        <version>3.1</version>
        <!-- 配置插件的信息 -->
        <configuration>
        <!-- jdk版本 -->
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>

三、Maven在IDEA中的应用

1、在idea中设置maven

idea中内置了maven,但我们一般不使用内置的,因为当我们使用idea内置的maven时修改其设置不方便,所有我们通常使用自己安装的maven,需要覆盖idea中的默认的设置,让idea指定maven安装位置等信息。

(1)配置maven

1、配置当前工程:

file — setting — Build,Execution,Deployment — Build Tools — Maven
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
创建maven项目时,会联网下载模板文件,比较大,使用-DarchetypeCatalog=internal就不用下载,创建maven项目的速度变快

2、配置以后新建工程的设置:

file — New Projects Settings — Setting for New Projects… (2020版idea)
在这里插入图片描述
我们可以看到这里的配置还是idea的默认设置,我们将其修改即可
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
配置完成后我们再去新建maven项目就不用再配置了

(2)使用idea创建maven工程

File — New — Project — Empty Project
在这里插入图片描述
选择Empty Project后点击 next
在这里插入图片描述
给空工程命名,点finish
在这里插入图片描述
点击 Modules — + — New Module
在这里插入图片描述
选择Maven — Module SDK 配置jdk的版本 — 选择一个项目模板,这里我们选的是一个普通的java项目的模板 — next
在这里插入图片描述
在定义Name值 — 下面的坐标的三个值可由我们自行指定 — Next
在这里插入图片描述Finish
在这里插入图片描述
Maven工程创建完成之后的目录结构,我们可以发现没有resources目录,这是因为我们选择了模板的原因,resource目录需要我们自行添加
在这里插入图片描述鼠标右键选中main目录—new — Directory
在这里插入图片描述
弹出一个New Directory,自己选中下方的resources目录即可,test目录也是一样的操作
在这里插入图片描述
在这里插入图片描述
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">
  <modelVersion>4.0.0</modelVersion>

<!-- 自己的项目的坐标(gav) -->
  <groupId>cn.edu.wbb</groupId>
  <artifactId>ch01-maven</artifactId>
  <version>1.0-SNAPSHOT</version>

  <properties>
<!--  maven构建项目使用的是utf-8,避免中文乱码  -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--  编译java代码使用的jdk的版本  -->
    <maven.compiler.source>1.8</maven.compiler.source>
<!--  java项目应该运行在什么样的jdk版本上  -->
    <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>
  
</project>

(3)使用idea测试maven

1、HelloMaven类
public class HelloMaven {
    public int add(int a , int b) {
        return a + b ;
    }

    public static void main(String[] args) {
        HelloMaven helloMaven = new HelloMaven();
        int res = helloMaven.add(10,20) ;
        System.out.println("10 + 20 = " + res);
    }
}
2、TestHelloMaven测试类
import org.junit.Assert;
import org.junit.Test;

public class TestHelloMaven {
    @Test
    public void testAdd() {
        HelloMaven helloMaven = new HelloMaven() ;
        int res = helloMaven.add(10,20) ;
        // 判断结果是否正确
        Assert.assertEquals(30,res);
        System.out.println("testAdd()方法执行");
    }
}

此时的项目结构
在这里插入图片描述

(4)idea中的maven工具窗口

在idea的右侧有一个maven的列表,里面有一系列的关于maven的操作,鼠标双击即可执行在这里插入图片描述

clean                        清理
validate compile       编译
test                           测试
package                   打包
verify
install                        安装
site
deploy                       部署

Plugins是插件
Dependencies是依赖
在这里插入图片描述

2、在idea中创建web工程

(1)点击 Project Structure

在这里插入图片描述

(2)Modules — + — New Module

在这里插入图片描述

(3)Maven — Create from archetype — 选择webapp的模板

在这里插入图片描述

(4)设置项目名等

在这里插入图片描述

3、完善web工程的目录

(1)main目录下的java目录和resources目录

刚创建的web的项目结构是这样的,但是我们需要在main目录下加上java目录和resources目录,还是鼠标右键单击main --- New --- Directory
在这里插入图片描述
在这里插入图片描述
给出的java目录和resources目录的提示,一个一个双击添加即可
在这里插入图片描述
在这里插入图片描述

(2)添加单元测试的目录

要想添加单元测试的目录,需要在src目录下添加一个test目录,并在其下添加java目录和resources目录在这里插入图片描述
右键新建目录所给的提示,添加上去即可
在这里插入图片描述
添加完成之后,web项目的结构
在这里插入图片描述

3、写一个简单的servlet程序

(1)添加依赖

1、到pom.xml文件中添加依赖
<!-- servlet依赖 -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
    </dependency>
<!--  jsp依赖  -->
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.2</version>
    </dependency>
2、HelloServlet类
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();
        writer.println("Hello Servlet......");
        writer.flush();
        writer.close();
    }
}
3、web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
  <servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>cn.edu.wbb.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
</web-app>
4、index.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>
</h2>
<form action="hello" method="get">
    <input type="submit" value="访问HelloServlet">
</form>
</body>
</html>
5、添加Tomcat服务器

Edit Configurations+Tomcat ServerLocal添加Tomcat服务器
在这里插入图片描述
在这里插入图片描述
配置Tomcat的版本及jre的版本
在这里插入图片描述
将ch02-maven项目添加到tomcat服务器中
在这里插入图片描述
在这里插入图片描述
启动项目进入浏览器,点击按钮得到结果
在这里插入图片描述
在这里插入图片描述

4、小技巧

1、刷新Maven依赖

(1)刷新单个项目

当我们pom.xml中所写的依赖不能识别时,鼠标右键pom.xmlMavenReload project 对pom.xml文件进行强制刷新,能解决大部分时候的问题(前提是写对)
在这里插入图片描述

(2)刷新全部项目

点击右侧的MavenReload All Maven Project
在这里插入图片描述

2、导入项目

Project StructureModules+Import Module — 选择要导入的项目 — OK — 选择导入一个项目 — MavenFinish
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、依赖

依赖范围

使用scope表示依赖的范围,其值有compile、test、provided
scope:表示依赖使用的范围,也就是在maven构建项目的那些阶段中起作用。

例如:junit的依赖范围是 test,只在测试时起作用

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.11</version>
  <scope>test</scope>
</dependency>
compiletestprovided
对主程序是否有效
对测试程序是否有效
是否参与打包
是否参与部署

五、Maven的常用设置

1、属性设置

(1)<properties>设置maven的常用属性

<properties>
  <!-- maven构建项目使用编码,避免中文乱码 -->
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <!-- 编译代码使用的jdk版本 -->
  <maven.compiler.source>1.8</maven.compiler.source>
  <!-- 运行程序使用的jdk版本 -->
  <maven.compiler.target>1.8</maven.compiler.target>
</properties>

2、全局变量

自定义的属性

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

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

3、资源插件

<build>
  <resources>
    <resource>
      <directory>src/main/java</directory> <!-- 所在的目录 -->
      <includes>
        <!-- 包括目录下的.properties,.xml文件都会被扫描到 -->
        <include>**/*.properties</include>
        <include>**/*.xml</include>
      </includes>
      <!-- filtering 选项 false 不启用过滤器,*.properties已经起到过滤的作用了 -->
      <filtering>false</filtering>
    </resource>
  </resources>
</build>

(1)默认没有使用resources的时候

maven执行编译代码时,会把src/main/resources目录中的文件拷贝到target/classes目录中。对于src/mian/java目录下的非java文件不处理,不拷贝到target/classes目录中
在这里插入图片描述
在这里插入图片描述

(2)使用resources的时候

我们的程序有需要把一些文件放到src/main/java目录中,当我们在执行java程序时,需要用到src/main/java目录中的文件。需要告诉maven在编译src/main/java目录下的程序时,把文件一同拷贝到target/classes目录中,此时就需要在<build>中加入<resources>
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值