命令行环境

Maven 中的坐标

1、向量:在 Maven 仓库中唯一地定位到一个 jar 包

(1)groupId:公司或组织的 id

(2)artifactld:一个项目或项目中的一个模块的 id

(3)version:版本号

2、取值方式

(1)groupld:公司或组织域名的倒序,通常加上项目名称

(2)artifactld:模块名称,作为 Maven 工程的工程名

(3)version:模块版本号,根据需要自定义

3、坐标与仓库中 jar 包的存储路径,存在对应关系

 

使用命令生成 Maven 工程

1、命令行转到工程目录

2、mvn archetype:generate

(1)mvn 为主命令

(2)插件与目标使用 : 分隔,子命令的插件可以有多个目标

3、定义

(1)Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 7:(选择 archetype 模式,直接回车,默认值为 7)

(2)Define value for property 'groupId': 指定 groupld(无默认值)

(3)Define value for property 'artifactId': 指定 artifactld(无默认值)

(4)Define value for property 'version' 1.0-SNAPSHOT: : 指定版本号(直接回车,默认值为 1.0-SNAPSHOT)

(5)Define value for property 'package' 上文指定 groupId: : 指定包名(直接回车,默认值为上文指定 groupId)

4、确认

(1)Confirm properties configuration:

(2)groupId: 指定 groupId

(3)artifactId: 指定 artifactId

(4)version: 版本号

(5)package: 包名

(6)Y: :(直接回车,表示确认,若要重新输入,则输入 N,再回车)

 

调整

1、可以删除自动生成

(1)Maven 工程目录\src\main\java\包路径\cmd\App.java

(2)Maven 工程目录\src\test\java\包路径\cmd\AppTest.java

2、工程下的 pom.xml

(1)依赖 junit4

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>3.8.1</version>
    <scope>test</scope>
</dependency>

(2)改为依赖 junit5

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.8.2</version>
    <scope>test</scope>
</dependency>

 

工程目录

1、pom.xml:Maven 核心配置文件

<!-- project 标签:根标签,表示配置、管理当前工程 -->
<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 标签:从 Maven 2 开始,固定 4.0.0.0,代表当前 pom.xml 采用的标签结构 -->
  <modelVersion>4.0.0</modelVersion>

  <!-- 坐标信息 -->
  <!-- groupId 标签:表示公司或组织开发的某个项目 -->
  <groupId>com.king.cmd</groupId>
  
  <!-- artifactId 标签:表示项目下的某个模块 -->
  <artifactId>project01-maven-java</artifactId>
  
  <!-- version 标签:表示当前模块版本 -->
  <version>1.0-SNAPSHOT</version>
  
  <!-- package 标签:表示当前模块打包方式,默认为 jar,表示 Java 工程;取值为 war,表示 Web 工程;取值 pom:说明该工程用于管理其他工程 -->
  <packaging>jar</packaging>

  <name>project01-maven-java</name>
  <url>http://maven.apache.org</url>

  <!-- 在 Maven 中定义属性值 -->
  <properties>
    <!-- 在构建过程中,读取源码时,所使用的字符集 -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <!-- depenencies 标签:配置具体依赖信息,可以包含多个 dependency 子标签 -->
  <dependencies>
    
    <!-- dependency 标签:配置一个具体依赖信息 -->
    <dependency>
      
      <!-- 根据坐标信息,定位、导入 jar 包 -->
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-api</artifactId>
      <version>5.8.2</version>
      
      <!-- scope 标签:配置当前依赖范围 -->
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

 (1)POM:Project Object Model,项目对象模型

(2)和 POM 类似:DOM:DocumentObjectModel,文档对象模型

(3)POM、DOM 都是模型化思想的具体体现

(4)模型化思想:POM 表示将工程抽象为一个模型,再用程序中的对象来描述这个模型,这样就可以用程序来管理项目

(5)POM 理念集中体现在 Maven 工程根目录下 pom.xml 配置文件中

2、src 源码目录

(1)main(主体程序目录)-> java(Java 源代码)-> package 目录、resources(配置文件)

(2)test(测试程序目录)-> java(Java 源代码)-> package 目录、resources(配置文件)

3、target:存放构建操作输出结构结果

4、约定目录结构的意义:Maven 为了让构建过程能够尽可能自动化完成,所以必须约定目录结构的作用

5、约定大于配置,配置大于编码:Maven 对于目录结构这个问题,没有采用配置的方式,而是基于约定,在开发过程中非常方便

 

Java 工程的 Maven 构建命令

1、要求:运行 Maven 构建操作相关的命令时,必须进入到 pom.xml 所在的目录

(1)如果没有在 pom.xml 所在的目录运行 Maven 的构建命令,出现错误信息:The goal you specified requires a project to execute but there is no POM in this directory

(2)mvn- v 命令和构建操作无关,只要正确配置 PATH,在任何目录下都可以执行

(3)构建相关命令要在 pom.xml 所在目录下运行,操作哪个工程,就进入该工程 pom.xml 目录

(3)可以复合操作

2、清理操作

