maven项目搭建

1.使用idea自带的maven:

/*路径*/
C:\Users\用户名\.m2

这个路径下存放的就是idea带的maven

进入这个目录下之后,看到的maven的目录以及他的配置文件;

需要对setting.xml中的maven仓库进行修改,一般使用阿里镜像就可以了


    
        
            aliyun
            aliyun
            central
            
            https://maven.aliyun.com/repository/central
        
    

2.若是使用自己下载的

也是同样的方法进行修改,之后就可以直接创建maven项目了;

创建项目的时候,需要在idea-File->setting->maven下面给设置为(若是使用自带的,则不需要):
maven项目搭建_第1张图片

2-3、附言

maven常用命令:

mvn -v //查看版本
mvn archetype:create //创建 Maven 项目
mvn compile //编译源代码
mvn test-compile //编译测试代码
mvn test //运行应用程序中的单元测试
mvn site //生成项目相关信息的网站
mvn package //依据项目生成 jar 文件
mvn install //在本地 Repository 中安装 jar
mvn -Dmaven.test.skip=true //忽略测试文档编译
mvn clean //清除目标目录中的生成结果
mvn clean compile //将.java类编译为.class文件
mvn clean package //进行打包
mvn clean test //执行单元测试
mvn clean deploy //部署到版本仓库
mvn clean install //使其他项目使用这个jar,会安装到maven本地仓库中
mvn archetype:generate //创建项目架构
mvn dependency:list //查看已解析依赖
mvn dependency:tree //看到依赖树
mvn dependency:analyze //查看依赖的工具
mvn help:system //从中央仓库下载文件至本地仓库
mvn help:active-profiles //查看当前激活的profiles
mvn help:all-profiles //查看所有profiles
mvn help:effective -pom //查看完整的pom信息

3.创建项目

在创建项目的时候,直接创建maven项目就可以了:

3.1 使用模板

可以直接使用模板创建项目,下图是直接使用模板快速创建项目的
maven项目搭建_第2张图片
maven项目搭建_第3张图片
maven项目搭建_第4张图片

点击finish就可以完成创建

3.2 不使用模板

不使用模板就是直接创建:
maven项目搭建_第5张图片

创建之后的项目中是一个空的,只有一个maven的框架:他的pom文件如下
maven项目搭建_第6张图片

一个配置:

-Dmaven.wagon.http.ssl.insecure=true
 -Dmaven.wagon.http.ssl.allowall=true

maven项目搭建_第7张图片

注:这里设置的忽略SSL证书验证,防止连不到阿里云的服务器无法自动下载依赖,而出现找不到依赖的错误 。

设置好后应用保存即可。

3.3 使用cmd创建项目

下面我们将通过 maven-archetype-quickstart 原型,在 D:\maven 目录中创建一个基于 Maven 的 Java 项目。

打开命令行窗口,跳转到 D:\maven 目录,执行以下 mvn 命令。

mvn archetype:generate
-DgroupId=net.biancheng.www
-DartifactId=helloMaven
-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

参数说明:

  • -DgroupId: 项目组 ID,通常为组织名或公司网址的反写。
  • -DartifactId: 项目名。
  • -DarchetypeArtifactId: 指定 ArchetypeId,maven-archetype-quickstart 用于快速创建一个简单的 Maven 项目。
  • -DinteractiveMode: 是否使用交互模式。

Maven 开始进行处理,并创建一套完整的 Maven 项目目录结构。

maven项目搭建_第8张图片

表示构建成功

目录及文件说明:

  • helloMaven:项目名,包含 src 文件夹和 pom.xml。
  • src/main/java:用于存放项目的 Java 文件。
  • src/main/resources:用于存放项目资源文件。
  • src/test/java:用于存放所有测试 Java 文件,如 JUnit 测试类。
  • src/test/resources :用于存放测试资源文件。
  • target:项目输出位置,用于存放编译后的文件。
  • pom.xml:Maven 项目核心配置文件。

4.添加依赖

需要的依赖在项目中的pom.xml中进行配置;

maven项目搭建_第9张图片

maven项目搭建_第10张图片

4.1 编辑需要的依赖

    <dependencies>

        <dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>3.8.1version>
            <scope>compilescope>
        dependency>

        <dependency>
            <groupId>javax.servletgroupId>
            <artifactId>servlet-apiartifactId>
            <version>2.5version>
            <scope>providedscope>
        dependency>

    dependencies>

在这里添加依赖,按照他的既定格式进行添加;

groupId:存放的是这个依赖的包存放的位置(maven的本地仓库中)
artifactId:其中的是依赖的名字
version:放的是他的版本号;

当 Maven 根据坐标寻找构件时,它会首先查看本地仓库,若本地仓库存在此构件,则直接使用;若本地仓库不存在此构件,Maven 就会去远程仓库查找,若发现所需的构件后,则下载到本地仓库使用。如果本地仓库和远程仓库都没有所需的构件,则 Maven 就会报错。

