mvn -v
或者 mvn -version
验证环境变量。
mvn help:system
打印出所有的系统属性和环境变量。
mvn compile
编译项目源代码(不会编译test 目录的元代)(会产生target 文件)会去中央仓库下载项目所依赖的jar包,最后将jar 包的依赖添加classpath 路径中。
mvn test
运行应用程序中的单元测试。
mvn test-compile
编译测试代码,compile 之后生成的targer 文件夹 主程序编译在classes 文件夹下面,测试程序代码放在test-classes 文件夹下。
mvn clean
删除target 文件夹。
mvn install
安装项目依赖的jar 到本地仓库中。
mvn clean compile test
组合使用
mvn clean install
conf/settings.xml
修改:
<!-- localRepository | The path to the local repository maven will use to store artifacts. | | Default: ${user.home}/.m2/repository <localRepository>/path/to/local/repo</localRepository> -->
推荐不要去修改maven 安装目录下的conf/settings.xml (全局),建议拷贝settings.xml 到对应的本地仓库目录下面(默认: %USERPROFILE%/.m2/settings.xml
),存放路径: groupId+artifactId(com.cashew.maven+maven-demo1) 即comcashewmavenmaven-demo1。
settings.xml详解
我们 mvn compile
的时候maven会去本地仓库查找是否有对应的jar(依赖),如果没有默认会去maven 中央仓库进行下载,
Downloading:https://repo.maven.apache.org/maven2/junit/junit/xxx
maven 的中央远程仓库地址是 lib/maven-model-builder-3.3.9.jar
中pom-4.0.0.xml文件:
<!--仓库列表--> <repositories> <repository> <!--中央仓库的物理标识--> <id>central</id> <!-仓库的名称---> <name>Central Repository</name> <!-- 链接的url --> <url>https://repo.maven.apache.org/maven2</url> <!--默认路径--> <layout>default</layout> <!--禁止下载 snapshot --> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
也可以在项目的pom.xml文件中配置其他中央仓库地址:
<repositories> <repository> <!-- Maven 自带的中央仓库使用的Id为central 如果其他的仓库声明也是用该Id 就会覆盖中央仓库的配置 --> <id>mvnrepository</id> <name>mvnrepository</name> <url>https://mvnrepository.com/</url> <layout>default</layout> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
maven中央仓库服务器是在国外的,自己若要配置国内的仓库镜像,在setttings.xml中设置:
<mirrors> <!-- mirror | Specifies a repository mirror site to use instead of a given repository. The repository that | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used | for inheritance and direct lookup purposes, and must be unique across the set of mirrors. | <mirror> <id>mirrorId</id> <mirrorOf>repositoryId</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://my.repository.com/repo/path</url> </mirror> --> <!--配置国内的阿里云服务器镜像--> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <!-- 代表了一个镜像的替代位置,例如central就表示代替官方的中央库 --> <mirrorOf>central</mirrorOf> </mirror> </mirrors>
设置多个镜像只会识别第一个镜像下载jar包。配置的多个mirror可以都放着不影响,选取一个镜像下载比较快的放在第一个就行。
国内其他镜像文件
官网说明src --main --java --package --resources --test --java --package --resources
pom.xml src/main/java 项目的源代码所在目录 src/main/resources 项目的资源文件所在的目录 src/test/java 测试代码所在的目录 src/test/resources 测试相关的资源文件所在的目录 pom.xml 项目工程的描述文件 classes文件夹在target里
第一种:
mvn archetype:generate
选择817,maven将提供 maven-archetype-quickstart骨架
再输入groupId、artifactId、version、package(与groupId同)
第二种:
mvn archetype:generate -DgroupId=com.cashew.maven -DartifactId=maven-demo -Dversion=1.0.0-SNAPSHOT -Dpackage=com.cashew.maven
第三种:
mvn archetype:crawl
会在本地仓库目录下生成archetype-catalog.xml,移动到.m2目录,配置参数,执行:
mvn archetype:generate -DarchetypeCatalog=local
<?xml version="1.0" encoding="UTF-8"?> <!-- START SNIPPET: superpom --> <project> <!-- 指定当前pom 的版本--> <modelVersion>4.0.0</modelVersion> <!-- 项目包名: 公司地址名称反写+项目名称--> <groupId>com.cashew.maven</groupId> <!--项目模块名称:一般为 项目名-模块名 --> <artifactId>maven-demo1</artifactId> <!-- 标识当前项目版本号 第一个.号之前的数字标识 表示大版本号 第二个.号之前的数字标识 表示分支版本号 第三个.号之前的数字标识 表示小版本号 SNAPSHOT:快照版本 Release 发布版本 Alpha :内部测试版本 GA:正式发布的版本 --> <version>1.0.0SNAPSHOT</version> <dependencies> <!-- 在maven 的世界中 任何一个依赖、插件以及项目构建的输出都可以成为构件 而构件又是通过坐标进行唯一标识的。 官网提供的jar 是不是很多,并且随着版本升级会有不同版本的jar maven 是如何快速的定位获取对于可能给的jar,就是通过坐标的思想来实现的坐标由那些元素构成? 1. groupId 2. artifactId 3. version 4. packaging: zip war jar (默认) 5. classifer --> <!-- maven 是通过dependency 进行依赖的描述 dependcy 是通过坐标元素groupId、artifactId、version 来进行快速定位的,我们同时也知道一个项目会有引用多个依赖(jar),所以又为dependency指定一个dependencies 的容器 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> </dependency> </dependencies> <build> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <executions> <execution> <phase>package</phase> <goals> <!--指定mvn package时执行tomcat插件--> <goal>run</goal> </goals> </execution> </executions> </plugin> </build> </project> <!-- END SNIPPET: superpom -->
maven 提供三种classpath : 编译、测试、运行这三种classpath 都是有效
compile
:对于编在编测试、运行这三种classpath 都是有效
test
: 测试依赖范围有效,在编译和运行项目的时候无法使用此类的依赖(典型的junit);
provided
: 对编译、测试 classpath 有效,对运行时无效(典型的serlvet);
runtime
: 运行时的依赖范围,对测试和运行有效,在编译源代码无效(典型案例:JDBC的驱动实现);
system
: 系统的依赖范围,使用system范围的依赖的时候必须通过systemPath 元素显示指定依赖文件的路径,不依赖于maven仓库解析,所以可能会造成构建不可移植,慎用!
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency>
employee 依赖manager, manager依赖boss
employee 通过传递 间接也依赖于boss
<dependency> <groupId>com.cashew.maven</groupId> <artifactId>company-manager</artifactId> <version>0.0.1-SNAPSHOT</version> <exclusions> <exclusion> <groupId>com.cashew.maven</groupId> <artifactId>company-boss</artifactId> </exclusion> </exclusions> </dependency>
employee --->manager(commons-io 2.0)--->boss(commons-io 2.4)
1.短路优先
A--->B--->C---D(2.0.jar)
A--->B--->C(1.0.jar)
A只会有2.0的包
2.相同路径的时候 先声明先使用
employee--->manager
employee--->boss
manager先声明,则A只会有2.0的包
maven 是以模块的概念进行项目描述的。
现有A、B、C多个模块的过程,需要聚合到一起,可以新建一个聚合工程,在该工程的pom.xml中配置:
<packaging>pom</packaging>
并添加模块依赖列表
<modules> <module>../A</module> <module>../B</module> <module>../C</module> </modules>
可以将多个模块工程的一些共性依赖进行向上的抽取,并组成maven父工程。
如:employee 、manager、boss都有junit 依赖,那么可以单独的去定义一个maven项目封装这些共性的依赖,称为父类 maven项目。在该工程的pom.xml中配置:
<packaging>pom</packaging>
使用dependencyManagement 元素来提供一种管理依赖版本号的方式,通过在一个组织或者项目的最高层的父POM 中会去使用它,
使用pom.xml 中的 使用dependencyManagement元素能让所在在子项目中引用一个依赖而不用显示的列出版本号,maven 会沿着父子层次向上走,直到找到使用dependencyManagement的元素的项目 然后它就会使用dependencyManagement 元素的指定的版本号:
<dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement>
父工程不需要运行,删除src/test/java
子模块工程要继承父工程,添加:
<parent> <groupId>com.ibeifeng.maven</groupId> <artifactId>company-parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent>
修改对应的依赖:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependencies>
好处:如果有多个子项目都引用都一个依赖,则可避免在每个使用的子项目中都声明一个版本号,当升级或者切换版本的时候,只需要在顶层父容器里更新即可。