定义
maven是基于项目对象模型(POM-project object model),可以通过一段描述来管理项目构建的软件项目管理工具。
也就是说:maven可以帮我们优雅的引(抄)用前人实现过的jar包,以及构建自己项目的结构。
说到引用,不得不提maven中两个非常重要的概念:仓库,坐标。
举个例子,如果说他人的jar包是一个包裹,我们要用它,就得知道包裹在什么仓库的什么位置,知道之后把它拿过来拷贝一份放在自己的仓库里,岂不美哉。
这里的仓库就分为远程仓库和本地仓库,远程仓库就是人家包裹的老巢(比如maven全球中央仓库:https://search.maven.org/,id:central),本地仓库就是自己的窝,坐标位置就是仓库的货架号,用于定位到实际的包裹。
好了,既然我们拿到包裹了,该怎么用呢?
先看如下一个maven配置文件示例:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 指定了当前pom的版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 坐标 -->
<!-- 通常为反写的公司网址+项目名 -->
<groupId>test.maven</groupId>
<!-- 项目名+模块名 -->
<artifactId>helloworld</artifactId>
<!-- 版本号,大版本号+分支版本号+小版本号 -->
<version>1.0.0-SNAPSHOT</version>
<!-- 默认是jar,还有war/zip/pom -->
<package></package>
<!-- 继承父项目 -->
<parent>
<groupId>test.maven</groupId>
<artifactId>helloworld.parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<!-- 聚合子项目 -->
<modules>
<module>module1</module>
</modules>
<!-- 属性 -->
<properties>
<app.version>1.0.0-SNAPSHOT</app.version>
</properties>
<!-- 依赖列表 -->
<dependencies>
<dependency>
<groupId>test.maven</groupId>
<artifactId>helloworld.dependency</artifactId>
<version>1.0.0-SNAPSHOT</version>
<!-- 依赖范围,可引入3种classpath:编译,测试,运行。默认为compile,编译测试运行都生效 -->
<scope>test</scope>
</dependency>
</dependencies>
<!-- 并不在项目中运行,只做依赖的管理,便于子模块引用 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>test.maven</groupId>
<artifactId>helloworld.dependency</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<pluginManagement>
<!-- 项目全局的Maven插件管理 -->
<plugins>
<plugin>
<artifactId>maven-source-plugin</artifactId>
<version>2.4</version>
<configuration>
<attach>true</attach>
</configuration>
<executions>
<execution>
<!-- 执行阶段 -->
<phase>compile</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<!-- 插件列表 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M1</version>
</plugin>
</plugins>
</build>
<!-- 定义远程snapshots库和releases库的nexus地址 -->
<distributionManagement>
<repository>
<id>releases</id>
<url>http://</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>http://</url>
</snapshotRepository>
</distributionManagement>
</project>
mvn install 会将项目生成的构件安装到本地Maven仓库
mvn deploy 用来将项目生成的构件分发到远程Maven仓库
本地Maven仓库的构件只能供当前用户使用,在分发到远程Maven仓库之后,所有能访问该仓库的用户都能使用你的构件。因此我们需要配置POM的<distributionManagement>来指定Maven远程分发构件的位置。
setting.xml
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<!-- 本地仓库地址,可配 -->
<localRepository>/Users/liliang/.m2/repository</localRepository>
<!-- 远程仓库,distributionManagement的鉴权信息 -->
<servers>
<server>
<id>snapshots</id>
<username>admin</username>
<password>12345</password>
</server>
<server>
<id>releases</id>
<username>admin</username>
<password>12345</password>
</server>
</servers>
<!-- 镜像服务器 -->
<mirrors>
<mirror>
<id>ele-pub</id>
<!-- 指定具体为哪个服务器提供镜像服务,可用*通配符表示所有 -->
<mirrorOf>*</mirrorOf>
<name></name>
<url>http://</url>
</mirror>
</mirrors>
</settings>
配置文件配好后,我们就可以使用maven的命令操作了
maven的命令有一个生命周期,是作者根据软件工程经验构思出来的,分为三个阶段:
- clean
清理项目,将本地target目录下之前编译好的文件全部清空
- default
核心阶段,包括complie,test,package,intall
- site
生成项目站点,部署到服务器上,包括deploy
通过这3个阶段的maven命令后,就能够构建部署好一个项目了。