远程仓库还可以分为 3 个小类:中央仓库、私服、其他公共仓库。

  • 中央仓库是由 Maven 社区提供的一种特殊的远程仓库,它包含了绝大多数流行的开源构件。在默认情况下,当本地仓库没有 Maven 所需的构件时,会首先尝试从中央仓库下载。
  • 私服是一种特殊的远程仓库,它通常设立在局域网内,用来代理所有外部的远程仓库。它的好处是可以节省带宽,比外部的远程仓库更加稳定。
  • 除了中央仓库和私服外,还有很多其他公共仓库,例如 JBoss Maven 库,Java.net Maven 库等等。
    maven项目搭建_第11张图片

Maven 依赖搜索顺序

当通过 Maven 构建项目时,Maven 按照如下顺序查找依赖的构件。

  1. 从本地仓库查找构件,如果没有找到,跳到第 2 步,否则继续执行其他处理。
  2. 从中央仓库查找构件,如果没有找到,并且已经设置其他远程仓库,然后移动到第 4 步;如果找到,那么将构件下载到本地仓库中使用。
  3. 如果没有设置其他远程仓库,Maven 则会停止处理并抛出错误。
  4. 在远程仓库查找构件,如果找到,则会下载到本地仓库并使用,否则 Maven 停止处理并抛出错误。

对Scode的说明:

Maven的一个哲学是惯例优于配置(Convention Over Configuration), Maven默认的依赖配置项中,scope的默认值是compile,项目中经常傻傻的分不清,直接默认了。今天梳理一下maven的scope。

scope的分类
compile
默认就是compile,什么都不配置也就是意味着compile。compile表示被依赖项目需要参与当前项目的编译,当然后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去。

test
scope为test表示依赖项目仅仅参与测试相关的工作,包括测试代码的编译,执行。比较典型的如junit。

runntime
runntime表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过编译而已,说实话在终端的项目(非开源,企业内部系统)中,和compile区别不是很大。比较常见的如JSR×××的实现,对应的API jar是compile的,具体实现是runtime的,compile只需要知道接口就足够了。oracle jdbc驱动架包就是一个很好的例子,一般scope为runntime。另外runntime的依赖通常和optional搭配使用,optional为true。我可以用A实现,也可以用B实现。

provided
provided意味着打包的时候可以不用包进去,别的设施(Web Container)会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是在打包阶段做了exclude的动作。

system
从参与度来说,也provided相同,不过被依赖项不会从maven仓库抓,而是从本地文件系统拿,一定需要配合systemPath属性使用。

scope的依赖传递
A–>B–>C。当前项目为A,A依赖于B,B依赖于C。知道B在A项目中的scope,那么怎么知道C在A中的scope呢?

当C是test或者provided时,C直接被丢弃,A不依赖C;
否则A依赖C,C的scope继承于B的scope。

maven项目搭建_第12张图片

添加依赖后:
maven项目搭建_第13张图片


<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.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>

    <groupId>org.examplegroupId>
    <artifactId>maven_blogartifactId>
    <version>1.0-SNAPSHOTversion>

    <properties>
        <maven.compiler.source>8maven.compiler.source>
        <maven.compiler.target>8maven.compiler.target>
    properties>

    <dependencies>

        <dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>3.8.1version>
            <scope>compilescope>
        dependency>

        <dependency>
            <groupId>javax.servletgroupId>
            <artifactId>servlet-apiartifactId>
            <version>2.5version>
            <scope>providedscope>
        dependency>

    dependencies>

project>

maven项目搭建_第14张图片

构建成功之后:
maven项目搭建_第15张图片

maven项目搭建_第16张图片

maven pom

1、POM(Project Object Model,项目对象模型)是 Maven 的基本组件,它是以 xml 文件的形式存放在项目的根目录下,名称为 pom.xml。

2、POM 中定义了项目的基本信息,用于描述项目如何构建、声明项目依赖等等。

2、当 Maven 执行一个任务时,它会先查找当前项目的 POM 文件,读取所需的配置信息,然后执行任务。在 POM 中可以设置如下配置:

  • 项目依赖
  • 插件
  • 目标
  • 构建时的配置文件
  • 版本
  • 开发者
  • 邮件列表

4、所有的 Maven 项目都有一个 POM 文件,所有的 POM 文件都必须有 project 元素和 3 个必填字段:groupId、artifactId 以及 version。

5、在创建 POM 之前,首先要确定工程组(groupId),及其名称(artifactId)和版本,在仓库中这些属性是项目的唯一标识。