(1)清理 target 目录:mvn clean

(2)清理该项目依赖的本地仓库中的 maven 包,清理 pom.xml 中的包,并重新下载,但不清理不在 pom.xml 中的依赖包:mvn dependency:purge-local-repository

(3)清除某个 jar:mvn dependency:purge-local-repository -DmanualInclude="groupId:artifactId"

(4)清除多个属于不同 groupId 的 jar:mvn dependency:purge-local-repository -DmanualInclude="groupId1:artifactId1,groupId2:artifactId2,……"

(5)阻止 Maven 对已删除的 jar 进行重新解析依赖关系:mvn dependency:purge-local-repository -DreResolve=false

(6)actTransitively 是否应该对所有传递依赖性起作用,默认值为true:mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false

(7)--fail-at-end 忽略错误,对于依赖关系混乱的项目,或依赖于一些内部的仓库:mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false --fail-at-end

(8)清理 Maven 本地仓库中下载失败的包 .bat文件

set REPOSITORY_PATH=本地仓库路径
# rem 正在搜索...
for /f "delims=" %%i in ('dir /b /s "%REPOSITORY_PATH%\*lastUpdated*"') do (
    del /s /q %%i
)
# rem 搜索完毕
pause

 3、编译操作

(1)主程序编译:mvn compile

(2)测试程序编译:mvn test-compile

(3)主体程序编译结果存放目录:target/classes

(4)测试程序编译结果存放目录:target/test-classes

4、测试操作

(1)mvn test

(2)测试报告存放目录:target/surefire-reports

(3)测试之前,自动执行前置操作

(4)surefire-reports 目录:存放测试报告

5、打包操作

(1)mvn package

(2)存放目录:target

6、安装操作

(1)mvn install

(2)mvn clean install:先清理,后安装,确保按照最新源代码进行安装

(3)将本地构建过程中生成的 jar 包,存入 Maven 本地仓库,该 jar 包在 Maven 本地仓库中的路径是根据它的坐标生成的

(4)另外,安装操作还会将 pom.xml 文件,转换为 XXX.pom 文件,存入本地仓库,本质上是同一个文件

7、查看依赖:mvn dependency:list / mvn dependency:tree

 

创建 Maven 版 Web 工程

1、需要专门生成 Web 工程骨架的 archetype

(1)mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -Darchetypeversion=1.4

(2)注意,不能在一个非 pom 的工程下再创建其他工程,即不能在其他 Maven 工程目录下执行(1)

2、目录结构

(1)pom.xml

<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.0</modelVersion>
  <groupId>com.king.cmd</groupId>
  <artifactId>project02-maven-web</artifactId>
  <!-- Web 工程以 war 格式打包 -->
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>project02-maven-web Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <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>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-api</artifactId>
      <version>5.8.2</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <finalName>project02-maven-web</finalName>
  </build>
</project>

(2)src -> main -> webapp -> index.jsp、WEB-INF -> web.xml

3、定义

(1)Define value for property 'groupId': 指定 groupld(无默认值)

(2)Define value for property 'artifactId': 指定 artifactld(无默认值)

(3)Define value for property 'version' 1.0-SNAPSHOT: : 指定版本号(直接回车,默认值为 1.0-SNAPSHOT)

(4)Define value for property 'package' 上文指定 groupId: : 指定包名(直接回车,默认值为上文指定 groupId)

4、确认

(1)Confirm properties configuration:

(2)groupId: 指定 groupId

(3)artifactId: 指定 artifactId

(4)version: 版本号

(5)package: 包名

(6)Y: :(直接回车,表示确认,若要重新输入,则输入 N,再回车)

5、指定目录下

(1)创建 Servlet 类

(2)web.xml 注册 Servlet

(3)index.jsp 页面编写超链接

 

构建命令

1、编译操作

(1)编译前,pom.xml 手动导入 servlet-api 依赖

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

(2)mvn compile / mvn clean compile

2、打包操作:mvn package / mvn clean package

3、测试操作:mvn test

4、查看依赖:mvn dependency:list / mvn dependency:tree

 

部署 Web 工程

1、target 目录下存在 war 包,与war 包的解压目录

2、二选一,部署到 Tomcat 根目录下的 webapps 目录

 

使 Web 工程依赖 Java 工程

1、只有 Web 工程 / Java 工程依赖 Java 工程,Java 工程依赖 Web 工程

(1)本质上,Web 工程依赖的 Java 工程,就是 Web 工程里导入 jar 包

(2)Java 工程的 jar 包,部署在 Web 工程的 WEB-INF/lib 目录下

2、配置对 Java 工程依赖:Web 工程的 pom.xml 中,在 dependencies 标签导入 jar 坐标信息

3、测试

(1)Web 工程 src 目录下,创建 test\java\包路径 目录

(2)确认 Web 工程依赖 junit

(3)创建测试类

(4)mvn test

 

依赖范围

1、标签位置

<dependencies>
    <dependency>
    <scope></scope>
    </dependency>
</dependencies>

2、可选值

(1)compile:默认值,第三方框架 jar 包,在项目实际运行时使用的 jar 包

