Maven_项目构建及相关基础

1.关于maven

1.1.简介

​ Maven是apache下的一个开源项目,是纯java开发的,主要作用于管理java项目。Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具

1.2.好处与功能

  1. 依赖管理:就是对jar包的同一管理 可以节省空间
    • 想要找到对应的jar包就需要给坐标,坐标的写法:哪个公司或组织+哪个项目+哪个版本
  2. 项目构建
    • 项目的一键构建指的是项目从 编译----测试-----运行-----打包----安装 都交给maven进行管理,这个过程称为构建
  3. 跨平台(纯Java开发)
  4. 应用于大型项目可以提高开发效率
    • maven的分模块开发:每个模块都单独开发,在用maven的时候改变单独模块的源码不需要去同时编译别的模块

1.3.Maven的安装

官方下载

官方地址

1.3.1.安装教程

  1. 先安装jdk,要求1.7版本以上

  2. 把maven软件解压缩,解压目录最好不要有中文
    Maven_项目构建及相关基础_第1张图片

  3. 配置环境变量MAVEN_HOME,变量值就是maven的解压路径

Maven_项目构建及相关基础_第2张图片

  1. 配置环境变量PATH,将%MAVEN_HOME%\bin加入Path中,在Windows中一定要注意要用分号;与其他值隔开
    Maven_项目构建及相关基础_第3张图片

  2. 验证是否配置成功:打开cmd窗口,输入mvn –v看是否有版本信息弹出如下

Maven_项目构建及相关基础_第4张图片

1.3.2.Maven的配置

全局配置

​ 在你所在的Maven解压文件中settings.xml就是你的全局配置,可以直接改全局配置,但是更好的是可以直接写一个自己的用户配置

Maven_项目构建及相关基础_第5张图片

用户配置

​ 当运行完cmd的mvn –v之后会产生一个默认的maven目录:~/.m2/repository。

其中~表示当前用户路径C:\Users\ [UserName]

~/.m2/settings.xml是用户的配置文件(默认没有该文件,需要将全局配置文件拷贝过来在进行修改)

注意:一般本地仓库的地址不使用默认配置,通常情况下需要在用户配置中,配置新的仓库地址。

配置步骤

  1. 创建一个本地仓库目录,比如D:\Maven\repository

  2. 复制maven的全局配置文件到~/.m2目录下,即创建用户配置文件

  3. 修改maven的用户配置文件
    Maven_项目构建及相关基础_第6张图片


<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
	
	<localRepository>D:\java\repository\maven_repositorylocalRepository>
  
    <mirrors>
		<mirror>
			<id>nexus-aliyunid>
			<mirrorOf>*mirrorOf>
			<name>Nexus aliyunname>
			<url>http://maven.aliyun.com/nexus/content/groups/publicurl>
		mirror> 
    mirrors>
	<profiles>
		<profile>       
			 <id>jdk-1.8id>       
			 <activation>       
					 <activeByDefault>trueactiveByDefault>       
					 <jdk>1.8jdk>       
			 activation>       
			 <properties>       
					 <maven.compiler.source>1.8maven.compiler.source>       
					 <maven.compiler.target>1.8maven.compiler.target>       
					 <maven.compiler.compilerVersion>1.8maven.compiler.compilerVersion>       
			 properties>       
		profile> 
  profiles>
settings>

2.Maven入门

2.1.maven的三种仓库

  • 本地仓库:自己维护
  • 远程仓库(私服):公司维护
  • 中央仓库:maven团队维护

三种仓库的关系图
Maven_项目构建及相关基础_第7张图片

2.2.Maven的目录结构

Project

|-src

| |-main

| | |-java —— 存放项目的.java文件

| | |-resources —— 存放项目资源文件,如spring, hibernate配置文件

| |-test

| |-java ——存放所有测试.java文件,如JUnit测试类

| |-resources —— 测试资源文件

|-target —— 目标文件输出位置例如.class、.jar、.war文件

|-pom.xml ——maven项目核心配置文件

注意:Maven的工程目录结构是固定的,如果不一样,会导致项目无法正常使用

2.2.1.eclipse创建maven工程

相对来说eclipse这个IDE工具使用率正在下降,所以可以参考以下文章

eclipse创建maven工程

