IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java0基础_day21_项目工程管理工具_Maven -> 正文阅读

[Java知识库]Java0基础_day21_项目工程管理工具_Maven

标签:Maven、软件工程、jar包管理、开发流程

1.Maven简介

  • 什么是maven?

众所周知,在软件开发中我们有一系列流程,包括编译、测试、打包、部署等工作,在没有maven前,大家怎么开发呢,有哪些问题呢?

第一:需要手工导入jar包,并且jar包可能存在依赖、版本问题,加大难度;

第二:对源代码测试困难,尤其是源代码有几千个类的时候;

因此我们引入了Maven,帮助我们完成代码编译、批量测试、管理jar包、一键打包。

  • Maven的构建流程

值得注意的是,Maven的构建流程与下文的Maven命令息息相关:

第一个:清理代码 mvn clean

第二个:编译源代码 mvn compile

第三个:编译测试代码 mvn test-compile

第四个:运行测试代码? mvn test

第五个:一键打包? mvn package

第六个:部署

第七个:安装? mvn install


2.Maven的核心概念

第一个:POM.XML

简而言之,这个文件时Maven的标志,可以认为和Git一样,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>com.zhujie</groupId>
  <artifactId>day01-maven</artifactId>
  <version>1.0-SNAPSHOT</version>
</project>

第二个:约定的目录结构

这个很简单,作为管理者的Maven为了让大家遵守它的规范,统一了文件结构的规范,你比如上面的XML文件就是他规定的,除此外具体的规范如下:

?如上图所示,这里位于一个项目XX下,分为src文件夹和pom.xml配置文件,其中src包括源代码和测试文件夹,即main文件夹和test文件夹,main和tese都有java文件夹和resource文件夹,顾名思义,java中包括功能代码和测试代码,resource包括其他的一些用到的资源。

【注意】上面的target是编译后.class文件的放置位置,即编译时Maven会把src/main/java中的*.java编译为target/classes文件夹下的*.class文件,同时把src/main/source下的文件保存在target/classes。

第三个:坐标

如同数学的坐标一样,这里Maven会唯一标识一个网络项目/jar包【因为后续我们会发包】

groupId   组织id,一般是域名倒写,如com.baidu.appolo
artifactId  项目名字,模块名
version  项目版本号 -snapshot

【注意】其实坐标可以随便写,不过按照上面的规范大家都可以看得懂。

【注意2】可以在www.mvnreposity.com中央仓库查询想要的jar包,会自动返回POM.XML的引用格式,将其插入到POM.XML即可,如下为servlet的一个版本jar包:

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

第四个:依赖管理、仓库管理

依赖就是jar包,我们写的代码可能需要java自带类,例如javaee规范中的javax旗下的servlet类,这时就必须引入依赖,Maven要求我们把想要的包在POM.XML告诉他,他负责下载,那么怎么下载呢?这就涉及到仓库管理:

在Maven中,仓库分为本地仓库、私服、中央仓库镜像、中央仓库

简而言之,Maven会先从本地仓库中查询,然后去私服、中央仓库镜像、中央仓库依次查询,如果后面任何一个地点查到了,那么依次返回并且缓存,其本质类似于DNS的递归查询方式。

【注意】本地仓库可以在Maven安装目录/setting.xml文件夹中的localreposity配置,加上本地的某个专门存放仓库的文件夹即可,注意这里加入的一定是/,而不是\。第五个:

第五个:插件

在Maven中,插件是命令的实际执行者,可以理解为是一个可执行文件,其本质是一个jar包,每次执行命令时,Maven也会去找有无jar包,没有就会立刻下载并且执行命令。

第六个:继承和聚合

第七个:单元测试→junit下的测试方法;

在Maven中,测试的基本单位是方法,故称之为单元测试。

其中,测试类的名称为Test+要测试的类名,测试方法名为test+要测试的方法名,除此外,测试方法必须是public、没有返回值、在方法上面要加上@Test,如下所示:

package com.bjpowernode;
import org.junit.*;
public class Testhh{
	@Test
	public void testmain(){
		System.out.println("maven的junit测试");
		hh a = new hh();
		int out = hh.add(3,6);
		//调用junit的测试方法,对比结果
		//assertEquals(期望值,实际值)
		//如果不等就抛出异常;
		Assert.assertEquals(10,out);
	}
}


3.Maven生命周期详解_命令详解

这里演示Maven命令与生命周期,假设已经建立好了所需要的文件结构【见上文】,假设根目录为XX/:

第零步:配置POM.XML,写代码

在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>com.zhujie</groupId>
    <artifactId>java_web</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>