(2)test:测试过程中使用的 jar 包

(3)provided:在开发过程中需要用到的服务器上的 jar 包,通常以 provided 修饰,provided 范围的 jar 包不参与部署,避免和服务器上已有的同类 jar 包产生冲突,同时减轻服务器的负担

(4)system

(5)runtime

(6)import

3、不同值,表示引入的包,在不同范围下是否可用

  main 目录(空间) test 目录(空间) 开发过程(时间) 部署到服务器(时间)
compile 有效 有效 有效 有效
test 无效 有效 有效 无效
provided 有效 有效 有效 无效

 

依赖的传递性

1、compile:可传递

2、test、provided:不可传递

 

依赖的排除

1、阻止某些 jar 包的传递

(1)避免不同版本传递的 jar 包冲突

(2)避免依赖循环 / 循环引用,报错信息:[ERROR] [ERROR] The projects in the reactor contain a cyclic reference:

2、配置方式

(1)位置:pom.xml 的 dependency 标签中

(2)exclusions 标签配置排除依赖

<exclusions>
    <!-- exclusion标签配置一个具体排除的依赖 -->
    <exclusion>
        <!-- 配置坐标信息,不需要version -->
        <groupId></groupId>
        <artifactId></artifactId>
    </exclusion>
</exclusions>

 

继承

1、本质:子工程的 pom.xml 中的配置,继承父工程中 pom.xml 的配置

2、作用

(1)在父工程中统一管理项目中依赖信息的版本

(2)避免每个模块的依赖信息冲突

(3)同一个框架内的不同 jar 包,统一为同一个版本

(4)保证了整个项目使用规范、准确的 jar 包,节约时间

3、父工程

(1)修改打包方式:<packaging>pom</packaging>

(2)只有打包方式为 pom 的 Maven 工程,才能管理其他 Maven 工程

(3)不写业务代码,专门管理其他 Maven 工程

(4)modules 标签,聚合配置

<!-- 聚合的配置 -->
<modules>
    <module>子工程的artifactId</module>
</modules>

(5)dependencyManagement 标签统一管理依赖信息

<!-- 被管理的依赖没有真正引入到子工程,需要在子工程明确配置具体依赖 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <!-- 子模块坐标信息 -->
            <groupId></groupId>
            <artifactId></artifactId>
            <version></version>
        </dependency>
    </dependencies>
</dependencyManagement>

(6)properties 标签,创建自定义属性标签,引用属性表达式,动态变化 jar 包 version

(7)父工程 properties 格式

<properties>
    <属性名>属性值</属性名>
<properties>

4、子工程

(1)位置:父工程的根目录

(2)创建命令:mvn archetype:generate

(3)子工程 pom.xml 查看父工程

<parent>
    <!-- 父模块坐标信息,子工程、父工程的groupId、version,若相同,可以省略 -->
    <groupId></groupId>
    <artifactId></artifactId>
    <version></version>
</parent>

(4)对于已经在父工程进行管理的依赖,子工程引用时:可以省略 version,则采用父工程中的 version;配置与父工程 version 不一致,则采用子工程 version

(5)properties 标签,创建自定义属性标签,引用属性表达式,动态变化 jar 包 version

(6)子工程引用父工程 properties 格式

<version></version>

5、properties

(1)properties 的属性值可以通过使用符号 ${X} 在 POM 中的任何位置访问,其中 X 是属性名

(2)properties 标签,创建自定义属性标签,引用属性表达式,动态变化 jar 包 version

6、五种不同风格的 properties

(1)env.X:使用 env 来定义变量。将返回 shell 的环境变量。例如,${env.PATH} 包含 PATH 环境变量

(2)注意:虽然环境变量本身在 Windows 上不区分大小写,但查找属性区分大小写。换句话说,虽然 Windows shell 为 %PATH% 和 %Path% 返回相同的值,但 Maven 区分 env.PATH{env.Path}。对于 Maven 2.1.0,为了可靠性,环境变量的名称被归一化为所有大写

(3)project.x:POM中的点(.)记号路径将包含相应元素的值。例如:可以通过 ${project.version} 访问 <project><version>1.0</version></project>

(4)settings.x:settings.xml 中的点(.)标注路径将包含相应的元素的值。例如:<settings><offline>false</offline></ settings> 可通过 ${settings.offline} 访问

(5)Java 系统属性:可通过 java.lang.System.getProperties() 访问的所有属性都可用作 POM 属性,如:${java.home}

(6)x:在 POM 中的 <properties />元素中设置。<properties><someVar>value</someVar></properties> 的值可以用作 ${someVar}

 

聚合

1、在父工程目录下,调用 mvn archetype:generate 创建模块工程,自动完成聚合配置

<!-- 聚合的配置 -->
<modules>
    <module>子工程的artifactId</module>
</modules>

2、作用

(1)很多 Maven 构建命令都可以在总工程中一键执行,并自动按照正确顺序执行

(2)总工程中展示一个列表,总览各个模块工程

posted @   半条咸鱼  阅读(106)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示