回顾-Maven

1. Maven回顾

1. 标准目录结构

Maven 提倡使用一个共同的标准目录结构,Maven 使用约定优于配置的原则,大家尽可能的遵守这样的目录结构。如下所示:

目录 目的
${basedir} 存放pom.xml和所有的子目录
${basedir}/src/main/java 项目的java源代码
${basedir}/src/main/resources 项目的资源,比如说property文件,springmvc.xml
${basedir}/src/test/java 项目的测试类,比如说Junit代码
${basedir}/src/test/resources 测试用的资源
${basedir}/src/main/webapp/WEB-INF web应用文件目录,web项目的信息,比如存放web.xml、本地图片、jsp视图页面
${basedir}/target 打包输出目录
${basedir}/target/classes 编译输出目录
${basedir}/target/test-classes 测试编译输出目录
Test.java Maven只会自动运行符合该命名规则的测试类
~/.m2/repository Maven默认的本地仓库目录位置

回顾-Maven_第1张图片

2. POM文件

POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个XML文件。

执行任务或目标时,Maven 会在当前目录中查找 POM。它读取 POM,获取所需的配置信息,然后执行目标。

OM 中可以指定以下配置:

  • 项目依赖
  • 插件
  • 执行目标
  • 项目构建 profile
  • 项目版本
  • 项目开发者列表
  • 相关邮件列表信息
组项目groupId

 
    
    <modelVersion>4.0.0modelVersion>
    
    <groupId>com.companyname.project-groupgroupId>
 
    
    <artifactId>projectartifactId>
 
    
    <version>1.0version>
project>

所有 POM 文件都需要 project 元素和三个必需字段:groupId,artifactId,version

节点 描述
project 工程的根标签。
modelVersion 模型版本需要设置为 4.0。
groupId 这是工程组的标识。它在一个组织或者项目中通常是唯一的。例如,一个银行组织 com.companyname.project-group 拥有所有的和银行相关的项目。
artifactId 这是工程的标识。它通常是工程的名称。例如,消费者银行。groupId 和 artifactId 一起定义了 artifact 在仓库中的位置。
version 这是工程的版本号。在 artifact 的仓库中,它用来区分不同的版本。例如:com.company.bank:consumer-banking:1.0 com.company.bank:consumer-banking:1.1
父工程(SuperPOM)

父(Super)POM是 Maven 默认的 POM。

所有的 POM 都继承自一个父 POM(无论是否显式定义了这个父 POM)。

父 POM 包含了一些可以被继承的默认设置。

因此,当 Maven 发现需要下载 POM 中的 依赖时,它会到 Super POM 中配置的默认仓库 http://repo1.maven.org/maven2 去下载。

3. Maven构建生命周期

Maven 构建生命周期定义了一个项目构建跟发布的过程。

一个典型的 Maven 构建(build)生命周期是由以下几个阶段的序列组成的:

回顾-Maven_第2张图片

阶段 处理 描述
验证 validate 验证项目 验证项目是否正确且所有必须信息是可用的
编译 compile 执行编译 源代码编译在此阶段完成
测试 Test 测试 使用适当的单元测试框架(例如JUnit)运行测试。
包装 package 打包 创建JAR/WAR包如在 pom.xml 中定义提及的包
检查 verify 检查 对集成测试的结果进行检查,以保证质量达标
安装 install 安装 安装打包的项目到本地仓库,以供其他项目使用
部署 deploy 部署 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程

为了完成 default 生命周期,这些阶段(包括其他未在上面罗列的生命周期阶段)将被按顺序地执行。

Maven 有以下三个标准的生命周期:

  • clean:项目清理的处理
  • default(或 build):项目部署的处理
  • site:项目站点文档创建的处理

在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行

回顾-Maven_第3张图片

4. 配置文件

构建配置文件是一系列的配置项的值,可以用来设置或者覆盖 Maven 构建默认值。

构建配置文件大体上有三种类型:

类型 在哪定义
项目级(Per Project) 定义在项目的POM文件pom.xml中
用户级 (Per User) 定义在Maven的设置xml文件中 (%USER_HOME%/.m2/settings.xml)
全局(Global) 定义在 Maven 全局的设置 xml 文件中 (%M2_HOME%/conf/settings.xml)

回顾-Maven_第4张图片

