创建工程
- mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
archetype是一个插件plugin,其作用是原型,也就是模板,generate->goal相当于gradle里的task,后面是一串参数,插件提供了很多goal去完成一个目标
文件结构是这样的
和Gradle比较呢?
源代码目录是一样的,src->main/test->java->自己的包名->.java文件
可是在根目录下,maven要简洁得多,就一个pom.xml:
gradle有本身的两个配置文件加上wrapper文件夹、.gradle文件夹,总的来说要比maven繁琐很多(即使如此在版本控制和依赖上也比手工管理工程要好很多)
理所当然的,pom.xml可没那么好配置,相比gradle
下面build工程
- mvn package
package不是一个goal,他是一个phase----阶段-----构筑生命周期的一步,一个阶段可能包含很多子阶段,maven会执行所有包含的子阶段,最终---这些子阶段还是执行一些goal来实现目的。
生命周期:
- validate: validate the project is correct and all necessary information is available 验证
- compile: compile the source code of the project 编译
- test: test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed 测试
- package: take the compiled code and package it in its distributable format, such as a JAR. 打包
- integration-test: process and deploy the package if necessary into an environment where integration tests can be run 集成测试
- verify: run any checks to verify the package is valid and meets quality criteria 再验证
- install: install the package into the local repository, for use as a dependency in other projects locally 安装包,使其作为其他项目的依赖
- deploy: done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects. 部署发行
额外的周期:
- clean: cleans up artifacts created by prior builds 清理上一次build的结果
- site: generates site documentation for this project 生成site文档
执行:
-cp是声明依赖路径
phrase和goal是可以队列的形式执行下去的
- mvn clean dependency:copy-dependencies package
site能生成项目过程中的详细信息,类似scan
一个团队Maven项目除了可以自动化地保持各种依赖版本一致,当然也可以给团队中的个人提供个性化配置,比如本地依赖仓库的位置、代理、镜像
个人设置的路径:
${user.home}/.m2/settings.xml
该文件不是必须的,所以要自己创建。
改变本地依赖仓库路径
<settings> ... <localRepository>/path/to/local/repo/</localRepository> ... </settings>
这里的仓库指的是maven去检查是否本地已经存在正确版本依赖的路径,换句话说,就是缓存区。
添加代理
- <settings>
- .
- .
- <proxies>
- <proxy>
- <id>example-proxy</id>
- <active>true</active>
- <protocol>http</protocol>
- <host>proxy.example.com</host>
- <port>8080</port>
- <username>proxyuser</username>
- <password>somepassword</password>
- <nonProxyHosts>www.google.com|*.example.com</nonProxyHosts>
- </proxy>
- </proxies>
- .
- .
- </settings>
之前说过,命令行下的下载即使全局代理也没用,必须在环境变量处添加代理,这显然不够灵活,而个人配置给了我们一个解决方案。
如果在公司没有代理供你使用咋办呢?----可以更改镜像
- <settings>
- ...
- <mirrors>
- <mirror>
- <id>UK</id>
- <name>UK Central</name>
- <url>http://uk.maven.org/maven2</url>
- <mirrorOf>central</mirrorOf>
- </mirror>
- </mirrors>
- ...
- </settings>
这里的mirrorOf就是镜像仓库的简称
如果想要设置所有需要的仓库镜像:
- <settings>
- ...
- <mirrors>
- <mirror>
- <id>internal-repository</id>
- <name>Maven Repository Manager running on repo.mycompany.com</name>
- <url>http://repo.mycompany.com/proxy</url>
- <mirrorOf>*</mirrorOf>
- </mirror>
- </mirrors>
- ...
- </settings>
这里的*就是说,所有的依赖、插件所需要的仓库,都来这个mirror下载
原型Archetypes
提供的项目模板:
这里我们只关注quickstart和webapp两个
quickstart:
webApp:
用法都是一样的
POM
一个个标签来讲
<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>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>Maven Quick Start Archetype</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
project:最顶层的标签
modelVersion:基本上不会更新
gourpId:基本上就是公司域名,是和其他公司区分的标志,而且工程也会自动根据这个Id创建源码路径