Java包管理工具-maven

没有使用maven的时候,我们在项目开始就要下载各种jar包,Spring、mybatis等等。
maven主要解决这几个问题:

  • 生成源码(如果项目使用自动生成源码);
  • 从源码生成项目文档;
  • 编译源码;
  • 将编译后的代码打包成JAR文件或者ZIP文件;
  • 将打包好的代码安装到服务器、仓库或者其它的地方;

maven的中心思想是POM文件(项目对象模型)。POM文件是以XML文件的形式表述项目的资源,如源码、测试代码、依赖(用到的外部Jar包)等。POM文件应该位于项目的根目录下。
通过pom.xml对jar包进行集中管理。Maven工程不用手动导jar包,通过在pom.xml中定义坐标从maven仓库自动下载,方便且不易出错。
当执行maven命令的时候,会传入一个pom文件,maven会在pom文件的描述上进行依赖下载,执行生命周期,最后执行插件的构建任务,构建插件可以向构建阶段中增加额外的构建目标。
POM文件描述的是构建“什么”,而不是“如何”构建。
一个项目如果分为多个子项目,一般来讲,父项目有一个POM文件,每一个子项目都有一个POM文件。在这种结构下,既可以一步构建整个项目,也可以各个子项目分开构建。

POM

一个最小化的POM文件示例:

    <project xmlns=”http://maven.apache.org/POM/4.0.0xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instancexsi: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>com.sysuzhyupeng</groupId>
    <artifactId>java-web-project</artifactId>
    <version>1.0.0</version>
    </project>

modelVersion属性表示使用的POM模型的版本。选择和你正在使用的Maven版本一致的版本即可。版本4.0.0适用于Maven 2和3。
*groupId”属性是一个组织或者项目(比如开源项目)的唯一ID。大多数情况下,你会使用项目的java包的根名称作为group ID。
artifactId属性包含你正在构建的项目的名称。
上文中的groupId,artifactId和version属性,在项目构建后会生成一个jar文件,位于Maven仓库的如下路径中(目录和文件名):MAVEN_REPO/com/sysuzhyupeng/java-web-crawler/1.0.0/java-web-project-1.0.0.jar

父pom

所有的Maven pom文件都继承自一个父pom。如果没有指定父pom,则该pom文件继承自根pom。
可以让一个pom文件显式地继承另一个pom文件。这样,可以通过修改公共父pom文件的设置来修改所有子pom文件的设置。在pom文件的起始处指定父pom

    <parent>
        <groupId>com.taobao</groupId>
        <artifactId>parent</artifactId>
        <version>2.0.0</version>
    </parent>

子pom文件的设置可以覆盖父pom文件的设置,只需要在子pom文件里指定新的设置即可。

Maven使用

运行Maven只需在命令行执行mvn命令即可。当执行mvn命令时,将构建周期、阶段或目标作为参数传进去,Maven就会执行它们。例如:

    mvn install

你可以向mvn命令传入多个参数,执行多个构建周期或阶段,如:

mvn clean install

该命令首先执行clean构建周期,删除Maven输出目录中已编译的类文件,然后执行install构建阶段。

maven仓库

Maven的本地仓库默认在你本机的用户目录下。
Maven的中央仓库由Maven社区提供。默认情况下,所有不在本地仓库中的依赖都会去这个中央仓库查找。然后Maven会将这些依赖下载到你的本地仓库。访问中央仓库不需要做额外的配置。
远程仓库是位于web服务器上的一个仓库,Maven可以从该仓库下载依赖,就像从中央仓库下载依赖一样。远程仓库可以位于Internet上的任何地方,也可以是位于本地网络中。远程仓库中的依赖也会被Maven下载到本地仓库中。
可以在pom文件里配置远程仓库。将以下的xml片段放到属性之后:

    <repositories>
       <repository>
           <id>jenkov.code</id>
           <url>http://maven.sysuzhyupeng.com/maven2/lib</url>
       </repository>
    </repositories>

依赖管理

在dependencies属性下有两个dependency子属性,每一个dependency属性描述了一个外部依赖。

    <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.8.1</version>
                <scope>test</scope>
            </dependency>
    </dependencies>

每一个依赖由groupId, artifactId和version来描述。这里的示例为junit组织下的4.8.1版本的junit。上面示例中的两个依赖将会被放到以下子目录中MAVEN_REPOSITORY_ROOT/junit/junit/4.8.1。
有的时候,指定的依赖在Maven的中央仓库里没有。你可以直接下载这些依赖,然后放到Maven的本地仓库。这些依赖必须放到与groupId、 artifactId和version匹配的子目录中。用/替换所有的点(.)并且使用/分隔groupId、artifactId和version,这 就是与该依赖匹配的子目录。

外部依赖

Maven的外部依赖指的是不在Maven的仓库(包括本地仓库、中央仓库和远程仓库)中的依赖(jar包)。
配置外部依赖的示例如下:

    <dependency>
      <groupId>mydependency</groupId>
      <artifactId>mydependency</artifactId>
      <scope>system</scope>
      <version>1.0</version>
      <systemPath>${basedir}\war\WEB-INF\lib\mydependency.jar</systemPath>
    </dependency> 

groupId和artifactId为依赖的名称,即API的名称。scope属性为system。systemPath属性为jar文件的路径。${basedir}为pom文件所在的目录,路径中的其它部分是相对于该目录而言的。

快照依赖

快照依赖指的是那些还在开发中的依赖(jar包)。与其经常地更新版本号来获取最新版本,不如你直接依赖项目的快照版本。
在pom文件的最开头(设置groupId和artifactId的地方),在版本号后追加-SNAPSHOT,则告诉Maven你的项目是一个快照版本。如:

    <dependency>
        <groupId>com.sysuzhyupeng</groupId>
        <artifactId>java-web-project</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

构建生命周期

Maven有三个内嵌的构建生命周期:

  • default
  • clean
  • site

每一个构建生命期关注项目构建的不同方面。因此,它们是独立地执行的。Maven可以执行多个生命期,但是它们是串行执行的,相互独立,就像你执行了多条独立的Maven命令。

default生命期关注的是项目的编译和打包。clean生命期关注的是从输出目录中删掉临时文件,包括自动生成的源文件、编译后的类文件,之前版本的jar文件等。site生命期关注的是为项目生成文档。实际上,site可以使用文档为项目生成一个完整的网站。
default生命期中有这几个值得关注:

  • validate 验证项目的正确性,以及所有必需的信息都是否都存在。同时也会确认项目的依赖是否都下载完毕。
  • compile 编译项目的源代码
  • test 选择合适的单元测试框架,对编译后的源码执行测试;这些测试不需要代码被打包或者部署。
  • package 将编译后的代码以可分配的形式打包,如Jar包。
  • install 将项目打包后安装到本地仓库,可以作为其它项目的本地依赖
  • deploy 将最终的包复制到远程仓库,与其它开发者和项目共享。

猜你喜欢

转载自blog.csdn.net/sysuzhyupeng/article/details/80991932