Why Maven
只要还在做Java开发,Maven是绕不过去的一道坎。
尽管官方一再强调它作为一整套项目管理解决方案的定位,但大而全的目标加上复杂的设计,往往让初见Maven的人皱眉,最后也不过是使用其中的一两项功能。
一个东西的设计是否简洁优雅,其实并不由设计者说了算,而在于用户使用它的方式。当Maven没有对它的设计和功能做简化的时候,用户的使用方式投了票。
在我看来,人们离不开Maven,其实是离不开它这两个功能[1] 包管理。[2] 项目打包。
本文的内容分为5部分
- 厘清Maven 与 IDE (Eclipse / Intellij) 的关系
- 介绍一些背景知识,主要是关于Maven项目的创建和配置文件pom.xml
- Maven的包管理功能
- Maven的项目打包功能
- 附录是关于Maven的安装和配置,便于每次安装后快速配置
我希望通过本文,能
- 厘清Maven的基本概念
- 掌握Maven最常用的包管理和打包功能
- 在安装Maven时能快速的配置好环境
Maven 与 IDE (Eclipse / Intellij) 的关系
Maven是个独立的工具,安装之后可以在命令行界面使用。
IDE 需要安装Maven插件,关联上已经安装的Maven之后,才能在IDE中调用Maven的功能。其中Eclipse的Maven插件为m2eclipse。Intellij则默认自带了Maven插件,直接做相应的关联配置即可。
后面的例子都会以命令行环境下的Maven命令作说明,重点在于说明Maven工具的功能。具体的IDE插件,只不过是图形化封装调用了Maven命令而已。
必要的背景知识
使用Maven首先需创建Maven工程。创建只需一条命令
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
- archetype:generate是Maven众多插件中的一个,这个插件用于创建工程。
- maven-archetype-quickstart则是说按照这个模版来创建工程。Maven有许多默认的和第三方编写的模版。
- artifactId参数指明了工程所在目录的名字。
- groupId参数则指定工程所属的java包。。
比如上述命令执行成功之后,就会在当前目录生成一个my-app目录,其目录结构如Figure 1所示。这个目录结构也是Maven提倡的所谓良好的工程组织结构,源码和测试代码分别在src和test目录下。
Figure 1. Maven工程目录结构
目录下的pom.xml文件是整个工程的配置文件,用Maven做包管理和打包配置都需要修改这个文件。
Maven包管理
当你的工程需要依赖于某个第三方的包时,只需要在pom.xml文件中加入依赖包的配置即可。一般第三方包都会在主页上给出其依赖配置,比如junit的配置如下:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
将其粘贴到pom.xml中的<dependencies>
即完成了包依赖。然后在编译运行你的项目时Maven会根据配置自动的帮你下载依赖包。同时你也不必关注依赖包是否还依赖了其他的包,Maven会帮你管理好二级依赖。
增加了junit依赖的pom.xml示例如下:
<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.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>my-app</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Maven打包功能
Maven项目的打包很方便。只需要在项目根目录执行一条命令mvn package
即可。
命令背后的原理是,maven将软件生命周期抽象为许多顺序的Phase,其中最常见的阶段顺序罗列如下:(更全的Phase列表见Maven官方文档)
-
mvn compile
: 编译项目 -
mvn test
:运行测试用例 -
mvn package
:将编译后的代码打包 -
mvn install
:将打好的包加入到本地仓库 -
mvn deploy
: 将本地包部署到maven远程仓库供更多人使用。
当运行mvn package时,Maven会将package阶段前包括package在内的Phase顺序执行一次。打好的包默认情况下放在target目录之下。
使用java命令即可运行
java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App
参数cp用于指定main函数所在的类路径,在本例中是main函数所在类为com.mycompany.app.App。
需要注意,默认情况下mvn package
打包时并不会包含依赖的第三方包。假设需要将整个项目连同它的依赖打成一个包,从而可以方便的在任何Java环境下运行,可以使用Shade插件。
具体的使用方法将如下配置加入pom.xml,再次执行mvn package
即在target目录下得到包含了所有依赖的包。
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<configuration>
<!-- put your configurations here -->
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
</project>
附录:Maven的安装和配置
Maven只是一个工具包,下载之后将解压后的目录放到你喜欢的地方,然后做如下操作便可以运行 (Unix系统适用,Windows用户见官网文档):
- 确保安装了JDK并设置了环境变量JAVA_HOME,比如
export JAVA_HOME=/usr/java/jdk1.7.0_51
Mac OS X则用户则可以这样
export JAVA_HOME=$(/usr/libexec/java_home
- 确保JAVA_HOME/bin目录在你的PATH环境变量中
export PATH=$JAVA_HOME/bin:$PATH
- 设置Maven相关环境变量 (假设Maven解压在/usr/local/apache-maven/apache-maven-3.2.3)
export M2_HOME=/usr/local/apache-maven/apache-maven-3.2.3
export M2=$M2_HOME/bin
export PATH=$M2:$PATH
- 运行mvn -version成功即表示安装OK。
网友评论