2.2.2.IDEA创建Maven工程

  1. 配置
    Maven_项目构建及相关基础_第8张图片

  2. 创建项目
    Maven_项目构建及相关基础_第9张图片

    注意:可以不用选择模板直接创建即可

Maven_项目构建及相关基础_第10张图片

选择自动导入maven项目的改变

2.3.Maven指令

注意:

需要在pom.xml所在目录中执行以下命令

2.3.1.单个指令

mvn compile

​ 执行 mvn compile命令,完成编译操作

​ 执行完毕后,会生成target目录,该目录中存放了编译后的字节码文件。

mvn clean

​ 执行 mvn clean命令

​ 执行完毕后,会将target目录删除

mvn test

​ 执行 mvn test命令,完成单元测试操作

​ 执行完毕后,会在target目录中生成三个文件夹:surefire、surefire-reports(测试报告)、test-classes(测试的字节码文件)

mvn package

​ 执行 mvn package命令,完成打包操作

​ 执行完毕后,会在target目录中生成一个文件,该文件可能是jar、war

mvn install

​ 执行 mvn install命令,完成将打好的jar包安装到本地仓库的操作

​ 执行完毕后,会在本地仓库中出现安装后的jar包,方便其他工程引用

2.3.2.组合指令

mvn clean compile命令

​ cmd 中录入 mvn clean compile命令

​ 组合指令,先执行clean,再执行compile,通常应用于上线前执行,清除测试类

mvn clean test命令

​ cmd 中录入 mvn clean test命令

​ 组合指令,先执行clean,再执行test,通常应用于测试环节

mvn clean package命令

​ cmd 中录入 mvn clean package命令

​ 组合指令,先执行clean,再执行package,将项目打包,通常应用于发布前

执行过程:

​ 清理————清空环境

​ 编译————编译源码

​ 测试————测试源码

​ 打包————将编译的非测试类打包

mvn clean install命令

​ cmd 中录入 mvn clean install 查看仓库,当前项目被发布到仓库中

​ 组合指令,先执行clean,再执行install,将项目打包,通常应用于发布前

执行过程:

​ 清理————清空环境

​ 编译————编译源码

​ 测试————测试源码

​ 打包————将编译的非测试类打包

​ 部署————将打好的包发布到资源仓库中

跳过测试

​ 指令:-Dmaven.test.skip=true

​ ==执行方式:==mvn package -Dmaven.test.skip=true

3.Maven核心

3.1.坐标

什么是坐标?

​ 在平面几何中坐标(x,y)可以标识平面中唯一的一点。在maven中坐标就是为了定位一个唯一确定的jar包

​ Maven世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范拥有了统一规范,就可以把查找工作交给机器

3.1.1.坐标的组成

maven的坐标由以下三个部分组成

  1. groupId:定义当前Maven组织名称
  2. artifactId:定义实际项目名称
  3. version:定义当前项目的当前版本

3.2.依赖管理

​ 就是对项目中jar 包的管理。可以在pom文件中定义jar包的GAV坐标,管理依赖。

依赖声明主要包含如下元素:

​ 如下所示

<dependencies>
		<dependency>
			<groupId>junitgroupId>
			<artifactId>junitartifactId>
			<version>4.12version>
			<scope>testscope>
		dependency>	
dependencies>

3.3.依赖范围

Maven_项目构建及相关基础_第11张图片

其中依赖范围scope 用来控制依赖和编译,测试,运行的classpath的关系. 主要的是三种依赖关系如下:

  1. compile: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
  2. test:测试依赖范围。只对于测试classpath有效
  3. provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api
  4. runtime:运行时提供。例如:jdbc驱动

3.4.依赖传递

​ 假设我们在项目中引用了某个jar包,而这个jar包又需要另外一个jar包才可以运行,这个时候maven就会将这个所需要的jar包也导入进来,这个就是依赖传递

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JH0TrcU3-1605623075086)(img/12.png)]

如果B中使用A,C中使用B,则称B是C的直接依赖,而称A是C的间接依赖

C->B B->A

C直接依赖B

C间接依赖A

3.5.依赖冲突

  • 如果直接与间接依赖中包含有同一个坐标不同版本的资源依赖,以直接依赖的版本为准==(就近原则)==
  • 如果直接依赖中包含有同一个坐标不同版本的资源依赖,以配置顺序下方的版本为准==(第一声明者优先原则)==

