常用命令
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。
远程镜像仓库配置
我们 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可以都放着不影响,选取一个镜像下载比较快的放在第一个就行。
maven常见项目结构
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里
maven命令创建一个项目
第一种:
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
pom.xml文件
<?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>
好处:如果有多个子项目都引用都一个依赖,则可避免在每个使用的子项目中都声明一个版本号,当升级或者切换版本的时候,只需要在顶层父容器里更新即可。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Black Box Society
Frank Pasquale / Harvard University Press / 2015-1-5 / USD 35.00
Every day, corporations are connecting the dots about our personal behavior—silently scrutinizing clues left behind by our work habits and Internet use. The data compiled and portraits created are inc......一起来看看 《The Black Box Society》 这本书的介绍吧!
Base64 编码/解码
Base64 编码/解码
HSV CMYK 转换工具
HSV CMYK互换工具