Maven
1. Maven仓库
- Maven有三种类型仓库
- 本地
- 默认被创建在%USER_HOME%目录下
- 要修改默认位置,在 %M2_HOME%\conf 目录中的 Maven 的 settings.xml 文件中定义另一个路径。
- 中央
- 远程
- 如果 Maven 在中央仓库中也找不到依赖的库文件,它会停止构建过程并输出错误信息到控制台。为避免这种情况,Maven 提供了远程仓库的概念,它是开发人员自己定制仓库,包含了所需要的代码库或者其他工程中用到的 jar 文件。
- 通过在POM.xml中指定repositories->repository->id, url
- 搜索顺序
2. Maven插件
- 插件就是目标(goal)的集合
- 通过以下语法来执行:
mvn [plugin-name]:[goal-name]
。例如build生命周期里的compile阶段默认是提供了maven-compiler-plugin插件的compile目标的。所以可以通过mvn compile
来执行,也可以通过mvn maven-compiler-plugin:compile
来执行
- 常用的一些插件如下:
插件 |
描述 |
clean |
构建之后清理目标文件。删除目标目录。 |
compiler |
编译 Java 源文件。 |
surefire |
运行 JUnit 单元测试。创建测试报告。 |
jar |
从当前工程中构建 JAR 文件。 |
war |
从当前工程中构建 WAR 文件。 |
javadoc |
为工程生成 Javadoc。 |
antrun |
从构建过程的任意一个阶段中运行一个 ant 任务的集合。 |
3. Maven插件 - 原型(archetype)插件 - 创建工程
- Maven 使用原型(archetype)插件创建工程。要创建一个简单的 Java 应用,我们将使用 maven-archetype-quickstart 插件。
- 输入命令:
mvn archetype:generate
,然后根据提示输入groupId, artifactId, archetypeArtifactId(maven 3x版本大概提供了10种archetype,默认是archetype-quickstart),version
4. 构建和测试工程
- 基于以上创建的工程进行构建与测试:
mvn clean package
- package阶段中应该集成了jar插件的jar目标
- test阶段中应该集成了surefire插件的test目标
- compile阶段应该集成了compiler插件的compile目标
5. 外部依赖(第三方包)
- 当在远程仓库和中央仓库都没有需要的依赖时,可以添加外部依赖,即自己添加jar包。
- 需要在工程目录里将jar包引入,如在src目录下新建lib目录,将要引用的jar包复制到其中
- 需要在pom.xml中进行dependency的说明,否则编辑阶段会失败,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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.companyname.bank</groupId>
<artifactId>consumerBanking</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>consumerBanking</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>ldapjdk</groupId>
<artifactId>ldapjdk</artifactId>
<scope>system</scope>
<version>1.0</version>
<systemPath>${basedir}\src\lib\ldapjdk.jar</systemPath>
</dependency>
</dependencies>
</project>
- 说明:
- 指定 groupId 为 library 的名称
- 指定 artifactId 为 library 的名称
- 指定作用域(scope)为系统
- 指定相对于工程位置的系统路径(systemPath)
- 小技巧: 在IDEA中可以通过输入${dir}来智能提示都有哪些可用的dir可用。
6. 工程文档
- 在工程目录下执行
mvn site
进行工程文档的构建
- 会在target目录下生成site目录,里面就是工程文档了
7. 快照(内部模块包)
- 大型软件应用程序通常由多个模块组成,各个模块之间可能存在依赖,例如前端应用工程(app-ui.jar:1.0)会依赖于数据服务工程(app-service.jar:1.0)
- 这种各模块合作的场景下,前端应用工程要依赖于数据服务工程,则在前端应用工程的pom里需要定义dependency,同时需要定义远程仓库
- 如果数据服务工程一直快速迭代,针对一个版本每天都有很多次修改并release到远程仓库中,此时如果前端应用工程通过版本号对数据服务工程进行依赖,则只会下载一次指定版本,不会尝试从仓库再次下载同版本(1.0)
- 此时需要通过快照来进行依赖,这样Maven会自动获取同版本最新的快照(1.0-SNAPSHOT)
- 快照的声明就是把pom的版本version声明为
<version>1.0-SNAPSHOT</version>
- 虽然,对于快照,Maven 每次自动获取最新的快照,但你可以在任何 maven 命令中使用 -U 参数强制 maven 下载最新的快照:
mvn clean package -U
8. 构建自动化(被依赖项发生变化时,自动构建依赖方)
- 可以通过在被依赖项的pom里添加编译目标maven-invoker-plugin:run来提醒相应的依赖方
<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>bus-core-api</groupId>
<artifactId>bus-core-api</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<build>
<plugins>
<plugin>
<artifactId>maven-invoker-plugin</artifactId>
<version>1.6</version>
<configuration>
<debug>true</debug>
<pomIncludes>
<pomInclude>app-web-ui/pom.xml</pomInclude>
<pomInclude>app-desktop-ui/pom.xml</pomInclude>
</pomIncludes>
</configuration>
<executions>
<execution>
<id>build</id>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<build>
</project>
- 引时构建被依赖项时会自动构建两个依赖方
- 另外也可以借助CI集成框架Jenkins来进行这种依赖关系的自动化构建
9. 管理依赖
- 如果涉及到A依赖B、B依赖C的场景,我们只需要在每个工程的pom文件里去定义直接的依赖关系即可,即在A的pom里只定义依赖B
- 通常情况下,在一个共通的工程下,有一系列的工程。在这种情况下,我们可以创建一个公共依赖的 pom 文件,该 pom 包含所有的公共的依赖关系,我们称其为其他子工程 pom 的 父pom。父pom中定义的 包类型是pom:
<packaging>pom</packaging>
- 引用父pom的子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">
<parent>
<artifactId>Root</artifactId>
<groupId>com.companyname.groupname</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.companyname.groupname</groupId>
<artifactId>App-Core-lib</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
</project>
10. Maven - Web应用
- 通过amaven-archetype-webapp插件进行工程创建
- 编译,
mvn clean package
,生成war包
- 通过在pom里设置finalName来指定war包名,定义在build里
- 部署web应用