zoukankan      html  css  js  c++  java
  • Maven简易笔记

    Maven笔记

    Maven用来管理Java项目,主要负责构建项目:验证、编译、测试、打包、分发等。

    Maven组成

    • 配置依赖关系、约定目录结构以及构建项目的整个流程
    • pom.xml文件专门用于配置项目:依赖及其版本、插件、远程库等
    • 委托外部组件执行生命周期任务的插件架构

    安装配置

    在Window上,将编译好的二进制文件压缩包解压到磁盘下,之后将bin目录配置到环境变量的Path变量下即可。另外,由于国内连接Maven中心远程库的效率较低,可以在setting.xml文件下的<mirrors>标签下配置阿里云镜像库。

    Linux大同小异,解压后,配置path变量即可。

    基本概念

    Maven目录的典型结构

    Maven目录的典型结构

    以上就是一个典型的Maven管理的Java项目结构,如果是web项目,在main目录下还可以有一个webapp目录。resources主要放置配置文件和各种属性文件,webapp主要放置web资源文件。

    POM文件格式

    一个典型的pom文件一级标签如下:

    • <project>:根元素
    • <groupId>:组ID
    • artifactId:maven项目唯一定位值
    • <version>:版本
    • <package>:打包方式,常用的有pom(父项目)、jarwareramaven-plugin
    • <properties>:配置属性值,可供其他标签引用
    • <depandencies>:依赖项目配置
    • <build>:构建项目要执行任务的配置
    • <profiles>:不同的平台对应不同的环境

    GAV

    GAV即groupIdartifactId,version三个,这三个值在一个Maven库中唯一确定一个项目

    依赖

    一个典型的依赖如下所示:

        <dependencies>
            <!--think in java安装到本地的net.mindview.util.jar包-->
            <dependency>
                <groupId>net.mindview</groupId>
                <artifactId>util</artifactId>
                <version>1.0</version>
                <scope>compile</scope>
            </dependency>
        </dependencies>
    

    GAV就不说了,scope表示该依赖作用的范围,比如

    • compile是默认值,作用在编译和执行阶段
    • runtime只在执行阶段需要
    • test只在测试阶段需要
    • 还有其他。。。不一而足

    依赖管理与父项目

    当一个项目被其他项目设为父项目的时候,该项目的package方式就是pom,同时子项目会继承父项目的依赖以及版本。但是很多时候,除了公共依赖部分会在父项目中显示的depandency,而每个子项目也有自己的依赖。当某两个或者三个子项目依赖相同,但是有没有在父项目中继承的时候,他们的同一版本管理就成了问题。

    一种解决方案是,在父目录中只声明依赖,而不实际引用,怎么操作呢,如下:

        <dependencyManagement>
            <dependencies>
                <!--Junit 单元测试一家子,scope:test-->
                <dependency>
                    <groupId>org.junit.jupiter</groupId>
                    <artifactId>junit-jupiter-api</artifactId>
                    <version>${junit.jupiter.version}</version>
                    <scope>test</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    

    这个dependencyManagement中只负责声明,而子项目如果有需要就只需要在dependency中引用即可,而且不需要配置version,直接继承父项目的声明。如果有特别版本需要,也可覆盖声明。同时,父项目修改声明的版本,所有继承的子项目直接修改,不需要一个个配置。

    同时,还有一种方案,就是配置scope=import,他可以将外部非parent的项目的依赖声明导入进来。

    关于父项目的一点主意事项

    父项目可以作为一个聚合器(当然不是父项目也可以),使用如下方式:

        <modules>
            <module>effjava</module>
            <module>algorithms</module>
            <module>multithread</module>
            <module>java8</module>
            <module>thinkinjava</module>
            <module>jackson</module>
        </modules>
    

    其中,每一个module都是他的子项目,parent作为子项目的聚合器,一一声明

    另外一点,就是父项目如果没有被deploy到远程或者本地库中,而是作为代码存在,那么子项目在声明parent的时候,需要使用ralativePath声明父项目的pom文件位置,如下:

    <parent>
            <artifactId>EffectiveJava</artifactId>
            <groupId>com.luzj</groupId>
            <version>1.0-SNAPSHOT</version>
            <relativePath>../pom.xml</relativePath>
    </parent>
    

    repository

    repository分为本地库和远程库,本地库就是在本地.m2目录下的依赖文件管理库,远程库一种分为Maven官方中心库,一种是个人搭建的私库。如果需要使用私库或者第三方库,则需要在repository标签下声明库地址。

    当maven开始构建并且检查依赖的时候,一般会检查本地库有没有,没有就会向远程库下载。

    具体如果配置远程库等,可以参考Maven官方文档

    Maven构建生命周期与插件

    生命周期

    • validate:验证项目是否正确,信息是否就绪
    • compile:编译源码
    • test:运行测试用例
    • package:打包
    • install:将项目安装到本地库
    • deploy:分发到远程库

    插件

    以上这些周期任务的执行,maven本身不负责,而是委托给插件负责。一般如果没有在项目特别声明插件,Maven就会使用默认的插件。比如编译插件为maven-compile-plugin。他们都配置在build->plugins->plugin标签下。build是配置Maven构建流程的主要根标签,其下面可以有很多选项配置构建任务以及插件选择等。具体可参考Maven文档

    插件管理,也如同依赖管理一样,主要使用pluginManagement配置。

    maven命令

    结构如下:

    mvn [options] [<goals>] [<phases>]
    

    典型的如下:

    mvn archetype:create
        -DgroupId=packageName
        -DartifactId=projectName
    

    参考

  • 相关阅读:
    20-存储过程
    21-事务
    18-触发器
    19-函数
    16-pymysql模块的使用
    17-视图
    CodeForces 1369B. AccurateLee
    CodeForces 1312D.Count the Arrays(组合数学)
    CodeForces 1362D. Johnny and Contribution
    CodeForces 1363F. Rotating Substrings
  • 原文地址:https://www.cnblogs.com/Franken-Fran/p/maven_intro.html
Copyright © 2011-2022 走看看