Maven简介
Maven的两个核心概念:坐标和依赖。
Maven坐标:
通过一些元素进行定义,包括groupId、artifactId、version、packaging、classifier。
依赖范围:
依赖范围主要用来控制与三种classpath(编译classpath、测试classpath、运行classpath)的关系。
compile: 编译依赖范围
test: 测试依赖范围
provided: 已提供依赖范围,例如Servlet-api,编译和测试需要,但运行时由容器提供,不需重复引入
runtime: 运行时依赖
system: 系统依赖范围;主要涉及本机系统绑定
import: 导入依赖范围
Maven仓库
坐标和依赖是任何一个构件在Maven世界中的逻辑表示方式,构件的物理表示方式是文件,Maven通过仓库来统一管理这些文件。
-仓库布局 大致为:groupId/artifactId/version/artifactId-version.packaging
-仓库分类 对Maven来说,只分为本地参考和远程仓库。Maven查找构件次序:优先本地仓库,本地无则去远程仓库查找。私服是一种特殊的远程仓库,为节省带宽和时间,应在局域网内假设一个私服
本地仓库
自定义本地仓库目录位置,例如C盘空间不足等。 修改~/.m2/setting.xml,设置localRespository元素的值
<localRepository>D:/Java/apache-maven-3.0.5/local_repos</localRepository>
默认情况下,~/.m2/settings.xml文件不存在,用户需要从Maven的安装位置,复制一份%MAVEN_HOME%/conf/settings.xml拷贝再进行编辑。
中央仓库
当我们创建一个简单的Maven项目后(只需要在pom.xml配置好依赖),运行mvn clean install就可以把项目构建好,不需要我们手工下载任何jar,这全靠中央仓库的存在,它会自动从仓库下载。这个仓库的定义是在${M2_HOME}/lib/maven-2.0.10-uber.jar 里面。你可以在里面找到\org\apache\maven\project\pom-4.0.0.xml 这个文件,在这个文件里面定义了默认中央仓库的地址:http://my.repository.com/repo/path,但是大家都懂得,在国内访问某些网站速度实在不敢恭维,所以这里可以自己设置中央仓库地址,我常用的就是oschina(开源中国)的中央仓库,地址为:http://maven.oschina.net/content/groups/public,具体设置是在~/.m2/settings.xml中修改<mirrors>,具体如下:
<mirror>
<id>nexus-osc</id>
<mirrorOf>*</mirrorOf>
<name>Nexus osc</name>
<url>http://maven.oschina.net/content/groups/public/</url>
</mirror>
从仓库解析依赖的机制
1、当依赖范围是system时,Maven直接从本地文件系统解析构件
根据依赖坐标计算仓库路径后,优先尝试直接从本地仓库寻找构件
本地不存在,如果依赖版本是显式的发布版本构件,如1.2、1.2-beta-1等,则遍历所有远程仓库
2、如果依赖的版本是RELEASE或者LATEST,则基于更新策略读取所有远程仓库的元数据groupId/artifactId/maven-metadata.xml,将其与本地仓库的对应元数据合并后,计算出RELEASE或者LATEST真实值,然后基于这个真实值检查本地和远程仓库
3、如果依赖的版本是SNAPSHOT,则基于更新策略读取所有远程仓库的元数据groupId/artifactId/version/maven-metadata.xml,与本地元数据合并后得到最新快照版本的值,然后检查本地仓库,或者从远处仓库下载
4、如果最后解析得到的构件版本是时间戳格式的快照,如1.4.1-20091104.121450-121,则复制其时间戳格式的文件至非时间戳格式,如SNAPSHOT,并使用该非时间戳格式的构件。
当依赖的版本不明晰的时候,如RELEASE/LATEST/SNAPSHOT,Maven需要基于更新远程仓库的更新策略来检查更新
仓库搜索服务
使用Maven进行日常开发,常见问题就是如何寻找需要的依赖,我们可能只知道需要使用类库的项目名称,但添加Maven依赖需要提供确切的Maven坐标;我们可以通过使用仓库搜索服务来根据关键字得到Maven坐标。
MVNrepository
Sonatype Nexus
Maven设置
1、全局设置,修改%MAVEN_HOME%/conf/settings.xml
2、用户设置(在Linux多用户情况下),拷贝%MAVEN_HOME%/conf/settings.xml到~.m2\settings.xml,修改此文件,在用户范围内定制Maven的行为。
~/.m2目录
1、在用户目录下可以发现.m2文件夹。默认情况,该文件夹下放置了Maven本地仓库.m2/repository,所有Maven构件被存储在本地此目录下,以方便在多个项目间重用。
2、在Linux多用户环境下,用户需要复制%MAVEN_HOME%/conf/settings.xml到~.m2\settings.xml,这是一条最佳实践。mvn help:system #打印当前Java系统属性和环境变量
设置HTTP代理
编辑settings.xml,添加代理配置如下:
<proxy>
<id>optional</id>
<active>true</active>
<protocol>http</protocol>
<username>proxyuser</username>
<password>proxypass</password>
<host>proxy.host.net</host>
<port>80</port>
<nonProxyHosts>local.net|some.host.com</nonProxyHosts>
</proxy>
Maven生成可执行Jar包(pom.xml配置)
maven有两种生成可执行jar包的插件,能够自动加载依赖包。分别为 maven-assembly-plugin 和appassembler-maven-plugin。
appassembler-maven-plugin 的优势是能够自动生成window和linux的启动脚本
maven-assembly-plugin 生成jar包后需要执行 java -jar **.jar命令运行jar包。
Maven项目骨架
根目录中放置pom.xml
src/main/java目录中,放置项目的主代码
src/main/resources目录中,放置项目的的资源文件,如配置文件.ini/.xml/*.propeties
src/test/java目录中,放置项目的测试代码