Maven是apache下的一个开源项目,是纯java开发的,主要作用于管理java项目。Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具
官方下载
官方地址
全局配置
在你所在的Maven解压文件中settings.xml就是你的全局配置,可以直接改全局配置,但是更好的是可以直接写一个自己的用户配置
用户配置
当运行完cmd的mvn –v之后会产生一个默认的maven目录:~/.m2/repository。
其中~表示当前用户路径C:\Users\ [UserName]
~/.m2/settings.xml是用户的配置文件(默认没有该文件,需要将全局配置文件拷贝过来在进行修改)
注意:一般本地仓库的地址不使用默认配置,通常情况下需要在用户配置中,配置新的仓库地址。
配置步骤
<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>
Project
|-src
| |-main
| | |-java —— 存放项目的.java文件
| | |-resources —— 存放项目资源文件,如spring, hibernate配置文件
| |-test
| |-java ——存放所有测试.java文件,如JUnit测试类
| |-resources —— 测试资源文件
|-target —— 目标文件输出位置例如.class、.jar、.war文件
|-pom.xml ——maven项目核心配置文件
注意:Maven的工程目录结构是固定的,如果不一样,会导致项目无法正常使用
相对来说eclipse这个IDE工具使用率正在下降,所以可以参考以下文章
eclipse创建maven工程
选择自动导入maven项目的改变
注意:
需要在pom.xml所在目录中执行以下命令
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包,方便其他工程引用
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
什么是坐标?
在平面几何中坐标(x,y)可以标识平面中唯一的一点。在maven中坐标就是为了定位一个唯一确定的jar包。
Maven世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范拥有了统一规范,就可以把查找工作交给机器
maven的坐标由以下三个部分组成
就是对项目中jar 包的管理。可以在pom文件中定义jar包的GAV坐标,管理依赖。
依赖声明主要包含如下元素:
如下所示
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>testscope>
dependency>
dependencies>
其中依赖范围scope 用来控制依赖和编译,测试,运行的classpath的关系. 主要的是三种依赖关系如下:
假设我们在项目中引用了某个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
<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的插件部分搜索即可
Maven生命周期就是为了对所有的构建过程进行抽象和统一。包括项目清理、初始化、编译、打包、测试、部署等几乎所有构建步骤。
生命周期可以理解为构建工程的步骤。
在Maven中有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,这三套生命周期分别是:
再次强调一下它们是相互独立的,你可以仅仅调用clean来清理工作目录,仅仅调用site来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期
所谓的组合指令也是组合三个不同生命周期的指令
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比较喜欢,文档及统计数据自动生成,很好看
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即可
<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>
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 方便调试
可以配置全局的日志级别,也可以为某个类单独配置日志级别
日志输出:
日志可以输出到多种终端,比如到控制台,文件(可以每天创建一个日志文件),邮箱等。比如正式数据库突然无法连接了,可以把错误日志发送到指定邮箱,提醒相关人员赶紧检查原因
引入依赖
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.16version>
dependency>
添加配置文件
在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