5. Maven仓库

Maven 仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库。

在 Maven 中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。

Maven 仓库能帮助我们管理构件(主要是JAR),它就是放置所有JAR文件(WAR,ZIP,POM等等)的地方。

Maven 仓库有三种类型:

  • 本地(local):Maven 的本地仓库,在安装 Maven 后并不会创建,它是在第一次执行 maven 命令的时候才被创建。
  • 中央(central):Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的库。
  • 远程(remote):它是开发人员自己定制仓库,包含了所需要的代码库或者其他工程中用到的 jar 文件。
5.1 Maven依赖搜索的顺序
  • 步骤 1 - 在本地仓库中搜索,如果找不到,执行步骤 2,如果找到了则执行其他操作。
  • 步骤 2 - 在中央仓库中搜索,如果找不到,并且有一个或多个远程仓库已经设置,则执行步骤 4,如果找到了则下载到本地仓库中以备将来引用。
  • 步骤 3 - 如果远程仓库没有被设置,Maven 将简单的停滞处理并抛出错误(无法找到依赖的文件)。
  • 步骤 4 - 在一个或多个远程仓库中搜索依赖的文件,如果找到则下载到本地仓库以备将来引用,否则 Maven 将停止处理并抛出错误(无法找到依赖的文件)。
5.2 配置阿里云作为远程仓库

第一步:修改 maven 根目录下的 conf 文件夹中的 setting.xml 文件,在 mirrors 节点上,添加内容如下:

<mirrors>
    <mirror>
      <id>alimavenid>
      <name>aliyun mavenname>
      <url>http://maven.aliyun.com/nexus/content/groups/public/url>
      <mirrorOf>centralmirrorOf>        
    mirror>
mirrors>

第二步: pom.xml文件里添加:

<repositories>  
        <repository>  
            <id>alimavenid>  
            <name>aliyun mavenname>  
            <url>http://maven.aliyun.com/nexus/content/groups/public/url>  
            <releases>  
                <enabled>trueenabled>  
            releases>  
            <snapshots>  
                <enabled>falseenabled>  
            snapshots>  
        repository>  
repositories>

6. Maven插件

Maven 生命周期的每一个阶段的具体实现都是由 Maven 插件实现的。

Maven 实际上是一个依赖插件执行的框架,每个任务实际上是由插件完成。Maven 插件通常被用来:

  • 创建 jar 文件
  • 创建 war 文件
  • 编译代码文件
  • 代码单元测试
  • 创建工程文档
  • 创建工程报告

下面是一些常用插件的列表:

插件 描述
clean 构建之后清理目标文件。删除目标目录。
compiler 编译 Java 源文件。
surefile 运行 JUnit 单元测试。创建测试报告。
jar 从当前工程中构建 JAR 文件。
war 从当前工程中构建 WAR 文件。
javadoc 为工程生成 Javadoc。
antrun 从构建过程的任意一个阶段中运行一个 ant 任务的集合。

7. Maven构建Java项目

Maven 使用原型 archetype 插件创建项目。

要创建一个简单的 Java 应用,我们将使用 maven-archetype-quickstart 插件。

命令行输入一下命令,可以在本地磁盘构建一个机遇maven的Java应用项目

mvn archetype:generate 
"-DgroupId=com.companyname.bank" 
"-DartifactId=consumerBanking" 
"-DarchetypeArtifactId=maven-archetype-quickstart" 
"-DinteractiveMode=false"

参数说明:

  • -DgourpId: 组织名,公司网址的反写 + 项目名称
  • -DartifactId: 项目名-模块名
  • -DarchetypeArtifactId: 指定 ArchetypeId,maven-archetype-quickstart,创建一个简单的 Java 应用
  • -DinteractiveMode: 是否使用交互模式

8. Maven引入外部依赖

添加以下依赖到 pom.xml 文件中:

<dependencies>
    
    <dependency>
        <groupId>ldapjdkgroupId>  
        <artifactId>ldapjdkartifactId>    
        <version>1.0version> 
        <scope>systemscope> 
        <systemPath>${basedir}\src\lib\ldapjdk.jarsystemPath> 
    dependency> 
dependencies>

9. Maven Web应用

使用版本控制系统 Maven 来管理一个基于 web 的项目。

