• Java

Maven安装配置使用

Maven介绍

Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后Maven可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。 Maven 有一个生命周期,当你运行 mvn install 的时候被调用。这条命令告诉 Maven 执行一系列的有序的步骤,直到到达你指定的生命周期。遍历生命周期旅途中的一个影响就是,Maven 运行了许多默认的插件目标,这些目标完成了像编译和创建一个 JAR 文件这样的工作。此外,Maven能够很方便的帮你管理项目报告,生成站点,管理JAR文件。

安装

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 Settings\username.m2\repository ,在 Windows 7 上,在 C:\Users\username.m2\repository。当 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
README.txt

工程根目录下就只有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>

最新