导图社区 Maven
个人学习笔记,maven。帮助学习记忆。
编辑于2019-03-30 03:30:40Maven
1. 目录结构,仓库,约定
常用目录
conf
该目录有一个重要的文件settings.xml。直接修改该文件,就能在机器上全局的定义Maven的行为。
lib
该目录包含了Maven运行时需要的类库。在这个目录中,用户可以找到所有pom.xml的父POM。即是Maven内置的pom
Maven工程约定
src/main/java
存放项目的java文件
src/main/resource
存放项目的资源文件
src/test/java
存放测试的java文件
src/test/resource
存放测试用的资源文件
target
项目的输出目录
pom.xml
构件文件
仓库
本地仓库的存放位置
默认存放在用户家目录下的.m2目录
修改本地仓库的位置
修改安装目录conf下的setting.xml,找到localRepository标签修改成。<localRepository>c:\maven\repository</localRepository>
分类
本地仓库:本地工程的仓库,为本地的项目服务的
远程仓库
私服仓库(NEXUS ):搭建在局域网环境中
中央仓库:为全世界用户服务
中央仓库镜像:分布在各大洲,为中央仓库减轻流量
2. 执行过程
清理————清空环境
编译————编译源码
测试————测试源码
打包————将编译的非测试类打包
3. POM的编写和坐标
POM是Maven的核心。即(Project Object Model)
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></project> 对于Maven2和Maven3来说,只能是4.0.0
坐标
常用标签
groupId
命名→域名倒序+工程名
如:<groupId>cn.ljcode.Bog</grougId>
artifactId
可以理解工程的某个模块名
如:<artifactId>message</artifactId>
version
每个模块也有自己的版本
如:<version>1.0</version>
name
声明了一个对于用户更友好的项目名称。不是必须的。当时可以方便信息交流。
groupId,artifactId,version可以在maven工程里唯一指定一个工程。
maven坐标和仓库的对应关系
文件就位于创库下:log4j/log4j/1.2.12/log4j-1.2.12.jar
<groupId>example</groupId><artifactId>example</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging>
4. 常用命令
基本命令
单一命令
mvn compile
执行完毕后,生成maven工程的后的字节吗文件,生成目录target
mvn clean
删除生成的target目录
mvn test
执行测试目录,获取测试报表
mvn package
将项目打包成jar包或war包
mvn install
将项目安装到本地仓库
组合命令
mvn clear compile
先执行clean,再执行compile,通常应用于上线前执行,清除测试类
mvn clean test
先执行clean,再执行test,通常应用于测试环节
mvn clean package
先执行clean,再执行package,将项目打包,通常应用于发布前
日常代码
安装本地jar包
mvn install:install-file -Dfile=D:\mvn\spring-context-support-3.1.0.RELEASE.jar -DgroupId=org.springframework -DartifactId=spring-context-support -Dversion=3.1.0.RELEASE -Dpackaging=jar
打包的时候含资源文件
<build> <resources> <resource> <directory>src/main/java</directory> <excludes> <exclude>**/*.java</exclude> <exclude>**/.svn/*</exclude> </excludes> </resource> </resources></build>
打包或安装时跳过测试
直接使用命令
mvn install -Dmaven.test.skip=true
使用插件
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <skip>true</skip> </configuration></plugin>
指定java版本
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build>
阿里云仓库
<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
5. 依赖范围
关键字
compile
对主程序是否有效:有效
对测试程序时候有效:有效
是否参与打包:参与
test
对主程序是否有效:无效
对测试程序时候有效:有效
是否参与打包:不参与
provided 通常用于web工程
对主程序是否有效:有效
对测试程序是否有效:有效
是否参与打包:不参与
是否参与部署:不参与
依赖的范围
依赖的传递性
可以通过IDE查看pom.xml里的依赖性
可以看到,dom4j,junit4分别还依赖的其他两个包。如果使用了compile,那么也会参与打包和部署。把dom4j,junit叫做直接依赖。而把xml-apis,hamcrest-core叫做间接依赖.
tips:非compile的依赖不能传递。
依赖的排除
派出依赖使用 <exclusions> 标签
<dependencies> <dependency> <groupId>B</groupId> <artifactId>B</artifactId> <version>0.0.1</version> <exclusions> <exclusion> <!--被排除的依赖包坐标--> <groupId>A</groupId> <artifactId>A</artifactId> <version>0.0.1</version> </exclusion> </exclusions> </dependency></dependencies>
依赖的原则
验证路径最短者优先原则
路径相同时,先声明者优先