Maven 配置

jefxff 153,631 2020-04-30

1. maven Windows下快速配置

  • 下载maven

  • 配置环境变量

    • windows操作系统

      • 配置 MAVEN_HOME : maven的安装目录

      • 增加 Path: ;%MAVEN_HOME%\bin

  • 重启电脑

  • 检测是否安装成功

    • mvn --version

2. maven 的作用

  • 管理Jar

    • 增加第三方Jar

    • 解决jar包之间的依赖关系(自动关联下载所有依赖的Jar, 并且不会冲突)

  • 将项目拆分成若干个模块


3. maven 的概念及功能

说明: 是一个基于JAVA平台的自动化构建工具, 目前最新的构建工具是gradle

  • 自动化构建工具 maven: 将原材料(java, js, css, html, image ...) --> 产品(可发布的项目)

3.1 maven的功能

  • 清理: 清空删除编译的结果, 为重新编译做准备

  • 编译: java -> class

  • 测试: 针对于项目中的关键点进行测试, 也可用项目中的测试代码取测试开发代码

  • 报告: 将测试的结果进行显示

  • 打包: 将项目中包含的多个文件压缩成一个文件, 用于安装或部署

  • 安装: 将上一步打成的包放在本地仓库, 供其他项目使用

  • 部署: 将打成的包放在服务器上准备运行


3.2 maven 仓库

说明: jar包下载流程:先在本地仓库中下载, 如果本地仓库中不存在, 则在联网到中央仓库(镜像)去下载

  • maven仓库的分类

    • 本地仓库

    • 远程仓库

      • 中央仓库

      • 中央仓库镜像(对中央仓库的分流)

      • 私服

      • 其他公共库

  • 本地仓库详解

    • 本地仓库,顾名思义,就是Maven在本地存储的地方。

    • maven的本地仓库,在安装maven后并不会创建,它是在第一次执行maven命令的时候才被创建

    • maven本地仓库的默认位置:无论是Windows还是Linux,在用户的目录下都有一个.m2/repository/的仓库目录,这就是Maven仓库的默认位置

    • 默认的本地仓库: C:/Users/jefxff/.m2/repository

    • 可以通过在maven/conf/settings.xml 中的 标签里修改本地仓库的目录

    <settings>
    	<!-- <localRepository>修改后的本地仓库目录</localRepository> -->
      <localRepository>D:/Program Files (x86)/Maven/repository</localRepository>
    </settings>
    
  • 远程仓库-中央仓库详解

    • 最核心的就是中央仓库,中央仓库是默认的远程仓库,maven在安装的时候,自带的就是中央仓库的配置,可以通过修改setting.xml文件来修改默认的中央仓库地址

    • 中央仓库包含了绝大多数流行的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等。一般来说,简单的Java项目依赖的构件都可以在这里下载到

    <repositories>
        <repository>
          <id>central</id>
          <name>Central Repository</name>
          <url>http://repo.maven.apache.org/maven2</url>
          <layout>default</layout>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </repository>
      </repositories>
    

4. 使用 maven

说明: maven是 约定 优于 配置的原则

4.1 maven 约定 的目录结构

  • src

    • main : 程序功能代码

      • java -java源代码文件

      • resources -资源库

      • webapp
        * WEB-INF
        * index.jsp
        * Css、js

      • Bin - 脚本库

      • config - 配置文件

      • Filters - 资源过滤库

    • test : 测试代码

      • java -java测试源代码文件

      • resources - 测试资源库

      • filters - 测试资源过滤库

    • pom.xml - 项目对象模型

  • target - 存放项目构建后的文件和目录,比如jar包,war包,编译的class文件等


4.2 maven核心pom文件(Project Object Model,项目对象模型)


4.2.1 pom

  • pom代表项目对象模型,它是Maven中工作的基本组成单位。它是一个XML文件,始终保存在项目的基本目录中的pom.xml文件中。pom包含的对象是使用maven来构建的,pom.xml文件包含了项目的各种配置信息,需要特别注意,每个项目都只有一个pom.xml文件。

4.2.2 项目配置信息

  • project:工程的根标签

  • modelVersion:pom模型版本,maven2和3只能为4.0.0

  • groupId:这是工程组的标识。它在一个组织或者项目中通常是唯一的。例如,一个银行组织 com.companyname.project-group 拥有所有的和银行相关的项目。

  • artifactId:这是工程的标识。它通常是工程的名称。例如,消费者银行。groupId 和 artifactId 一起定义了 artifact 在仓库中的位置

  • version:这是工程的版本号。在 artifact 的仓库中,它用来区分不同的版本

  • packaging:定义 Maven 项目的打包方式,有 JAR 、WAR 和 EAR 三种格式


4.2.3 最小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.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.xdclass</groupId>
	<artifactId>demo</artifactId>
	<version>1.0-SNAPSHOT</version>
	</project>

4.2.4 super pom

  • 父(Super)POM是 Maven 默认的 POM。所有的 POM 都继承自一个父 POM(无论是否显式定义了这个父 POM)。父 POM 包含了一些可以被继承的默认设置。因此,当 Maven 发现需要下载 POM 中的 依赖时,它会到 Super POM 中配置的默认仓库 。

  • 使用以下命令来查看 Super POM 默认配置:

	mvn help:effective-pom

