1. maven 约定的目录结构:
目录 | 备注 |
---|---|
${basedir} | 存放pom.xml和所有的子目录 |
${basedir}/src/main/java | 项目的java源代码 |
${basedir}/src/main/resources | 项目的资源,比如说property文件,springmvc.xml |
${basedir}/src/test/java | 项目的测试类,比如说Junit代码 |
${basedir}/src/test/resources | 测试用的资源 |
${basedir}/src/main/webapp/WEB-INF | web应用文件目录,web项目的信息,比如存放web.xml、本地图片、jsp视图页面 |
${basedir}/target | 打包输出目录 |
${basedir}/target/classes | 编译输出目录 |
${basedir}/target/test-classes | 测试编译输出目录 |
Test.java | Maven只会自动运行符合该命名规则的测试类 |
~/.m2/repository | Maven默认的本地仓库目录位置 |
2. maven 基本 pom 样例
4.0.0
com.companyname.project-group
project
1.0
3.生命周期
生命周期阶段 | 描述 |
---|---|
validate(校验) | 校验项目是否正确并且所有必要的信息可以完成项目的构建过程。 |
initialize(初始化) | 初始化构建状态,比如设置属性值。 |
generate-sources(生成源代码) | 生成包含在编译阶段中的任何源代码。 |
process-sources(处理源代码) | 处理源代码,比如说,过滤任意值。 |
generate-resources(生成资源文件) | 生成将会包含在项目包中的资源文件。 |
process-resources (处理资源文件) | 复制和处理资源到目标目录,为打包阶段最好准备。 |
compile(编译) | 编译项目的源代码。 |
process-classes(处理类文件) | 处理编译生成的文件,比如说对Java class文件做字节码改善优化。 |
generate-test-sources(生成测试源代码) | 生成包含在编译阶段中的任何测试源代码。 |
process-test-sources(处理测试源代码) | 处理测试源代码,比如说,过滤任意值。 |
generate-test-resources(生成测试资源文件) | 为测试创建资源文件。 |
process-test-resources(处理测试资源文件) | 复制和处理测试资源到目标目录。 |
test-compile(编译测试源码) | 编译测试源代码到测试目标目录. |
process-test-classes(处理测试类文件) | 处理测试源码编译生成的文件。 |
test(测试) | 使用合适的单元测试框架运行测试(Juint是其中之一)。 |
prepare-package(准备打包) | 在实际打包之前,执行任何的必要的操作为打包做准备。 |
package(打包) | 将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件。 |
pre-integration-test(集成测试前) | 在执行集成测试前进行必要的动作。比如说,搭建需要的环境。 |
integration-test(集成测试) | 处理和部署项目到可以运行集成测试环境中。 |
post-integration-test(集成测试后) | 在执行集成测试完成后进行必要的动作。比如说,清理集成测试环境。 |
verify (验证) | 运行任意的检查来验证项目包有效且达到质量标准。 |
install(安装) | 安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖。 |
deploy(部署) | 将最终的项目包复制到远程仓库中与其他开发者和项目共享。 |
- 命令行调用
在开发环境中,使用下面的命令去构建、安装工程到本地仓库
mvn install
这个命令在执行 install 阶段前,按顺序执行了 default 生命周期的阶段 (validate,compile,package,等等),我们只需要调用最后一个阶段,如这里是 install。
在构建环境中,使用下面的调用来纯净地构建和部署项目到共享仓库中
mvn clean deploy
这行命令也可以用于多模块的情况下,即包含多个子项目的项目,Maven 会在每一个子项目执行 clean 命令,然后再执行 deploy 命令。
4. 仓库
Maven 仓库有三种类型:
本地(local)
中央(central)
远程(remote)
Maven 依赖搜索顺序
当我们执行 Maven 构建命令时,Maven 开始按照以下顺序查找依赖的库:
步骤 1 - 在本地仓库中搜索,如果找不到,执行步骤 2,如果找到了则执行其他操作。
步骤 2 - 在中央仓库中搜索,如果找不到,并且有一个或多个远程仓库已经设置,则执行步骤 4,如果找到了则下载到本地仓库中以备将来引用。
步骤 3 - 如果远程仓库没有被设置,Maven 将简单的停滞处理并抛出错误(无法找到依赖的文件)。
步骤 4 - 在一个或多个远程仓库中搜索依赖的文件,如果找到则下载到本地仓库以备将来引用,否则 Maven 将停止处理并抛出错误(无法找到依赖的文件)。
阿里云的仓库
Maven 仓库默认在国外, 国内使用难免很慢
第一步:修改 maven 根目录下的 conf 文件夹中的 setting.xml 文件,在 mirrors 节点上,添加内容如下:
alimaven
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
central
第二步: pom.xml文件里添加:
alimaven
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
true
false
5. 快照
快照是一种特殊的版本,指定了某个当前的开发进度的副本。不同于常规的版本,Maven 每次构建都会在远程仓库中检查新的快照。 现在 data-service 团队会每次发布更新代码的快照到仓库中,比如说 data-service:1.0-SNAPSHOT 来替代旧的快照 jar 包。
6.依赖范围
compile(编译范围)
默认范围,会被打包
provided
作用于编译、测试,构建时依赖不会被打包,常见于自己封装的组件!
runtime(运行时范围)
runtime 依赖在运行和测试系统的时候需要(运行时才可用),但在编译的时候不需要
test(测试范围)
system(系统范围)
system范围依赖与provided 类似,但是你必须显式的提供一个对于本地系统中JAR 文件的路径。
7.dependencies与dependencyManagement的区别
dependencyManagement只声明不真正引用,dependencies时可以不用再写版本号。
org.springframework.boot
spring-boot-dependencies
${springboot.version}
pom
import
mysql
mysql-connector-java
${mysql.version}
pom
import
dependencies会真正引用。
8.发布本地jar到私服
mvn deploy:deploy-file -DgroupId= -DartifactId= -Dversion=RELEASE -Dpackaging=jar -Dfile= -Durl=http://ip:8080/repository/third-patry/ -DrepositoryId=third-party
9.install到本机
mvn install:install-file -DgroupId= -DartifactId= -Dpackaging=jar -Dfile=
10.排除jar包
...
...
...
...
...
...
...
示例
发布自己的组件到中央仓库,pom样例,以yt-web为例:
4.0.0
com.github.javawebers
yt-web
1.5.3
https://github.com/javawebers/yt-web
yt-web
webs
scm:[email protected]:javawebers/yt-web.git
scm:[email protected]:javawebers/yt-web.git
[email protected]:javawebers/yt-web.git
The Apache Software License, Version 2.0
http://www.apache.org/licenses/LICENSE-2.0.txt
liujiasheng
[email protected]
limiao
[email protected]
UTF-8
2.2.2.RELEASE
1.3.1
com.github.javawebers
yt-commons
${yt-commons.version}
org.springframework.boot
spring-boot-starter-web
${spring-boot.version}
provided
org.springframework.boot
spring-boot-starter-aop
${spring-boot.version}
provided
org.springframework.boot
spring-boot-starter-test
${spring-boot.version}
test
org.testng
testng
6.14.3
test
io.springfox
springfox-swagger2
2.9.2
test
io.springfox
springfox-swagger-ui
2.9.2
test
org.apache.maven.plugins
maven-compiler-plugin
3.8.1
UTF-8
1.8
org.sonatype.plugins
nexus-staging-maven-plugin
1.6.8
true
release
https://oss.sonatype.org/
true
org.apache.maven.plugins
maven-source-plugin
3.2.0
attach-sources
jar-no-fork
org.apache.maven.plugins
maven-javadoc-plugin
3.1.1
attach-javadocs
jar
org.apache.maven.plugins
maven-gpg-plugin
1.6
sign-artifacts
verify
sign
release
https://oss.sonatype.org/content/repositories/snapshots/
release
https://oss.sonatype.org/service/local/staging/deploy/maven2/
jdk18
true
1.8
1.8
1.8
1.8
父Pom 子Pom
chapter1
chapter2
chapter3
chapter4
...
pom
4.0.0
com.github.limiaogithub
...
1.0
jar
chapter2
跳过测试命令
-Dmaven.test.skip=true
设置新版本号,并更新所有子Pom
mvn versions:set -DnewVersion=${build_version}
mvn -N versions:update-child-modules
回退新版本号
mvn versions:revert
只构建依赖的模块
install -pl ... -e