节点 描述
groupId 项目组 ID,定义当前 Maven 项目隶属的组织或公司,通常是唯一的。它的取值一般是项目所属公司或组织的网址或 URL 的反写,例如 net.biancheng.www。
artifactId 项目 ID,通常是项目的名称。groupId 和 artifactId 一起定义了项目在仓库中的位置。
version 项目版本。

Super POM

无论 POM 文件中是否显示的声明,所有的 POM 均继承自一个父 POM,这个父 POM 被称为 Super POM,它包含了一些可以被继承的默认设置。

Maven 使用 effective pom (Super POM 的配置加上项目的配置)来执行相关任务,它替开发人员在 pom.xml 中做了一些最基本的配置。当然,开发人员依然可以根据需要重写其中的配置信息。

执行以下命令 ,就可以查看 Super POM 的默认配置。

mvn help:effective-pom

你可以看到 effective-pom 中包含了 Maven 在执行任务时需要用到的默认目录结构、输出目录、插件、仓库和报表目录等内容。

实际开发过程中,Maven 的 pom.xml 文件不需要手工编写,Maven 提供了大量的原型(Archetype)插件来创建项目,包括项目结构和 pom.xml。

6、构建项目

打开命令行窗口,跳转到 D:\maven\helloMaven 目录,执行以下 mvn 命令,对该项目进行构建。

mvn clean package

或者:
maven项目搭建_第17张图片

项目构建完成后,在该项目根目录中生成了一个名为 target 的目录,该目录包含以下内容。
maven项目搭建_第18张图片

说明:

  • Maven 命令中包含了两个命令:clean 和 package,其中 clean 负责清理 target 目录,package 负责将项目构建并打包输出为 jar 文件。
  • classes:源代码编译后存放在该目录中。
  • test-classes:测试源代码编译后并存放在该目录中。
  • surefire-reports:Maven 运行测试用例生成的测试报告存放在该目录中。
  • helloMaven-1.0-SNAPSHOT.jar:Maven 对项目进行打包生成的 jar 文件。

Maven 坐标

1、Maven 坐标一套规则,它规定:世界上任何一个构件都可以使用 Maven 坐标并作为其唯一标识,Maven 坐标包括 groupId、artifactId、version、packaging 等元素,只要用户提供了正确的坐标元素,Maven 就能找到对应的构件。

2、任何一个构件都必须明确定义自己的坐标,这是 Maven 的强制要求,任何构件都不能例外。我们在开发 Maven 项目时,也需要为其定义合适的坐标,只有定义了坐标,其他项目才能引用该项目生成的构件。

Maven 坐标主要由以下元素组成:

  • groupId: 项目组 ID,定义当前 Maven 项目隶属的组织或公司,通常是唯一的。它的取值一般是项目所属公司或组织的网址或 URL 的反写,例如 net.biancheng.www。
  • artifactId: 项目 ID,通常是项目的名称。
  • version:版本。
  • packaging:项目的打包方式,默认值为 jar。

5、maven的生命周期

这个生命周期将项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有构建过程进行了抽象和统一。

父类 LifeCycle 模拟的是 Maven 生命周期,子类 CleanPlugin 模拟的是 Maven 插件,而子类中重写的 clean() 模拟的是插件目标。

虽然示例中的代码与 Maven 实际代码相去甚远,但它们的基本理念是方法相同的。生命周期抽象了构建的各个步骤,定义了它们的执行顺序,但却没有提供具体的实现。插件中完成了对构建过程的实现,想要完成某个构建步骤,调用插件中的一个或多个插件目标即可。

生命周期中的每个构建过程都可以绑定一个或多个插件目标,且 Maven 为大多数的构建步骤都绑定了默认的插件。例如,针对源代码编译的插件是 maven-compiler-plugin、针对集成测试的插件是 maven-surefire-plugin 等。

注意:Maven 插件和插件在Maven 插件中会详细介绍。

1、三套生命周期

Maven 拥有三套标准的生命周期:

  • clean:用于清理项目
  • default:用于构建项目
  • site:用于建立项目站点
构建阶段

每套生命周期包含一系列的构建阶段(phase),这些阶段是有顺序的,且后面的阶段依赖于前面的阶段。用户与 Maven 最直接的交互方式就是调用这些生命周期阶段。以 clean 生命周期为例,它包含 pre-clean、clean 以及 post-clean 三个阶段,当用户调用 pre-clean 阶段时,则只有 pre-clean 阶段执行;当用户调用 clean 阶段时,pre-clean 和 clean 阶段都会执行。当用户调用 post-clean 阶段时,则 pre-clean、clean 以及 post-clean 三个阶段都会执行。

通过将阶段名传递给 mvn 命令,就可以调用构建阶段,例如:

mvn install
生命周期的独立性

与构建阶段的前后依赖关系不同,三套生命周期本身时相互独立的,用户可以只调用 clean 生命周期的某个阶段,也可以只调用 default 生命周期的某个阶段,而不会对其他生命周期造成任何影响。