<!-- 自定义添加进入target的资源-->
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                   <include>**/*.txt</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>
<!-- 设置依赖-->
    <dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>RELEASE</version>
        <scope>test</scope>
    </dependency>
        <!-- JSP依赖依赖-->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.0</version>
            <scope>provided</scope>
        </dependency>
        <!-- servlet依赖-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>

简而言之,需要设立坐标【告诉Maven你是谁】、引入依赖【告诉Maven你想要哪些jar包】、设置资源【告诉Maven你想要把src/main/java下哪些文件放在target/classess文件夹下】、依赖管理【你想要这个依赖在编译、测试、打包、部署的哪个阶段起作用】

第一步:进入XX,输入mvn clean清理命令

【结论】此时会出现maven-clean-plugin,不难发现Maven的命令是通过插件完成的!

第二步:mvn compile

【结论】将.java编译后的class文件放在target/classes,并且拷贝main/source文件夹下的文件到前者。

第三步:mvn test-compile

【结论】编译test/java下的文件,放在target/classes

第四步:mvn test

【结论】此方法会再次执行前面的几个命令,然后执行.calss文件

【结论2】这里会生成测试的结果报告,在target/surefire-reports下。

第五步:mvn package

【结论】默认打包为jar,可以在POM设置为war

【结论2】取名为artifactId-version值。

【结论3】打包生成的内容由POM中的<soupe>字段给出。

第六步:mvn install

【结论】安装到本地仓库位置,按.分包分层级建文件夹


4.IDEA创建Maven普通javase模块

首先明确的是,IDEA自带Maven,但是很难用,故需要手动覆盖。

第一步:新建任意项目

第二步:新建普通javase模板,设置模块坐标

第三步:覆盖Maven?

值得注意的是,建议在VM option输入以下命令,加快下一次启动速度:

-DarchetypeCatalog=internal

特别的,以上设置分局部和全局:

第四步:标记文件夹

第五步:写主代码、写测试代码、引入jar包

第六步:测试,双击运行:


5.IDEA创建Maven_web开发

第一步:新建模块,选择Maven→webapp原型

第二步:标记文件夹并补全

第三步:手动配置pom.xml的<packaging>为war格式

第四步: 引入servlet和jsp依赖

 <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.3</version>
            <scope>provided</scope>
</dependency>
<!-- servlet依赖-->
<dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
 </dependency>

第五步:注册web.xml和index.jsp

第六步:后端servlet小程序撰写暨Tomcat服务器配置

第七步:打包发布


6.Maven技巧与依赖管理

第一点:本地仓库设置

可以在Maven的配置文件夹下设置本地仓库,也可以在IDEA设置,如下图:

? ?

第二点:解决Maven无法识别依赖包问题

有时候,Maven会将我们添加的依赖包标红,此时可以在模块下的pom配置文件右键选择maven,然后选择重新加载文件,当然也可以在Maven主控制面板刷新,后者会将所有Maven项目更新。

第三点:设置标记目录

在Maven和IDEA中,建立的普通目录是普通文件,我们需要告诉Maven它是什么类型的文件:

?第四点:导入Maven模块

项目结构→导入模块→选择maven→设置jdk→完毕!

第五点:指定全局变量,以此快速修改版本号

在哪里指定?? 在properties标签中;

怎么指定和使用?? ? ? ? ? ? ? ? 如下:

<properties>
        <spring.version>5.2.2</spring.version>
</properties>
  
<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${sprinig.version}</version>
</dependency>
<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-linx</artifactId>
            <version>${sprinig.version}</version>
 </dependency>
 <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-hint</artifactId>
            <version>${sprinig.version}</version>
 </dependency>

第六点:指定资源插件

  • 在mvn compile时,会把src/main/source文件夹下的全部拷贝到target/classes文件夹下下,同时会编译上述的java中的*.JAVA文件

  • 特别的,如果是src/main/java中的非java文件,不会拷贝到target目录下。

做法:在如下的<build>标签中引入resource标签,指定想要拷贝到target/classes的文件。

?第七点:依赖管理

? ?前面讲到,POM.XML文件中有<scope>标签,如下所示:

<dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>RELEASE</version>
        <scope>test</scope>
</dependency>

?他表示什么意思呢?? ? ? ? ? ? ? ? ? ? ? ?他表示该依赖在Maven的哪些阶段起作用!

分为:compile、test、provided三者,阶段分为编译、测试、打包、部署四个阶段。

其中compile表示该依赖在四个阶段都需要,都起作用;

test表示只在测试阶段登场,其他阶段不需要它;

provided表示在编译和测试阶段都需要,其他节阶段不需要。

例如我们引入的mysql 的驱动jar包,显然在编译和测试阶段需要,其他阶段不需要,而src/main/java下的*.java文件则需要贯穿各个阶段。

第八点:巧妙使用jar包

前面讲了jar包的配置、下载、引入和发布,除此外,jar作为前后台程序/页面的封装,还可以快速访问站点:

第一步:将.war改名为某个站点的名字

第二步:放在tomcat的webapp根目录下

第三步:http://localhost:8080/crm/baidu

  • 之类crm是某个站点
  • /baidu是该servlet的映射路径
  • 原理:访问的时候Tomcat会自动替换;

第四步:成功


7.总结

第一点:git是版本控制,解决了文件备份和协作的问题,而Maven作为项目管理工具,深度参与项目的编译、测试、打包和部署过程,解决了工程实现问题,Tomcat服务器作为web服务器,其可看成是后台开发者和浏览器前端的传输中间人。

第二点:接第一点,有时我们可以站在更高的维度思考问题,不仅要作为后台程序开发者和工具使用者的角色,有时可以考虑中间人的角色,例如如何写出Tomcat,如何写出Maven,如何设计实现git,不管结果如何,都会加深工具的使用以及规范的实现。

?

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章           查看所有文章
加:2021-12-02 16:37:29  更:2021-12-02 16:39:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:02:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码