Maven介绍
安装
1.下载: http://maven.apache.org/download.cgi
2.安装:
zip: $unzip apache-maven-3.3.9-bin.zip
tar: $tar xzvf apache-maven-3.3.9-bin.tar.gz
3.添加PATH:
在 /etc/paths 中加入: maven中的bin/
或执行 $export PATH=~/dev/tools/apache-maven-3.3.9/bin:$PATH
4.验证: $mvn -v
IntelliJ IDEA集成
安装maven插件 详细 https://www.jetbrains.com/help/idea/2016.2/maven.html
基本概念
maven项目的默认目录结构:
目录 |
目的 |
${basedir} |
存放 pom.xml和所有的子目录 |
${basedir}/src/main/java |
项目的 java源代码 |
${basedir}/src/main/resources |
项目的资源,比如说 property文件 |
${basedir}/src/test/java |
项目的测试类,比如说 JUnit代码 |
${basedir}/src/test/resources |
测试使用的资源 |
-----------
POM (Project Object Model)
一个项目所有的配置都放置在 POM 文件中,包括项目的类型、名字,管理依赖关系,定制插件的行为等等。
在POM中,groupId + artifactId + packaging + version 才称为项目标识,能唯一确定一个项目, 可用来指定项目所依赖的其他项目,插件,或者父项目。
格式一般如下: groupId:artifactId:packaging:version 比如: com.mycompanyname.helloworld: helloworld: jar: 1.0-SNAPSHOT
大项目一般会分成几个子项目。在这种情况下,每个子项目就会有自己的 POM 文件,然后它们会有一个共同的父项目。这样只要构建父项目就能够构建所有的子项目了。子项目的 POM 会继承父项目的 POM。另外,所有的 POM都继承了一个 Super-POM。Super-POM 设置了一些默认值,比如默认的目录结构,默认的插件等.
Maven 插件
maven整合了各种插件, 如Jar,Compiler,Surefire等。Jar 用来建立Jar文件, Compiler 插件用来编译源代码和单元测试代码。Surefire 插件运行单元测试。
编译后 的 classes 会放在 ${basedir}/target/classes 下面, JAR 文件会放在 ${basedir}/target 下面, test类 class 文件放在 target/test-classes/ 目录下面
maven 项目在默认情况下会产生 JAR 文件
Maven 生命周期
生命周期指项目的构建过程,它包含了一系列的有序的阶段 (phase),而一个阶段就是构建过程中的一个步骤。mvn package 是一个maven的生命周期阶段 (lifecycle phase)。
插件目标可以绑定到生命周期阶段上。一个生命周期阶段可以绑定多个插件目标。当 maven 在构建过程中逐步的通过每个阶段时,会执行该阶段所有的插件目标。
maven 能支持不同的生命周期,但是最常用的是默认的Maven生命周期。如果你没有对它进行任何的插件配置或者定制的话,那么命令 mvn package 会依次执行默认生命周期中直到包括 package 阶段前的所有阶段的插件目标:
process-resources 阶段:resources:resources
compile 阶段:compiler:compile
process-classes 阶段:(默认无目标)
process-test-resources 阶段:resources:testResources
test-compile 阶段:compiler:testCompile
test 阶段:surefire:test
prepare-package 阶段:(默认无目标)
package 阶段:jar:jar
Maven 依赖管理
在 POM 中,依赖关系是在 dependencies 部分中定义的。比如:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies>
因为被依赖的 jar 文件会有自己的依赖关系。那么我们是不是需要把那些间接依赖的 jar 文件也都定义在POM中呢?答案是不需要,因为 maven 提供了传递依赖的特性.
所谓传递依赖是指 maven 会检查被依赖的 jar 文件,把它的依赖关系纳入最终解决的依赖关系链中。针对上面的 junit 依赖关系,如果你看一下 maven 的本地库: ~/.m2/repository/junit/junit/3.8.1/ ,
发现 maven 不但下载了 junit-3.8.1.jar,还下载了它的 POM 文件。这样 maven 就能检查 junit 的依赖关系,把它所需要的依赖也包括进来。
在 POM 的 dependencies 部分中,scope 决定了依赖关系的适用范围。我们的例子中 junit 的 scope 是 test,那么它只会在执行 compiler:testCompile and surefire:test 目标的时候才会被加到 classpath 中,在执行 compiler:compile 目标时是拿不到 junit 的。
我们还可以指定 scope 为 provided,意思是 JDK 或者容器会提供所需的jar文件。比如说在做web应用开发的时候,我们在编译的时候需要 servlet API jar 文件,但是在打包的时候不需要把这个 jar 文件打在 WAR 中,因为servlet容器或者应用服务器会提供的。
scope 的默认值是 compile,即任何时候都会被包含在 classpath 中,在打包的时候也会被包括进去。
Maven 库
当第一次运行 maven 命令的时候,会从 maven 默认的远程库(http://repo1.maven.org/maven2) 下载 maven 的核心插件和可供下载的 jar 文件。
但是不是所有的 jar 文件都是可以从默认的远程库下载的,比如说我们自己开发的项目。这个时候,有两个选择:要么在公司内部设置定制库,要么手动下载和安装所需的jar文件到本地库。
本地库是指 maven 下载了插件或者 jar 文件后存放在本地机器上的拷贝。在 Linux 上,它的位置在 ~/.m2/repository,在 Windows XP 上,在 C:Documents and Settingsusername.m2 epository ,在 Windows 7 上,在 C:Usersusername.m2 epository。当 maven 查找需要的 jar 文件时,它会先在本地库中寻找,只有在找不到的情况下,才会去远程库中找。
运行下面的命令能把项目安装到本地库: $mvn install
一旦一个项目被安装到了本地库后,其他的项目就可以通过 maven 坐标和这个项目建立依赖关系。
比如如果我现在有一个新项目需要用到 helloworld,那么在运行了上面的 mvn install 命令后,我就可以如下所示来建立依赖关系:
<dependency> <groupId>com.mycompany.helloworld</groupId> <artifactId>helloworld</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
依赖Jar查找: http://search.maven.org/
标准目录结构:
src
-main
–bin 脚本库
–java java源代码文件
–resources 资源库,会自动复制到classes目录里
–filters 资源过滤文件
–assembly 组件的描述配置(如何打包)
–config 配置文件
–webapp web应用的目录。WEB-INF、css、js等
-test
–java 单元测试java源代码文件
–resources 测试需要用的资源库
–filters 测试资源过滤库
-site Site(一些文档)
target
LICENSE.txt Project’s license
README.txt Project’s readme
工程根目录下就只有src和target两个目录
target是有存放项目构建后的文件和目录,jar包、war包、编译的class文件等。
target里的所有内容都是maven构建的时候生成的
使用maven构建项目
1.新建项目:
~$mvn archetype:generate -DgroupId=com.mycompany.helloworld -DartifactId=helloworld -Dpackage=com.mycompany.helloworld -Dversion=1.0-SNAPSHOT
archetype:generate 目标会列出一系列的 archetype 让你选择。 Archetype 可以理解成项目的模型。 Maven 为我们提供了很多种的项目模型,包括从简单的 Swing 到复杂的 Web 应用。我们选择默认的 maven-archetype-quickstart
maven 的 archetype 插件建立了一个 helloworld 目录,这个名字来自 artifactId 。这个目录下面的 pom.xml 用于描述项目,配置插件和管理依赖关系。
源代码和资源文件放在 src/main 下面,而测试代码和资源放在 src/test 下面。
2.构建
~$cd helloworld && mvn package
3.运行
~$java -cp target/helloworld-1.0-SNAPSHOT.jar com.mycompany.helloworld.App
参考文档:
http://maven.apache.org/configure.html
http://www.oracle.com/technetwork/cn/community/java/apache-maven-getting-started-1-406235-zhs.html
附:
<!-- 阿里云仓库 --> <mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/repositories/central/</url> </mirror> <!-- 中央仓库1 --> <mirror> <id>repo1</id> <mirrorOf>central</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://repo1.maven.org/maven2/</url> </mirror> <!-- 中央仓库2 --> <mirror> <id>repo2</id> <mirrorOf>central</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://repo2.maven.org/maven2/</url> </mirror>
---