使用 maven-archetype-webapp 插件可以创建一个简单的 Java web 应用。

Maven 目录结构是标准的,各个目录作用如下表所示:

文件夹结构 描述
projectName 包含 src 文件夹和 pom.xml 文件。
src/main/webapp 包含 index.jsp 文件和 WEB-INF 文件夹.
src/main/webapp/WEB-INF 包含 web.xml 文件
src/main/resources 包含图片、properties资源文件。

10.POM标签大全详解

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/maven-v4_0_0.xsd">
    
    <parent>
        
        <artifactId />
        
        <groupId />
        
        <version />
        
        <relativePath />
    parent>
    
    <modelVersion>4.0.0modelVersion>
    
    <groupId>asia.banseongroupId>
    
    <artifactId>banseon-maven2artifactId>
    
    <packaging>jarpackaging>
    
    <version>1.0-SNAPSHOTversion>
    
    <name>banseon-mavenname>
    
    <url>http://www.baidu.com/banseonurl>
    
    <description>A maven project to study maven.description>
    
    <prerequisites>
        
        <maven />
    prerequisites>
    
    <issueManagement>
        
        <system>jirasystem>
        
        <url>http://jira.baidu.com/banseonurl>
    issueManagement>
    
    <ciManagement>
        
        <system />
        
        <url />
        
        <notifiers>
            
            <notifier>
                
                <type />
                
                <sendOnError />
                
                <sendOnFailure />
                
                <sendOnSuccess />
                
                <sendOnWarning />
                
                <address />
                
                <configuration />
            notifier>
        notifiers>
    ciManagement>
    
    <inceptionYear />
    
    <mailingLists>
        
        <mailingList>
            
            <name>Demoname>
            
            <post>[email protected]post>
            
            <subscribe>[email protected]subscribe>
            
            <unsubscribe>[email protected]unsubscribe>
            
            <archive>http:/hi.baidu.com/banseon/demo/dev/archive>
        mailingList>
    mailingLists>
    
    <developers>
        
        <developer>
            
            <id>HELLO WORLDid>
            
            <name>banseonname>
            
            <email>[email protected]email>
            
            <url />
            
            <roles>
                <role>Project Managerrole>
                <role>Architectrole>
            roles>
            
            <organization>demoorganization>
            
            <organizationUrl>http://hi.baidu.com/banseonorganizationUrl>
            
            <properties>
                <dept>Nodept>
            properties>
            
            <timezone>-5timezone>
        developer>
    developers>
    
    <contributors>
        
        <contributor>
            <name />
            <email />
            <url />
            <organization />
            <organizationUrl />
            <roles />
            <timezone />
            <properties />
        contributor>
    contributors>
    
    <licenses>
        
        <license>
            
            <name>Apache 2name>
            
            <url>http://www.baidu.com/banseon/LICENSE-2.0.txturl>
            
            <distribution>repodistribution>
            
            <comments>A business-friendly OSS licensecomments>
        license>
    licenses>
    
    <scm>
        
        <connection>
            scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk)
        connection>
        
        <developerConnection>
            scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk
        developerConnection>
        
        <tag />
        
        <url>http://svn.baidu.com/banseonurl>
    scm>
    
    <organization>
        
        <name>demoname>
        
        <url>http://www.baidu.com/banseonurl>
    organization>
    
    <build>
        
        <sourceDirectory />
        
        <scriptSourceDirectory />
        
        <testSourceDirectory />
        
        <outputDirectory />
        
        <testOutputDirectory />
        
        <extensions>
            
            <extension>
                
                <groupId />
                
                <artifactId />
                
                <version />
            extension>
        extensions>
        
        <defaultGoal />
        
        <resources>
            
            <resource>
                
                <targetPath />
                
                <filtering />
                
                <directory />
                
                <includes />
                
                <excludes />
            resource>
        resources>
        
        <testResources>
            
            <testResource>
                <targetPath />
                <filtering />
                <directory />
                <includes />
                <excludes />
            testResource>
        testResources>
        
        <directory />
        
        <finalName />
        
        <filters />
        
        <pluginManagement>
            
            <plugins>
                
                <plugin>
                    
                    <groupId />
                    
                    <artifactId />
                    
                    <version />
                    
                    <extensions />
                    
                    <executions>
                        
                        <execution>
                            
                            <id />
                            
                            <phase />
                            
                            <goals />
                            
                            <inherited />
                            
                            <configuration />
                        execution>
                    executions>
                    
                    <dependencies>
                        
                        <dependency>
                            ......
                        dependency>
                    dependencies>
                    
                    <inherited />
                    
                    <configuration />
                plugin>
            plugins>
        pluginManagement>
        
        <plugins>
            
            <plugin>
                <groupId />
                <artifactId />
                <version />
                <extensions />
                <executions>
                    <execution>
                        <id />
                        <phase />
                        <goals />
                        <inherited />
                        <configuration />
                    execution>
                executions>
                <dependencies>
                    
                    <dependency>
                        ......
                    dependency>
                dependencies>
                <goals />
                <inherited />
                <configuration />
            plugin>
        plugins>
    build>
    
    <profiles>
        
        <profile>
            
            <id />
            
            <activation>
                
                <activeByDefault />
                
                <jdk />
                
                <os>
                    
                    <name>Windows XPname>
                    
                    <family>Windowsfamily>
                    
                    <arch>x86arch>
                    
                    <version>5.1.2600version>
                os>
                
                <property>
                    
                    <name>mavenVersionname>
                    
                    <value>2.0.3value>
                property>
                
                <file>
                    
                    <exists>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
                    exists>
                    
                    <missing>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
                    missing>
                file>
            activation>
            
            <build>
                <defaultGoal />
                <resources>
                    <resource>
                        <targetPath />
                        <filtering />
                        <directory />
                        <includes />
                        <excludes />
                    resource>
                resources>
                <testResources>
                    <testResource>
                        <targetPath />
                        <filtering />
                        <directory />
                        <includes />
                        <excludes />
                    testResource>
                testResources>
                <directory />
                <finalName />
                <filters />
                <pluginManagement>
                    <plugins>
                        
                        <plugin>
                            <groupId />
                            <artifactId />
                            <version />
                            <extensions />
                            <executions>
                                <execution>
                                    <id />
                                    <phase />
                                    <goals />
                                    <inherited />
                                    <configuration />
                                execution>
                            executions>
                            <dependencies>
                                
                                <dependency>
                                    ......
                                dependency>
                            dependencies>
                            <goals />
                            <inherited />
                            <configuration />
                        plugin>
                    plugins>
                pluginManagement>
                <plugins>
                    
                    <plugin>
                        <groupId />
                        <artifactId />
                        <version />
                        <extensions />
                        <executions>
                            <execution>
                                <id />
                                <phase />
                                <goals />
                                <inherited />
                                <configuration />
                            execution>
                        executions>
                        <dependencies>
                            
                            <dependency>
                                ......
                            dependency>
                        dependencies>
                        <goals />
                        <inherited />
                        <configuration />
                    plugin>
                plugins>
            build>
            
            <modules />
            
            <repositories>
                
                <repository>
                    <releases>
                        <enabled />
                        <updatePolicy />
                        <checksumPolicy />
                    releases>
                    <snapshots>
                        <enabled />
                        <updatePolicy />
                        <checksumPolicy />
                    snapshots>
                    <id />
                    <name />
                    <url />
                    <layout />
                repository>
            repositories>
            
            <pluginRepositories>
                
                <pluginRepository>
                    <releases>
                        <enabled />
                        <updatePolicy />
                        <checksumPolicy />
                    releases>
                    <snapshots>
                        <enabled />
                        <updatePolicy />
                        <checksumPolicy />
                    snapshots>
                    <id />
                    <name />
                    <url />
                    <layout />
                pluginRepository>
            pluginRepositories>
            
            <dependencies>
                
                <dependency>
                    ......
                dependency>
            dependencies>
            
            <reports />
            
            <reporting>
                ......
            reporting>
            
            <dependencyManagement>
                <dependencies>
                    
                    <dependency>
                        ......
                    dependency>
                dependencies>
            dependencyManagement>
            
            <distributionManagement>
                ......
            distributionManagement>
            
            <properties />
        profile>
    profiles>
    
    <modules />
    
    <repositories>
        
        <repository>
            
            <releases>
                
                <enabled />
                
                <updatePolicy />
                
                <checksumPolicy />
            releases>
            
            <snapshots>
                <enabled />
                <updatePolicy />
                <checksumPolicy />
            snapshots>
            
            <id>banseon-repository-proxyid>
            
            <name>banseon-repository-proxyname>
            
            <url>http://192.168.1.169:9999/repository/url>
            
            <layout>defaultlayout>
        repository>
    repositories>
    
    <pluginRepositories>
        
        <pluginRepository>
            ......
        pluginRepository>
    pluginRepositories>
 
 
    
    <dependencies>
        <dependency>
            
            <groupId>org.apache.mavengroupId>
            
            <artifactId>maven-artifactartifactId>
            
            <version>3.8.1version>
            
            <type>jartype>
            
            <classifier>classifier>
            
            <scope>testscope>
            
            <systemPath>systemPath>
            
            <exclusions>
                <exclusion>
                    <artifactId>spring-coreartifactId>
                    <groupId>org.springframeworkgroupId>
                exclusion>
            exclusions>
            
            <optional>trueoptional>
        dependency>
    dependencies>
    
    <reports>reports>
    
    <reporting>
        
        <excludeDefaults />
        
        <outputDirectory />
        
        <plugins>
            
            <plugin>
                
                <groupId />
                
                <artifactId />
                
                <version />
                
                <inherited />
                
                <configuration />
                
                <reportSets>
                    
                    <reportSet>
                        
                        <id />
                        
                        <configuration />
                        
                        <inherited />
                        
                        <reports />
                    reportSet>
                reportSets>
            plugin>
        plugins>
    reporting>
    
    <dependencyManagement>
        <dependencies>
            
            <dependency>
                ......
            dependency>
        dependencies>
    dependencyManagement>
    
    <distributionManagement>
        
        <repository>
            
            <uniqueVersion />
            <id>banseon-maven2id>
            <name>banseon maven2name>
            <url>file://${basedir}/target/deployurl>
            <layout />
        repository>
        
        <snapshotRepository>
            <uniqueVersion />
            <id>banseon-maven2id>
            <name>Banseon-maven2 Snapshot Repositoryname>
            <url>scp://svn.baidu.com/banseon:/usr/local/maven-snapshoturl>
            <layout />
        snapshotRepository>
        
        <site>
            
            <id>banseon-siteid>
            
            <name>business api websitename>
            
            <url>
                scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web
            url>
        site>
        
        <downloadUrl />
        
        <relocation>
            
            <groupId />
            
            <artifactId />
            
            <version />
            
            <message />
        relocation>
        
        <status />
    distributionManagement>
    
    <properties />