3.6.依赖排除

<dependency>
	  <groupId>junitgroupId>
	  <artifactId>junitartifactId>
	  <version>4.12version>
	  <scope>testscope>
	  <exclusions>
           <exclusion>
               <artifactId>hamcrest-coreartifactId>
               <groupId>org.hamcrestgroupId>
           exclusion>			
	 exclusions>
dependency>

排除依赖包中所包含的依赖关系,不需要添加版本号

如果在本次依赖中有一些多余的jar包也被传递依赖过来,如果想把这些jar包排除的话可以配置exclusions进行排除

在idea中有maven helper插件可以更方便的管理和排除依赖,直接在idea的插件部分搜索即可

4.关于Maven的生命周期

4.1.什么是生命周期?

Maven生命周期就是为了对所有的构建过程进行抽象和统一。包括项目清理、初始化、编译、打包、测试、部署等几乎所有构建步骤。

生命周期可以理解为构建工程的步骤。

在Maven中有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,这三套生命周期分别是:

  • Clean Lifecycle: 在进行真正的构建之前进行一些清理工作
  • Default Lifecycle: 构建的核心部分,编译,测试,打包,部署等等
  • Site Lifecycle: 生成项目报告,站点,发布站点

​ 再次强调一下它们是相互独立的,你可以仅仅调用clean来清理工作目录,仅仅调用site来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期

​ 所谓的组合指令也是组合三个不同生命周期的指令

4.2.Maven三大生命周期

clean:清理项目

​ 每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比如,运行mvn clean ,这个的clean是Clean生命周期的一个阶段。有Clean生命周期,也有clean阶段。Clean生命周期一共包含了三个阶段:

pre-clean 执行一些需要在clean之前完成的工作 
clean 移除所有上一次构建生成的文件 
post-clean 执行一些需要在clean之后立刻完成的工作 

​ mvn clean 中的clean就是上面的clean,在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行,也就是说,mvn clean 等同于 mvn pre-clean clean ,如果我们运行 mvn post-clean ,那么 pre-clean,clean 都会被运行。这是Maven很重要的一个规则,可以大大简化命令行的输入

default:构建项目

​ Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里,只解释一些比较重要和常用的阶段

validate 
generate-sources 
process-sources 
generate-resources 
process-resources 复制并处理资源文件,至目标目录,准备打包。 
compile 编译项目的源代码。 
process-classes 
generate-test-sources 
process-test-sources 
generate-test-resources 
process-test-resources 复制并处理资源文件,至目标测试目录。 
test-compile 编译测试源代码。 
process-test-classes 
test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。 
prepare-package 
package 接受编译好的代码,打包成可发布的格式,如 JAR 。 
pre-integration-test 
integration-test 
post-integration-test 
verify 
install 将包安装至本地仓库,以让其它项目依赖。 
deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享。

运行任何一个阶段的时候,它前面的所有阶段都会被运行,这也就是为什么我们运行mvn install 的时候,代码会被编译,测试,打包。此外,Maven的插件机制是完全依赖Maven的生命周期的,因此理解生命周期至关重要

site:生成项目站点

Site生命周期

pre-site 执行一些需要在生成站点文档之前完成的工作 
site 生成项目的站点文档 
post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备 
site-deploy 将生成的站点文档部署到特定的服务器上 

这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能,Manager比较喜欢,文档及统计数据自动生成,很好看

5.Maven插件

​ Maven的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的。每个插件都能实现一个功能,每个功能就是一个插件目标。Maven的生命周期与插件目标相互绑定,以完成某个具体的构建任务。

例如compile就是插件maven-compiler-plugin的一个插件目标

插件内容的写法(在pom.xml文件中修改)

<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.pluginsgroupId>
				<artifactId>maven-compiler-pluginartifactId>
				<configuration>
					<source>1.8source>
					<target>1.8target>
					<encoding>UTF-8encoding>
				configuration>
			plugin>
		plugins>
	build>

修改配置文件后,在工程中更新maven即可

5.1.常见maven的依赖


