• 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 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>

    ---

  • 相关阅读:
    将训练好的Tensorflow模型部署到web应用中
    python pip升级
    python time
    python 队列模拟递归遍历目录(广度遍历)
    python 栈模拟递归遍历目录(深度遍历)
    python 递归遍历目录
    python 队列
    python 栈
    python 递归
    python 语音模块
  • 原文地址:https://www.cnblogs.com/luangeng/p/6106223.html
Copyright © 2020-2023  润新知