project>

常用

parent					父项目的坐标。
modelVersion			POM模型版本
groupId					项目的全球唯一标识符,通常使用全限定的包名区分该项目和其他项目。
artifactId				构件的标识符,它和group ID一起唯一标识一个构件。
packaging				项目产生的构件类型,例如jar、war、ear、pom。
version					项目当前版本,格式为:主版本.次版本.增量版本-限定版本号
name					项目的名称, Maven产生的文档用
url						项目主页的URL, Maven产生的文档用
description				项目的详细描述, Maven 产生的文档用。
build					构建项目需要的信息
profiles				在列的项目构建profile,如果被激活,会修改构建处理
modules					模块(有时称作子项目) 被构建成项目的一部分。列出的每个模块元素是指向该模块的目录的相对路径
repositories			发现依赖和扩展的远程仓库列表
pluginRepositories		发现插件的远程仓库列表,这些插件用于构建和报表
dependencies			该元素描述了项目相关的所有依赖。 这些依赖组成了项目构建过程中的一个个环节。它们自动从项目定义的仓库中下载。
dependencyManagement	继承自该项目的所有子项目的默认依赖信息。这部分的依赖信息不会被立即解析,而是当子项目声明一个依赖(必须描述group ID和 artifact
        ID信息),如果group ID和artifact ID以外的一些信息没有描述,则通过group ID和artifact ID 匹配到这里的依赖,并使用这里的依赖信息。
properties				以值替代名称,Properties可以在整个POM中使用,也可以作为触发条件(见settings.xml配置文件里activation元素的说明)。

回顾-Maven_第5张图片

11. 其他Maven相关

1、dependencies与dependencyManagement

  • dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)

  • dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。

你可能感兴趣的:(回顾,Java技术栈)