clean 生命周期

clean 生命周期包括以下 3 个阶段。

  • pre-clean(清理前)
  • clean(清理)
  • post-clean(清理后)

下面我们将 maven-antrun-plugin 插件的 run 目标绑定到 pre-clean、clean 和 post-clean 三个阶段中,以实现在 clean 生命周期的各个阶段中显示自定义文本信息,pom.xml 配置如下:


    4.0.0
    net.biancheng.www
    maven
    0.0.1-SNAPSHOT

    
        
        
            junit
            junit
            4.9
            compile
        
        
        
            log4j
            log4j
            1.2.17
        
    

    
        
            
            
                org.apache.maven.plugins
                maven-antrun-plugin
                1.1
                
                    
                        
                        www.biancheng.net pre-clean
                        
                        pre-clean
                        
                        
                            run
                        
                        
                        
                            
                            
                                
                                预清理阶段,编程帮 欢迎您的到来,网址:www.biancheng.net
                            
                        
                    
                    
                        
                        www.biancheng.net clean
                        
                        clean
                        
                        
                            run
                        
                        
                        
                            
                            
                                
                                清理阶段,编程帮 欢迎您的到来,网址:www.biancheng.net
                            
                        
                    
                    
                        
                        www.biancheng.net post-clean
                        
                        post-clean
                        
                        
                            run
                        
                        
                        
                            
                            
                                
                                后清理阶段,编程帮 欢迎您的到来,网址:www.biancheng.net
                            
                        
                    
                
            
        
    

2、default 生命周期

default 生命周期定义了项目真正构建时所需要的所有步骤,它是所有生命周期中最核心,最重要的部分。

default 生命周期包含非常多的阶段,如下表。

阶段 描述
validate 验证项目是否正确以及所有必要信息是否可用。
initialize 初始化构建状态。
generate-sources 生成编译阶段需要的所有源码文件。
process-sources 处理源码文件,例如过滤某些值。
generate-resources 生成项目打包阶段需要的资源文件。
process-resources 处理资源文件,并复制到输出目录,为打包阶段做准备。
compile 编译源代码,并移动到输出目录。
process-classes 处理编译生成的字节码文件
generate-test-sources 生成编译阶段需要的测试源代码。
process-test-sources 处理测试资源,并复制到测试输出目录。
test-compile 编译测试源代码并移动到测试输出目录中。
test 使用适当的单元测试框架(例如 JUnit)运行测试。
prepare-package 在真正打包之前,执行一些必要的操作。
package 获取编译后的代码,并按照可发布的格式进行打包,例如 JAR、WAR 或者 EAR 文件。
pre-integration-test 在集成测试执行之前,执行所需的操作,例如设置环境变量。
integration-test 处理和部署所需的包到集成测试能够运行的环境中。
post-integration-test 在集成测试被执行后执行必要的操作,例如清理环境。
verify 对集成测试的结果进行检查,以保证质量达标。
install 安装打包的项目到本地仓库,以供其他项目使用。
deploy 拷贝最终的包文件到远程仓库中,以共享给其他开发人员和项目。

将 maven-antrun-plugin 插件的 run 目标绑定 default 生命周期的部分阶段中,以实现在 default 生命周期的特定阶段中显示定义文本信息。

3、site 生命周期

sit 生命周期的目的是建立和部署项目站点,Maven 能够根据 POM 包含的信息,自动生成一个友好的站点,该站点包含一些与该项目相关的文档。

site 生命周期包含以下 4 个阶段:

  • pre-site
  • site
  • post-site
  • site-deploy

aven 实际上是一个依赖插件执行的框架,它执行的每个任务实际上都由插件完成的。Maven 的核心发布包中并不包含任何 Maven 插件,它们以独立构件的形式存在, 只有在 Maven 需要使用某个插件时,才会去仓库中下载。

4、Maven 提供了 2 种类型的插件。

插件类型 描述
Build plugins 在项目构建过程中执行,在 pom.xml 中的 build 元素中配置
Reporting plugins 在网站生成过程中执行,在 pom.xml 中的 reporting 元素中配置

5、插件目标

对于 Maven 插件而言,为了提高代码的复用性,通常一个 Maven 插件能够实现多个功能,每一个功能都是一个插件目标,即 Maven 插件是插件目标的集合。我们可以把插件理解为一个类,而插件目标是类中的方法,调用插件目标就能实现对应的功能。

通用写法

插件目标的通用写法如下。

[插件名]:[插件目标名]

例如,maven-compiler-plugin 插件的 compile 目标的通用写法如下。

maven-compiler-plugin:compile
执行插件目标

使用 Maven 命令执行插件的目标,语法如下。

mvn [插件名]:[目标名]

例如,调用 maven-compiler-plugin 插件的 compile 目标,命令如下。

