解决包管理太麻烦、项目对包依赖的复杂关系的相关问题
Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件
项目构架:编译 -->测试–>打包–>运行
依赖管理:jar包管理
项目聚合:
Maven\Gradle\Ant
下载
配置环境变量(配置完毕后通过调用mvn -version进行测试)
变量名 | 值 |
---|---|
MAVEN_HOME | MAVEN项目根目录 |
%MAVEN%\bin | 添加到Path路径 |
文件夹目录
bin:含有mvn运行脚本
boot:含有plexus-classworlds类加载器框架
lib:含有Maven运行时所需要的java类库
conf:含有setting.xml配置文件
Setting:默认repository仓库路径($(user)/.m2/repository),通过Maven下载的jar包都会保存在该路径
本地仓库:就是Maven在本机存储构件的地方。maven的本地仓库,在安装maven后并不会创建,它是在第一次执行 maven命令的时候才被创建。maven本地仓库的默认位置:在用户的目录下都只有一个.m2/repository/的仓库目录;可以修改。
<localRepository> E:/repository/maven/reposlocalRepository>
中央仓库:包含了绝大多数流行的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等。开源的Java项目依赖的构件都可以在这里下载到。
中央仓库的地址:http://repo1.maven.org/maven2/
私服:是一种特殊的远程仓库,它是架设在局域网内的仓库。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LDOvZMdY-1571881204071)(G:\QF\Markdown\pic\Pharse3\Maven\仓库联系.png)]
解压文件
配置环境变量
变量名 | 值 |
---|---|
NEXUS_HOME | 安装地址(解压地址) |
%NEXUS_HOME%\bin | 加入Path路径 |
打开命令行执行命令
C:\Users\Administrator>nexus install 安装服务
C:\Users\Administrator>nexus start 启动服务
C:\Users\Administrator>nexus uninstall 卸载服务
访问私服
默认账户:admin 密码:admin123 访问路径:http://localhost:8081/nexus
NEXUS内部使用Jetty作为服务器,界面通过ext.js开发
host仓库—>内部项目的发布仓库
Snapshots 发布内部snapshots版本的仓库
Releases 发布内部release版本的仓库
Snapshot版本代表不稳定、尚处于开发中的版本,快照版本。
Release版本则代表稳定的版本,发行版本。
3rd party 发布第3方jar包的仓库,如oracle数据库驱动,open-189.jar
proxy仓库—>从远程中心仓库查找jar包的仓库
Apache Snapshots 查找Apache项目的快照版本的仓库
Central 中心仓库http://repo1.maven.org/maven2/
Codehaus Snapshots 查找Codehaus 的快照版本的仓库
group仓库—>把仓库按组划分,以组为单位进行管理
virtual仓库
私服的配置/Repository的配置
在parent模块的pom.xml中加入私服的配置,让Maven从私服下载jar包,而不直接去远程仓库下载。
默认情况下,Maven下载jar包将直接连接到外网http://repo1.maven.org/maven2/去下载;
安装私服之后,让Maven下载jar包先从私服查找,如果没有,再从外网下载并保存在私服上
在POM在加入下面的配置,其中url为NEXUS私服的Public Repository对外的地址
以后,Maven下载构建(jar包或插件)都将从这里开始下载
<profiles>
<profile>
<id>profile-nexusid>
<repositories>
<repository>
<id>nexusid>
<url>http://localhost:8081/nexus/content/groups/public/url>
<snapshots><enabled>trueenabled>snapshots>
<releases><enabled>trueenabled>releases>
repository>
repositories>
<pluginRepositories>
<pluginRepository>
<id>nexusid>
<url>http://localhost:8081/nexus/content/groups/public/url>
<snapshots><enabled>trueenabled>snapshots>
<releases><enabled>trueenabled>releases>
pluginRepository>
pluginRepositories>
profile>
profiles>
<activeProfiles>
<activeProfile>profile-nexusactiveProfile>
activeProfiles>
<mirrors>
<mirror>
<id>alimavenid>
<name>aliyun mavenname>
<url>http://maven.aliyun.com/nexus/content/groups/public/url>
<mirrorOf>centralmirrorOf>
mirror>
mirrors>
项目目录 | 概述 |
---|---|
${basedir} | 存放pom.xml文件和所有子目录 |
${basedir}/src/main/java | 存放java源代码 |
${basedir}/src/main/resources | 存放项目资源文件,如properties配置文件 |
${basedir}/src/test/java | 存放测试类源码,比如Junit代码 |
${basedir}/src/test/resources | 存放测试需要的资源文件 |
${basedir}/target | 存放编译后 的 classes 会放在 basedir/target/classes 下面, 和生成的JAR 文件 |
编译源代码: mvn compile
编译测试代码:mvn test-compile
清除产生的项目:mvn clean
运行测试:mvn test
产生site:mvn site 站点:对整个项目的描述
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-site-pluginartifactId>
<version>3.7.1version>
<dependencies>
<dependency>
<groupId>org.apache.maven.doxiagroupId>
<artifactId>doxia-site-rendererartifactId>
<version>1.8version>
dependency>
dependencies>
plugin>
plugins>
build>
打包:mvn package
在本地Repository中安装jar:mvn install
上传项目到远程仓库:mvn deploy(更多是私服,需要用户名密码等认证)
三套生命周期:
Clean 清理项目对应命令: mvn clean
Default 最核心的生命周期 :
验证:mvn validate
编译:mvn compile
测试:mvn test
打包:mvn pagkage
安装到仓库:mvn install
发布到远程仓库/私库:mvn deploy
Site 生成站点:mvn site
clean、default、site
clean: 主要目的是清理项目
pre-clean: 执行一些清理前需要完成的工作
clean: 清理上一次构建生成的文件
post-clean: 执行一些清理后需要完成的工作
default:定义了真正构建时所需要执行的所有步骤,它是生命周期中最核心的部分
validate
initialize
generate-sources
process-sources: 处理项目主资源文件。一般来说,是对src/main/resources目录的内容进行变量替换等工作后,复制到项目输出的主classpath目录中
generate-resources
process-resources
compile: 编译项目的主源码。一般来说,是编译src/main/java目录下的Java文件至项目输出的主classpath目录中target
process-classes
generate-test-sources
process-test-sources: 处理项目测试资源文件。一般来说,是对src/test/resources目录的内容进行变量替换等工作后,复制到项目输出的测试classpath目录中
generate-test-resources
process-test-resources
test-compile: 编译项目的测试代码,一般来说,是编译src/test/java目录下的Java文件至项目输出的测试classpath目录中
process-test-classes
test: 使用单元测试框架运行测试,测试代码不会打包或部署
prepare-package
package: 接受编译好的代码,打包成可发布的格式,如JAR
pre-integration-test
integration-test
post-integration-test
verify
install: 将包安装到Maven本地仓库,供本地其他Maven项目使用
deploy: 将最终的包复制到远程仓库,供其他开发人员和Maven项目使用
site生命周期: 建立和发布项目站点,Maven能够基于POM所包含的信息,自动生成站点
pre-site: 执行一些在生成项目站点之前需要完成的工作
site: 生成项目站点文档
post-site: 执行一些在生成项目站点之后需要完成的工作
site-deploy: 将生成的项目站点发布到服务器上
基本配置
pom.xml
<modelVersion>4.0.0modelVersion>
<groupId>cn.cdqfgroupId>
<artifactId>maven_01artifactId>
<version>1.0-SNAPSHOTversion>
<packaging>warpackaging>
<properties>
<junit.version>4.12junit.version>
properties>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>${junit.version}version>
<scope>testscope>
dependency>
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-swagger-uiartifactId>
<version>2.9.2version>
<exclusions>
<exclusion>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-apiartifactId>
exclusion>
exclusions>
dependency>
dependencies>
<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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.winner.tradegroupId>
<artifactId>trade-coreartifactId>
<version>1.0.0-SNAPSHOTversion>
<packaging>jarpackaging>
<classifier>...classifier>
<dependencies>
<dependency>
<groupId>com.winner.tradegroupId>
<artifactId>trade-testartifactId>
<version>1.0.0-SNAPSHOTversion>
<scope>testscope>
<optional>falseoptional>
<exclusions>
<exclusion>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-apiartifactId>
exclusion>
exclusions>
dependency>
dependencies>
<properties>
<file.encoding>UTF-8file.encoding>
<java.source.version>1.5java.source.version>
<java.target.version>1.5java.target.version>
properties>
...
project>
Scope介绍(面试重点)
scope
定义了依赖的范围,默认是compile
。
classpath
都有效,即在编译、测试和运行时都要使用该依赖jar包junit
servlet-api
,在项目运行时,tomcat
等容器已经提供,无需Maven重复引入jdbc
驱动实现,编译时只需接口,测试或运行时才需要具体的 jdbc
驱动实现;system
范围的依赖时必须通过systemPath
元素显示地指定依赖文件的路径,不依赖Maven仓库解析,所以可能会造成建构的不可移植,谨慎使用jar包冲突(面试重点)
传递依赖:某个sdk(写得好的项目)首先这个项目会依赖某些jar,其它人 用到该sdk 需要导入sdk 的jar,也会传递导入sdk依赖jar
引入条件:
```xml
io.springfox
springfox-swagger-ui
2.9.2
org.slf4j
slf4j-api
```
其他配置(了解)
<build>
<plugins>
<plugin>
<artifactId>maven-resources-pluginartifactId>
<configuration>
<encoding>UTF-8encoding>
configuration>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>3.6.0version>
<configuration>
<source>1.8source>
<target>1.8target>
<compilerArgs>
<arg>-parametersarg>
<arg>-Xlint:uncheckedarg>
<arg>-Xlint:deprecation arg>
compilerArgs>
configuration>
plugin>
plugins>
build>
插件名称 | 用途 | 来源 |
---|---|---|
maven –clean -plugin | 清理项目 | Apache |
maven –compile -plugin | 编译项目 | Apache |
maven –deploy -plugin | 部署项目 | Apache |
maven –install -plugin | 安装项目 | Apache |
maven –resources -plugin | 处理资源文件 | Apache |
maven –site -plugin | 生成站点 | Apache |
maven –surefire -plugin | 执行测试 | Apache |
maven –jar -plugin | 构建JAR项目 | Apache |
maven –war -plugiin | 构建war项目 | Apache |
maven –shade -plugin | 构建包含遗憾的JAR包 | Apache |
maven –changelog -plugin | 生产版本控制变更报告 | Apache |
maven –checkstyle -plugin | 生成checkStyle报告 | Apache |
maven –javadoc –plugin | 生成JavaDoc文档 | Apache |
maven –pmd –plugin | 生成PMD报告 | Apache |
maven –project –info -reports –plugin | 生成项目信息报告 | Apache |
maven –surefire –plugin | 生成单元测试报告 | Apache |
maven -archetype –plugin | 基于Archetype生成项目骨架 | Apache |
maven –assembly –plugin | 构建自定义格式的分布包 | Apache |
maven –dependency –plugin | 依赖分析及控制 | Apache |
maven –enforcer –plugin | 定义规则并强制要求遵守 | Apache |
maven –pgp –plugin | 为项目构建生成PGP签名 | Apache |
maven -invoke –plugin | 自动运行Maven项目构建并验证 | Apache |
maven –release –plugin | 自动项目版本发布 | Apache |
maven –scm –plugin | 集成版本控制系统 | Apache |
maven –source –plugin | 生成源码包 | Apache |
properties –maven –plugin | 从properties文件读写Maven属性 | Codehaus |
sql –maven –plugin | 运行SQL脚本 | Codehaus |
tomcat –maven –plugin | 启动、停止、部署项目 | Codehaus |
versions –maven –plugin | 自动化批量更新POM版本 | Codehaus |
cargo –maven –plugin | 启动/停止/配置各类Web容器自动化部署Web项目 | Cargo |
jetty –maven –plugin | 集成jetty容器,实现快速开发测试 | Eclipse |
好处:模块重用