<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.0modelVersion>

    <groupId>com.zhiyougroupId>
    <artifactId>iportalartifactId>
    <version>1.0-SNAPSHOTversion>

    <dependencies>

        
        <dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>4.12version>
            <scope>testscope>
        dependency>

        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-testartifactId>
            <version>5.0.5.RELEASEversion>
            <scope>testscope>
        dependency>

        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-webmvcartifactId>
            <version>5.0.5.RELEASEversion>
        dependency>

        <dependency>
            <groupId>com.alibabagroupId>
            <artifactId>fastjsonartifactId>
            <version>1.2.47version>
        dependency>

        
        <dependency>
            <groupId>javax.servletgroupId>
            <artifactId>javax.servlet-apiartifactId>
            <version>3.1.0version>
            <scope>providedscope>
        dependency>

        <dependency>
            <groupId>javax.servletgroupId>
            <artifactId>jstlartifactId>
            <version>1.2version>
        dependency>

        <dependency>
            <groupId>javax.servlet.jspgroupId>
            <artifactId>jsp-apiartifactId>
            <version>2.2version>
            <scope>providedscope>
        dependency>
        

        
        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
            <version>5.1.20version>
            <scope>runtimescope>
        dependency>

        
        <dependency>
            <groupId>com.alibabagroupId>
            <artifactId>druidartifactId>
            <version>1.1.9version>
        dependency>

        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-jdbcartifactId>
            <version>5.0.5.RELEASEversion>
        dependency>

        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-txartifactId>
            <version>5.0.5.RELEASEversion>
        dependency>

        
        <dependency>
            <groupId>org.mybatisgroupId>
            <artifactId>mybatisartifactId>
            <version>3.4.6version>
        dependency>

        
        <dependency>
            <groupId>org.mybatisgroupId>
            <artifactId>mybatis-springartifactId>
            <version>1.3.2version>
        dependency>

        
        <dependency>
            <groupId>com.github.pagehelpergroupId>
            <artifactId>pagehelperartifactId>
            <version>5.1.4version>
        dependency>

        
        <dependency>
            <groupId>commons-beanutilsgroupId>
            <artifactId>commons-beanutilsartifactId>
            <version>1.9.3version>
        dependency>

        
        <dependency>
            <groupId>commons-fileuploadgroupId>
            <artifactId>commons-fileuploadartifactId>
            <version>1.3.3version>
        dependency>

    dependencies>
project>

6.Log4j

6.1.简介

Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、邮箱等;我们也可以控制每一条日志的输出格式

通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码

应用场景

本地开发中IDE可以直接控制台输出(菜鸟的行为),可是程序在远程服务器上如何查看呢?通过log4j,可以配置项目以文件日志形式输出

日志级别

log4j有多种日志级别OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,

推荐使用的为4个等级 从高到底ERROR, WARN, INFO,DEBUG

建议:

测试服务器:INFO,会输出ERROR,WARN,INFO三个等级的日志信息

正式服务器:ERROR 可以定义为ERROR等级,提高性能

开发环境: DEBUG 方便调试

可以配置全局的日志级别,也可以为某个类单独配置日志级别

日志输出:

日志可以输出到多种终端,比如到控制台,文件(可以每天创建一个日志文件),邮箱等。比如正式数据库突然无法连接了,可以把错误日志发送到指定邮箱,提醒相关人员赶紧检查原因

6.2.配置使用

  1. 引入依赖

    <dependency>
    	<groupId>log4jgroupId>
    	<artifactId>log4jartifactId>
    	<version>1.2.16version>
    dependency>
    
  2. 添加配置文件

    在resources目录下添加log4j.properties,(非maven项目可以放在默认的src目录下)

    #全局配置
    log4j.rootLogger=debug,console, file
    #debug 测试阶段使用
    #info 上线
    #控制台日志输出
    log4j.appender.console=org.apache.log4j.ConsoleAppender
    log4j.appender.console.layout=org.apache.log4j.PatternLayout
    log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p] %l %m %n
    
    #输出到文件
    log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.file.File=./logs/access.log
    log4j.appender.file.DatePattern='_'yyyyMMdd'.log'
    log4j.appender.file.encoding=UTF-8
    log4j.appender.file.layout=org.apache.log4j.PatternLayout
    log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p] %l %m%n
    #追加模式记录日志
    log4j.appender.file.Append=true
    

你可能感兴趣的:(Maven)