mvn compiler:compile

6、插件绑定

为了完成某个具体的构建任务,Maven 生命周期的阶段需要和 Maven 插件的目标相互绑定。例如,代码编译任务对应了default 生命周期的 compile 阶段,而 maven-compiler-plugin 插件的 compile 目标能够完成这个任务,因此将它们进行绑定就能达到代码编译的目的。

内置绑定

Maven 默认为一些核心的生命周期阶段绑定了插件目标,当用户调用这些阶段时,对应的插件目标就会自动执行相应的任务。

生命周期 阶段 插件目标 执行的任务
clean pre-clean
clean maven-clean-plugin:clean 清理 Maven 的输出目录
post-clean
site pre-site
site maven-site-plugin:site 生成项目站点
post-site
site-deploy maven-site-plugin:deploy 部署项目站点
default process-resources maven-resources-plugin:resources 复制资源文件到输出目录
compile maven-compiler-plugin:compile 编译代码到输出目录
process-test-resources maven-resources-plugin:testResources 复制测试资源文件到测试输出目录
test-compile maven-compiler-plugin:testCompile 编译测试代码到测试输出目录
test maven-surefire-plugin:test 执行测试用例
package maven-jar-plugin:jar/maven-jar-plugin:war 创建项目 jar/war 包
install maven-install-plugin:install 将项目输出的包文件安装到本地仓库
deploy maven-deploy-plugin:deploy 将项目输出的包文件部署到到远程仓库

上表中,default 生命周期中只列出了绑定了插件目标的阶段,它还有很多其他的阶段,但这些阶段默认没有绑定任何插件目标,因此它们也没有任何实际的行为。

我们可以直接在执行 Maven 命令看到该构建过程包含了哪些插件目标。例如,在 Maven 项目中执行 mvn clean install 命令,能看到如下输出,图中标记的部分就是执行此命令时所调用的插件目标。

自定义绑定

除了内置绑定之外,用户也可以自己选择将某个插件目标绑定到 Maven 生命周期的某个阶段上,这种绑定方式就是自定义绑定。自定义绑定能够让 Maven 在构建过程中执行更多更丰富的任务。

例如,我们想要在 clean 生命周期的 clean 阶段中显示自定义文本信息,则只需要在项目的 POM 中 ,通过 build 元素的子元素 plugins,将 maven-antrun-plugin:run 目标绑定到 clean 阶段上,并使用该插件输出自定义文本信息即可。

execution 下各个元素含义如下:

  • id:任务的唯一标识。
  • phase:插件目标需要绑定的生命周期阶段。
  • goals:用于指定一组插件目标,其子元素 goal 用于指定一个插件目标。
  • configuration:该任务的配置,其子元素 tasks 用于指定该插件目标执行的任务。

6、使用本地的jar包

<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.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0modelVersion>
    <groupId>net.biancheng.wwwgroupId>
    <artifactId>secondMavenartifactId>
    <packaging>jarpackaging>
    <version>1.0-SNAPSHOTversion>
    <name>secondMavenname>
    <url>http://maven.apache.orgurl>
    <dependencies>
        <dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>3.8.1version>
            <scope>testscope>
        dependency>
        
        <dependency>
            <groupId>net.biancheng.wwwgroupId>
            <artifactId>helloMavenartifactId>
             
            <scope>systemscope>
            <version>1.0-SNAPSHOTversion>
            
            <systemPath>D:\maven\helloMaven\target\helloMaven-1.0-SNAPSHOT.jarsystemPath>
        dependency>
    dependencies>
project>

7、maven site

Maven 不仅仅是一款项目构建和依赖管理工具,它还能够聚合项目信息,促进项目团队间地交流。POM 中可以包含各种项目信息,例如:项目描述、SCM 地址、许可证信息,开发者信息等。用户可以使用 Maven 提供的 maven-site-plugin 插件让 Maven 生成一个 Web 站点, 以站点的形式发布以上信息。

<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.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0modelVersion>
    <groupId>net.biancheng.wwwgroupId>
    <artifactId>secondMavenartifactId>
    <packaging>jarpackaging>
    <version>1.0-SNAPSHOTversion>
    <name>secondMavenname>
    <url>http://maven.apache.orgurl>

    <build>
        <plugins>
            
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-site-pluginartifactId>
                <version>3.7.1version>
            plugin>
        plugins>
    build>

    <dependencies>
        <dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>3.8.1version>
            <scope>testscope>
        dependency>
        <dependency>
            <groupId>net.biancheng.wwwgroupId>
            <artifactId>helloMavenartifactId>
            <scope>systemscope>
            <version>1.0-SNAPSHOTversion>
            <systemPath>D:\maven\helloMaven\target\helloMaven-1.0-SNAPSHOT.jarsystemPath>
        dependency>
    dependencies>