4.2.5 依赖配置信息

  • dependencies

    • 依赖的传递性: A.jar -> B.jar -> C.jar; 要使A.jar -> C.jar : 当且仅当 B.jar 依赖于 C.jar 的范围是 compile

    • 依赖的原则:(为了防止冲突)

      • 路径最短优先原则

      • 路径长度相同:

        • 在用一个 pom.xml 文件中有2个相同的依赖(覆盖), 后面声明的依赖会覆盖前面声明的依赖

        • 如果是不同的pom.xml 中有2个相同的依赖(优先), 则先声明的依赖会覆盖后声明的依赖

	<dependencies>
	 	<dependency>
	        <groupId>junit</groupId>
	        <artifactId>junit</artifactId>
	        <version>4.12</version>
	 	</dependency>
	</dependencies>
  • parent: 此标签用于在子pom.xml里面定义父pom.xml 的 G A V 坐标; 实现继承, 在子类的 dependencies 里面还需要通过 G V 来申明使用父类的那些依赖(即: 通过继承方便统一管理依赖的版本)

    • groupId: 父项目的组Id标识符

    • artifactId:父项目的唯一标识符

    • relativePath:(从当前的pom.xml 到 父 pom.xml 的相对路径)Maven首先在当前项目中找父项目的pom,然后在文件系统的这个位置(relativePath),然后在本地仓库,再在远程仓库找。

    • version: 父项目的版本

    	<parent>
    	     <groupId>xd.class<groupId>
    	     <artifactId>demo-parent</artifactId>
    	     <relativePath>/</relativePath>
    	     <version>1.0</version>
    	</parent>
    
  • modules : 配置聚合(必须在总工程中,打包方式是pom.xml)

    • 有些maven项目会做成多模块的,这个标签用于指定当前项目所包含的所有模块。之后对这个项目进行的maven操作,会让所有子模块也进行相同操作

    • Maven 可以将一个大工程拆分成若干个子工程(子模块); 而聚合可以将拆分的多个子工程合起来

    <!-- 聚合的配置, 只能配置中打包方式是pom的项目中 -->
    <!-- 配置聚合, 避免前置工程的install操作 -->
     <modules>
     	<!-- 项目的根路径 -->
        <module>../maven1</module>
        <module>../maven2</module>
        <module>../maven3</module>
     </modules>
     <!-- 优势: 1. 如果 maven3依赖于maven2或者maven1, 那么对maven3执行的操作, 在操作之前会先对 maven1/2 进行操作 -->
     <!--       2. 对总工程pom.xml执行的maven操作会同时作用于他下面的所有模块 -->
    
  • properties

    • 用于定义pom常量
    	<properties>
        <java.version>1.7</java.version>
    	</properties>
    
    • 上面这个常量可以在pom文件的任意地方通过${Java.version}来引用
  • dependencyManagement

    • 应用场景

      • 当我们的项目模块很多的时候,我们依赖包的管理就会出现很多问题,为了项目的正确运行,必须让所有的子项目使用依赖项的同一版本,确保应用的各个项目的依赖项和版本一致,才能保证测试的和发布的是相同的结果。
    • 使用的好处

      • 在父模块中定义后,子模块不会直接使用对应依赖,但是在使用相同依赖的时候可以不加版本号,这样的好处是,可以避免在每个使用的子项目中都声明一个版本号,这样想升级或者切换到另一个版本时,只需要在父类容器里更新,不需要任何一个子项目的修改
        父项目:
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                    <version>4.2.0</version>
                    <scope>test</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        子项目1:
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
    
        子项目2:
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
    
        子项目3:
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>5.0</version>
        </dependency>
    
    • 和dependencies的区别

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

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

  • 通过 pom.xml 来更改JDK版本

		<profiles>
		    <profile>
		      <id>jdk-8</id>
		      <activation>
		        <activeByDefault>true</activeByDefault>
		        <jdk>1.8</jdk>
		      </activation>
		      <properties>
		        <maven.compiler.source>1.8</maven.compiler.source>
		        <maven.conpiler.target>1.8</maven.conpiler.target>
		        <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
		      </properties>
		    </profile>
		  </profiles>
  • pom.xml 统一版本(在 properties 中指定值, 在下面就可以使用类似于EL表达式一样使用 ${定义的属性})
	  <properties>
	    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	    <maven.compiler.source>1.8</maven.compiler.source>
	    <maven.compiler.target>1.8</maven.compiler.target>
	    <junit-version>4.11</junit-version>
	  </properties>

5. 常用的maven基本命令

5.1 常用命令

  • mvn validate 验证项目是否正确

  • mvn package maven打包, 打成jar/war包

  • mvn generate-sources 生成源代码

  • mvn compile 编译 -- 只编译 main 目录中的Java文件

  • mvn test-compile 编译测试代码

  • mvn test 运行测试

  • mvn verify 运行检查

  • mvn clean 清理项目; 删除 target 目录, 并不会删除 install 在本地仓库的文件

  • mvn install 将开发的模块放入本地仓库, 供其他模块使用

  • mvn deploy 发布项目到远程仓库

  • mvn dependency:tree 显示Maven依赖树

  • mvn dependency:list 显示Maven依赖列表


5.2 常用参数

  • -D 指定参数,如 -Dmaven.test.skip=true 跳过单元测试;

  • -P 指定 Profile 配置,可以用于区分环境;


5.2 web相关命令

  • mvn tomcat:run 启动tomcat

  • mvn jetty:run 启动jetty

  • mvn tomcat:deploy 运行打包部署

6. 部署 web 工程

  • 创建 web 项目后, 在实施部署时, 第一种情况就是通过package打成war包, 放在tocmat/webapps中运行

  • 通过maven直接部署运行web项目:

    • 需要在 pom.xml 中配置 cargo 插件

    • 通过maven命令: deploy


# Java # JavaWeb