project>

maven项目搭建_第19张图片

或者

打开命令行窗口,跳转到 secondMaven 的目录中,执行如下 mvn 命令。

mvn site

Maven 命令运行完毕后,可以在项目的 target\site 目录下找到 Maven 生成的站点文件。

maven项目搭建_第20张图片

双击打开 index.html 查看站点。

maven项目搭建_第21张图片

8、maven snapshot(Maven SNAPSHOT(快照))

Maven 项目第一构建时,会自动从远程仓库搜索依赖项,并将其下载到本地仓库中。当项目再进行构建时,会直接从本地仓库搜索依赖项并引用,而不会再次向远程仓库获取。这样的设计能够避免项目每次构建时都去远程仓库下载依赖,减轻了网络带宽的压力,但也带来了问题。

大型的应用软件通常由多个功能模块组成,这些模块一般分别于不同的团队负责开发。假设有两个团队,他们分别负责项目中的 app-ui(前端) 和 data-service(数据服务) 两个模块,且 app-ui 需要依赖 data-service 项目作为数据服务来源。

基于以上假设,若 data-service 团队正在进行快节奏的 bug 修复及功能增强,会在短时间内高频率地更新代码以及发布版本。就会出现以下情况:

  1. data-service 团队每次发布新版本更新代码时,都应该通知 app-ui 团队。
  2. app-ui 团队则需要定期更新其 pom.xml 以获得最新的版本。

这样,势必会影响开发效率,甚至会影响项目的验收及投产。要解决这个问题,其实很简单,那就是使用 SNAPSHOT(快照)版本。

8.1、SNAPSHOT 是什么

SNAPSHOT(快照)是一种特殊的版本,它表示当前开发进度的副本。与常规版本不同,快照版本的构件在发布时,Maven 会自动为它打上一个时间戳,有了这个时间戳后,当依赖该构件的项目进行构建时,Maven 就能从仓库中找到最新的 SNAPSHOT 版本文件。

定义一个组件或模块为快照版本,只需要在其 pom.xml 中版本号(version 元素的值)后加上 -SNAPSHOT 即可,例如:

net.biancheng.wwwhelloMavenjar1.0-SNAPSHOT

要解决上面的问题,现在就十分简单了:data-servcie 团队每次更新代码都使用快照版本发布到仓库中,app-ui 团队则引用快照版本的依赖,这样 app-ui 不再需要重复修改 pom.xml 中的配置,每次构建时都会自动从仓库中获取最新的构件。

默认情况下对于快照本本的构件,Maven 会每天从仓库中获取一次更新,用户也可以在任何 Maven 命令中使用 -U 参数强制 Maven 检查更新。命令如下:

mvn clean package -U

8.2、SNAPSHOT 版本 VS RELEASE 版本

Maven 仓库分为两种,Snapshot 快照仓库和 Release 发行仓库。Snapshot 快照仓库用于保存开发过程中的不稳定 SNAPSHOT 版本,Release 发行仓库则用来保存稳定的 RELEASE 版本。

Maven 会根据模块的版本号(pom.xml 文件中的 version 元素)中是否带有 -SNAPSHOT 来判断是 SNAPSHOT 版本还是正式 RELEASE 版本。带有 -SNAPSHOT 是SNAPSHOT(快照)版本,不带 -SNAPSHOT 的就是正式 RELEASE(发布)版本。

SNAPSHOT 版本和 RELEASE 版本区别如下表。

区别 SNAPSHOT 版本 RELEASE 版本
定义 版本号中带有 -SNAPSHOT 版本号中不带有 -SNAPSHOT
发布仓库 Snapshot 快照仓库 Release 发行仓库
是否从远程仓库自动获取更新 在不更改版本号的前提下,直接编译打包时,Maven 会自动从远程仓库上下载最新的快照版本。 在不更改版本号的前提下,直接编译打包时,如果本地仓库已经存在该版本的模块,则 Maven 不会主动去远程仓库下载。
稳定性 快照版本往往对应了大量带有时间戳的构件,具有不稳定性。 发布版本只对应了唯一的构件,具有稳定性。
使用场景 快照版本只应该在组织内部的项目中依赖使用。 Maven 项目使用的组织外的依赖项都应该时发布版本的,不应该使用任何的快照版本依赖,否则会造成潜在的风险。
发布前是否需要修改 当项目经过完善的测试后,需要上线时,应该将项目从快照版本更改为发布版本 不需要修改

8.3、示例

打开命令行窗口,跳转到 D:\maven\secondMaven 目录,执行以下 mvn 命令。

mvn clean package -U

命令执行结果如下。

[INFO] Scanning for projects...[WARNING][WARNING] Some problems were encountered while building the effective model for net.biancheng.www:secondMaven:jar:1.0-SNAPSHOT[WARNING] 'dependencies.dependency.systemPath' for net.biancheng.www:helloMaven:jar should use a variable instead of a hard-coded path D:\maven\helloMaven\target\helloMaven-1.0-SNAPSHOT.jar @ line 37, column 16[WARNING][WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.[WARNING][WARNING] For this reason, future Maven versions might no longer support building such malformed projects.[WARNING][INFO][INFO] -------------------< net.biancheng.www:secondMaven >--------------------[INFO] Building secondMaven 1.0-SNAPSHOT[INFO] --------------------------------[ jar ]---------------------------------[INFO][INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ secondMaven ---[INFO] Deleting D:\maven\secondMaven\target[INFO][INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ secondMaven ---[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent![INFO] skip non existing resourceDirectory D:\maven\secondMaven\src\main\resources[INFO][INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ secondMaven ---[INFO] Changes detected - recompiling the module![WARNING] File encoding has not been set, using platform encoding GBK, i.e. build is platform dependent![INFO] Compiling 1 source file to D:\maven\secondMaven\target\classes[INFO][INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ secondMaven ---[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent![INFO] skip non existing resourceDirectory D:\maven\secondMaven\src\test\resources[INFO][INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ secondMaven ---[INFO] Changes detected - recompiling the module![WARNING] File encoding has not been set, using platform encoding GBK, i.e. build is platform dependent![INFO] Compiling 1 source file to D:\maven\secondMaven\target\test-classes[INFO][INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ secondMaven ---[INFO] Surefire report directory: D:\maven\secondMaven\target\surefire-reports-------------------------------------------------------T E S T S-------------------------------------------------------Running net.biancheng.www.AppTestTests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.008 secResults :Tests run: 1, Failures: 0, Errors: 0, Skipped: 0[INFO][INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ secondMaven ---[INFO] Building jar: D:\maven\secondMaven\target\secondMaven-1.0-SNAPSHOT.jar[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time:  2.413 s[INFO] Finished at: 2021-03-04T10:24:32+08:00[INFO] ------------------------------------------------------------------------

9、maven创建一个web项目

我们所接触的 Maven 项目的打包类型只有 JAR 和 POM ,但在现今的互联网时代,我们创建的大部分应用程序都是 Web 应用,在 Java 中 Web 应用的打包方式是 WAR。

创建 Web 应用

通过使用 Maven 的 maven-archetype-webapp 模板可以创建一个简单的 Web 应用。

例如,在命令行窗口执行以下命令,Maven 会为我们创建一个 JavaWeb 应用。

mvn archetype:generate 
-DgroupId=net.biancheng.www 
-DartifactId=mavenWeb 
-DarchetypeArtifactId=maven-archetype-webapp 
-DinteractiveMode=false

maven项目搭建_第22张图片

maven项目搭建_第23张图片

maven项目搭建_第24张图片
maven项目搭建_第25张图片

index.jsp 代码如下。


    
        

Hello World!

打包 Web 应用

Web 应用创建完成后,接下来我们将该应用进行打包成 war 文件,以便将其部署到服务器中。

打开命令行窗口,跳转到 mavenWeb 的目录,执行以下 mvn 命令,对该 Web 应用进行打包。

PS D:\java_springBoot\test06\test_web> mvn clean package
[INFO] Scanning for projects...
[INFO]
[INFO] --------------------------< com.zhl:test_web >--------------------------
[INFO] Building test_web Maven Webapp 1.0-SNAPSHOT
[INFO] --------------------------------[ war ]---------------------------------
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/plugins/maven-war-plugin/3.2.2/maven-war-plugin-3.2.2.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/plugins/maven-war-plugin/3.2.2/maven-war-plugin-3.2.2.pom (9.7 kB at 8.7 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/plugins/maven-war-plugin/3.2.2/maven-war-plugin-3.2.2.jar
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/plugins/maven-war-plugin/3.2.2/maven-war-plugin-3.2.2.jar (91 kB at 157 kB/s)
[INFO]
[INFO] --- maven-clean-plugin:3.1.0:clean (default-clean) @ test_web ---
[INFO]
[INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) @ test_web ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\java_springBoot\test06\test_web\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ test_web ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-resources-plugin:3.0.2:testResources (default-testResources) @ test_web ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\java_springBoot\test06\test_web\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @ test_web ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-surefire-plugin:2.22.1:test (default-test) @ test_web ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-war-plugin:3.2.2:war (default-war) @ test_web ---
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/maven-archiver/3.2.0/maven-archiver-3.2.0.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/maven-archiver/3.2.0/maven-archiver-3.2.0.pom (4.3 kB at 9.5 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/codehaus/plexus/plexus-archiver/3.5/plexus-archiver-3.5.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/codehaus/plexus/plexus-archiver/3.5/plexus-archiver-3.5.pom (4.8 kB at 9.2 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/codehaus/plexus/plexus/5.0/plexus-5.0.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/codehaus/plexus/plexus/5.0/plexus-5.0.pom (21 kB at 30 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/codehaus/plexus/plexus-io/3.0.0/plexus-io-3.0.0.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/codehaus/plexus/plexus-io/3.0.0/plexus-io-3.0.0.pom (4.5 kB at 11 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/commons/commons-compress/1.14/commons-compress-1.14.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/commons/commons-compress/1.14/commons-compress-1.14.pom (13 kB at 23 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/tukaani/xz/1.6/xz-1.6.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/tukaani/xz/1.6/xz-1.6.pom (1.9 kB at 4.3 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/codehaus/plexus/plexus-archiver/3.6.0/plexus-archiver-3.6.0.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/codehaus/plexus/plexus-archiver/3.6.0/plexus-archiver-3.6.0.pom (4.8 kB at 11 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/codehaus/plexus/plexus-io/3.0.1/plexus-io-3.0.1.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/codehaus/plexus/plexus-io/3.0.1/plexus-io-3.0.1.pom (4.5 kB at 11 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/commons/commons-compress/1.16.1/commons-compress-1.16.1.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/commons/commons-compress/1.16.1/commons-compress-1.16.1.pom (16 kB at 29 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/commons/commons-parent/43/commons-parent-43.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/commons/commons-parent/43/commons-parent-43.pom (70 kB at 104 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/objenesis/objenesis/2.6/objenesis-2.6.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/objenesis/objenesis/2.6/objenesis-2.6.pom (2.8 kB at 6.5 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/objenesis/objenesis-parent/2.6/objenesis-parent-2.6.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/objenesis/objenesis-parent/2.6/objenesis-parent-2.6.pom (17 kB at 33 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/com/thoughtworks/xstream/xstream/1.4.10/xstream-1.4.10.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/com/thoughtworks/xstream/xstream/1.4.10/xstream-1.4.10.pom (15 kB at 25 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/com/thoughtworks/xstream/xstream-parent/1.4.10/xstream-parent-1.4.10.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/com/thoughtworks/xstream/xstream-parent/1.4.10/xstream-parent-1.4.10.pom (35 kB at 42 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/xmlpull/xmlpull/1.1.3.1/xmlpull-1.1.3.1.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/xmlpull/xmlpull/1.1.3.1/xmlpull-1.1.3.1.pom (386 B at 767 B/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.pom (1.6 kB at 3.6 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/maven-archiver/3.2.0/maven-archiver-3.2.0.jar
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/codehaus/plexus/plexus-archiver/3.6.0/plexus-archiver-3.6.0.jar
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/codehaus/plexus/plexus-io/3.0.1/plexus-io-3.0.1.jar
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/commons/commons-compress/1.16.1/commons-compress-1.16.1.jar
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/objenesis/objenesis/2.6/objenesis-2.6.jar
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/codehaus/plexus/plexus-archiver/3.6.0/plexus-archiver-3.6.0.jar (191 kB at 256 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/com/thoughtworks/xstream/xstream/1.4.10/xstream-1.4.10.jar
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/codehaus/plexus/plexus-io/3.0.1/plexus-io-3.0.1.jar (74 kB at 84 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/xmlpull/xmlpull/1.1.3.1/xmlpull-1.1.3.1.jar
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/maven-archiver/3.2.0/maven-archiver-3.2.0.jar (24 kB at 26 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.jar
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/objenesis/objenesis/2.6/objenesis-2.6.jar (56 kB at 58 kB/s)
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/commons/commons-compress/1.16.1/commons-compress-1.16.1.jar (560 kB at 466 kB/s)
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/xmlpull/xmlpull/1.1.3.1/xmlpull-1.1.3.1.jar (7.2 kB at 5.4 kB/s)
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.jar (25 kB at 17 kB/s)
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/com/thoughtworks/xstream/xstream/1.4.10/xstream-1.4.10.jar (590 kB at 400 kB/s)
[INFO] Packaging webapp
[INFO] Assembling webapp [test_web] in [D:\java_springBoot\test06\test_web\target\test_web]
[INFO] Processing war project
[INFO] Copying webapp resources [D:\java_springBoot\test06\test_web\src\main\webapp]
[INFO] Webapp assembled in [71 msecs]
[INFO] Building war: D:\java_springBoot\test06\test_web\target\test_web.war
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  17.438 s
[INFO] Finished at: 2022-07-21T15:20:37+08:00
[INFO] ------------------------------------------------------------------------
PS D:\java_springBoot\test06\test_web>

部署到tomcat上:
maven项目搭建_第26张图片

参考:

http://c.biancheng.net/maven2/mirror.html

你可能感兴趣的:(maven,java,intellij-idea)