Java Maven 项目管理

Maven基础

问题

不再支持源选项 5。请使用 8 或更高版本

解决方法:更新plugin(在pom文件中添加配置,并重新加载配置文件)

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version> <!-- 使用最新版本 -->
<configuration>
<source>8</source> <!-- 设置源代码版本为 Java 8 -->
<target>8</target> <!-- 设置目标代码版本为 Java 8 -->
</configuration>
</plugin>
<!-- 其他插件 -->
</plugins>
</build>

简介

资料格式
  • 配置文件(绿色)
  • java代码文件(蓝色)
  • 示例(粉红色)
  • Windows指令 命令(黑色)
概念
问题

jar包不统一,jar包不兼容

工程升级维护操作繁琐

解决办法

Maven

本质(由java写成,思想为面向对象) 其中红色字体的和为maven,上面为我们操作部分

maven本质是一个项目管理工具,将项目开发和管理过程抽象成一个对象管理模型(POM)

POM:项目对象模型

中央仓库<---私服(私服仓库)<---本地(仓库)<---依赖管理(Dependency) <---> 项目对象模型(POM)--->pom.xml

实现原理

构建生命周期(Build lifecycle &phases)<----> 插件(多个)---->jar包或源代码或帮助文档或war包或xml

Maven作用
  1. 项目构建:提供标准的、跨平台的自动化项目构建方式
  2. 依赖管理:方便快捷地管理项目依赖的资源(jar包),避免资源间的版本冲突问题
  3. 统一开发结构:提供标准的、统一的项目结构

Maven的下载与安装

下载

官网:Maven – Welcome to Apache Maven

下载地址:Maven – Download Apache Maven

解压

里面的文件说明

bin:核心运行文件

boot:类加载器

conf:核心配置

lib:依赖的jar包

配置环境

  • 依赖java,需要配置JAVA_HOME
  • 配置MAVEN自身的运行环境,需要配置MAVEN_HOME
配置MAVEN
  1. 在系统变量中新建一个MAVEN_HOME的变量,值为解压之后的Maven文件夹路径地址
  2. 在系统变量中的path中新建一个%MAVEN_HOME%\bin的环境
  3. 在cmd测试有无配置成功,在cmd中输入mvn即可,如下图(不是“不是内部或外部指令,也不是可运行的程序”即可)

基本概念

仓库(用于存储资源,包含各种jar包)

本地仓库

下载之后,放于本地的仓库,为本地仓库(如果本地仓库没有需要用到的jar包,就会去中央仓库或私服仓库获取)

远程仓库
中央仓库

在云端的计算机保存,对应存储jar包的服务器叫做中央仓库,Maven团队,包含99%

私服仓库(速度快)

本地连接私服,私服连接中央仓库

私服仓库的作用:1.中央仓库存放的为开放的开源的资料,不开源的资料上面没有,自己的产品可以放私服中

坐标(对每个资源进行定位)

坐标的概念

Maven中坐标用于描述仓库中资源的位置

官网:Central Repository:

坐标的组成

groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如:org.mybatis)

artifactId:定义当前Maven项目的名称(通常是模块名称,例如:CRM、SMS)

version:定义当前项目的版本号

packaging:定义该项目的打包方式(不属于Maven坐标,但会使用)

书写方式直接在:https://mvnrepository.com/网站搜索后,复制即可

如:

1.打开网站,搜索想要的jar包

2.点击想要的jar包

3.复制下图中Maven中的代码,即为坐标

Maven坐标的作用

使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交由机器完成

本地仓库配置

寻找本地目录

打开命令行,输入mvn回车,会生成一个空的文件夹目录

配置本地目录

  1. 在想要放置本地仓库的位置创建repository文件夹作为本地仓库
  2. 返回Maven的安装目录,打开conf文件夹,里面有一个文件为setting.xml为Maven的设置文件
  3. 打开后,找寻到 标签 localReposity 将其中默认的<localRepository>/path/to/local/repo</localRepository>改为<localRepository>创建的本地仓库的路径</localRepository>

远程仓库的配置

在Maven中lib文件夹随便使用winRAR打开一个jar包,上点一层,回到根下,点击查找文件名为pom*.*

寻找文件pom-4.0.0.xml,选中,点击定位,目录就切至pom-4.0.0.xml所在目录中,打开文件,寻找repositories

URL为真正的来源,国外的服务器,比较慢,可以更改,阿里云有一个镜像仓库,我们可以更改上方的setting.xml,将里面的mirrors里面的改为以下即可

<mirror>
    <!-- 此镜像的唯一标识,用来区分不同的mirror元素 -->
    <id>aliyunmaven</id>
    <!-- 对哪种仓库进行镜像,简单地说就是替代哪一个仓库 -->
    <mirrorOf>central</mirrorOf>
    <!-- 镜像名称 -->
    <name>阿里云公共仓库</name>
    <!-- 镜像URL https://maven.aliyun.com/repository/public 或  https://maven.aliyun.com/nexus/content/groups/public-->
    <url>https://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
或
<mirror>
    <id>aliyunmaven</id>
    <mirrorOf>*</mirrorOf>
    <name>aliyun</name>
    <url>https://maven.aliyun.com/repository/public</url>
</mirror>

全局setting与用户setting区别

全局setting定义了当前计算器中Maven的公共配置

用户setting定义了当前用户的配置

做法:

将setting.xml文件复制到repository目录下进行二次配置为用户setting,可以覆盖全局setting

生成Maven项目

手工制作(目录如下 test为写测试程序,java为写java源代码,resource为写配置文件)

test中可以使用Assert.assertEquals(预计值,真实值);测试程序是否正确,包为:

org.junit.Test

org.junit.Assert

最后配置pom.xml 文件即可

Maven命令(命令行形式,可执行多个命令,用空格隔开即可)

命令

说明

mvn compile

#编译

mvn clean

#清理

mvn test

#测试

mvn package

#打包

mvn install

#安装到本地仓库

测试完成后,surefire-reports文件夹中有测试结果

打包指令执行顺序:编译+测试+打包(保障项目的准确性)

插件创建工程

mvn archetype:generate

idea创建工程

配置Maven

依赖管理

依赖配置(项目所需要的jar包,通过依赖引进项目)

格式

<dependencies>
<dependency>

<--群组id-->
<groupId>junit</groupId>

<--项目id-->
<artifactId>junit</artifactId>

<--版本号-->
<version>3.8.1</version>
<scope>test</scope>
</dependency>

</dependencies>

依赖传递(依赖具有传递性)

将一个项目配置到另一个项目,将项目的坐标复制,添加依赖进去即可,添加后,也可以使用添加项目的依赖,称为依赖传递

直接配置的为直接依赖

间接依赖,被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源

依赖传递中的冲突问题

路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越潜,优先级越高

声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的

特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的

可选依赖(对外隐藏当前所依赖的资源)

在单个依赖中加

<optional>ture</optional>

排除依赖(主动断开依赖的资源,被排除的资源无须指定版本号)

<dependency>
<groupId>被依赖的项目的坐标</groupId>
<artifactId>被依赖的项目的名</artifactId>
<version>被依赖的项目版本号</version>
<exclusions>
<exclusion>
<groupId>需要排除的依赖坐标</groupId>
<artifactId>需要排除的依赖名</artifactId>
</exclusion>
</exclusions>
</dependency>

依赖范围

<scope>范围值</scope>

范围值

说明

test

测试程序范围有效(test文件夹范围内)

provided

主程序和测试程序范围有效,如servlet-api,网站有一个,有的不支持本地的打包上去就崩了,已提供依赖范围。使用此依赖范围的maven依赖对于编译和测试classpath有效,在运行时无效。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行的时候容器已经提供,就不需要重复引入了

compile

默认(都参与)

runtime

只参与打包(如:com.musql.jdbc,在程序中只写了驱动类名)运行时依赖范围。使用此依赖范围的maven依赖对于测试和运行classpath有效,但在编译主代码时无效。典型的例子是JDBC的驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动

system

系统依赖范围。该范围与三种classpath的关系和provider依赖范围完全一致。但是使用system范围的依赖时必须通过systemPath元素显示地指定依赖文件的路径。由于此依赖不是通过maven仓库解析而且与本机系统绑定,可能造成构建的不可移植因此应该谨慎使用。systemPath元素可以引用环境变量

依赖范围(scope)

对于编译classpath有效

对于测试classpath有效

对于运行时classpath有效

例子

compile

Y

Y

Y

spring-core

test

-

Y

-

JUnit

provided

Y

Y

-

servlet-api

runtime

-

Y

Y

JDBC实现

system

Y

Y

-

本地的,maven仓库之外的类库文件

依赖范围的传递性

生命周期与插件

compile--->test-compile--->test--->package--->install--->

三个阶段

clear(清理工作)

default(核心工作,例如:编译、测试、打包、部署等)

site(产生报告,发布站点等)

插件

  • 插件与生命周期进行绑定,在执行到对应的生命周期时执行对应的插件功能
  • 默认Maven在各个生命周期都绑定有预设的功能
  • 通过插件可以自定义其他功能
配置插件

<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>目标</artifactId>
<version>版本号</version>
<executions>
<execution>
<goals>
<goal>jar</goal>
</goals>
<phase>停止时期</phase>
</execution>
</executions>
</plugin>
</plugins>

Maven高级

分模块开发与设计

工程模块与模块划分(接口通信)

聚合(多模块构建维护)快速构建项目

方法

创建一个新工程,管理其他工程(防止某个工程更新后,其他工程没有及时更新,会产生错误等)

该新工程只需要pom.xml文件即可,不需要src等

pom.xml中设计

<!--添加定义该工程用于进行构建管理-->

<packaging>pom</packaging><!--packaging 中默认为jar,pom为聚合工程,war为web工程-->

<!--管理的工程列表-->

<modules>

<!--具体的工程名称-->

<module>../要管理的工程名</module>

<module>../要管理的工程名</module>

<module>../要管理的工程名</module>

<module>../要管理的工程名</module>

</modules>

可以在聚合工程中一起编译操作等(编译的顺序与写入顺序无关,与依赖关系有关,底层依赖先编译)

继承(模块依赖关系维护)简化配置

步骤
  1. 在聚合工程中的pom.xml文件中定义所有要使用的依赖

<!--声明此处进行依赖管理-->

<dependencyManagement>

<!--所有的依赖-->

<dependencies>

<!--具体的依赖-->

<dependency></dependency>

<dependency></dependency>

<dependency></dependency>

<dependency></dependency>

</dependencies>

</dependencyManagement>

  1. 在其他工程中继承(把子工程的版本号全部删除即可)

<!--定义该工程的父工程-->

<parent>

<!--父工程的坐标(如果组织Id相同,子工程可以不写),名称及版本号(版本号尽量与父工程改为一致)-->

<groupId></groupId>

<artifactId></artifactId>

<version></version>

<!--相对路径 直接指向父工程中的pom.xml文件即可-->

<relativePath>../父工程坐标/pom.xml</relativePath>

</parent>

同理,插件管理、项目版本号管理也是一样的,可继承的资源如下:

属性

  • 自定义属性

<properties>
<!--名称可以随意,一般定义为技术名称+version 定义版本号-->
<!--然后在对应版本号中填入${属性名}即可-->
<junit.version>3.8.1</junit.version>
</properties>

<dependencies>
<!--具体依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>

</dependencies>

  • 内置属性(使用maven内置属性快速配置,调用格式${属性名})
  • setting属性(用于动态配置,调用格式${setting.属性名})
  • java系统属性(作用:读取Java系统属性,调用格式:${属性名} 系统属性查询方式:mvn help:system)
  • 环境变量属性(动态配置,调用格式为:${env.属性名},查询方式:mvn help:system)

版本管理

工程版本
SNAPSHOT(快照版本)
  • 项目开发过程中,为了方便团队成员合作,解决模块间相互依赖和时间更新问题,开发者对每一个模块进行构建的时候,输出的临时性版本叫做快照版本
  • 快照版本会随着开发的进展不断更新
RELEASE(发布版本)
  • 项目开发到进入阶段里程碑后,向团队外部发送较为稳定的版本,这种版本所对应的构建文件是稳定的,即使进行功能的后续开发,也不会改变当前发布版本的内容,这种版本称为发布版本
约定规范(<主版本>.<次版本>.<增量版本>.<里程碑版本>)
  • 主版本:表示项目重大架构的变更,如:spring5相较于spring4的迭代。
  • 次版本:表示有较大的功能增加和变化,或者全面系统的修复漏洞。
  • 增量版本:表示有重大漏洞的修复。
  • 里程碑版本:表明一个版本的里程碑(版本内部)

资源配置(pom.xml中设置的属性需要在其他资源文件中使用)

  • 在build中定义资源文件参与这种形式的使用(如果test中也需要,那么可以复制一份,将resources改为testResources,将resource改为testResource,再将对应的路径更改即可)

<!--配置资源文件对应的信息-->
<resources>
<resource>
<directory>文件对应的目录(相对路径)或者${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>

多环境开发配置

  1. 定义多环境

<!--创建多环境-->
<profiles>
<!--定义具体环境-->
<profile>
<!--定义环境的唯一名称-->
<id>produce_env</id>
<!--定义环境中专用的属性值-->
<properties>
<!--写入环境-->
</properties>
</profile>
<!--定义开发环境-->
<profile>
<!--定义环境的唯一名称-->
<id>develop_env</id>
<properties>
<!--写入环境-->
</properties>

<!--设置默认启动-->
<activation>
<activeByDefault>true<!--是否默认启动--></activeByDefault>
</activation>
</profile>

</profiles>

  1. 使用(可以创建新的Maven配置,在运行的位置加-p 加环境id即可,即:mvn 指令 -p 环境定义id)

在调用install时,更改即可

跳过测试(提高开发效率)

应用场景
  • 整体模块功能未开发
  • 模块中某个功能未开发完毕
  • 单个功能更新调试导致其他功能失败
  • 快速打包
  • ···
方法
  • 关闭测试功能,直接在Maven管理中跳过

  • 使用命令-D skipTests
  • 配置跳过测试的文件

<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>

跳过测试扩展(跳过某几个测试或只测试某几个 其中包和文件支持通配符,如以Test结尾的java文件可以写为 *Test.java)

<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<!--包含指定的用例-->
<includes>
<include>包/文件(如果任意包可以改为**/文件)</include>
</includes>
<!--排除指定的用例-->
<excludes>
<exclude>包/文件(如果任意包可以改为**/文件)</exclude>
</excludes>
</configuration>
</plugin>

私服

私服nexus服务器的安装

说明

nexus是Sonatype公司的一款Maven私服产品

下载

Download

启动服务器

输入命令: nuxus /run nexus

访问地址为:http://localhost:8081

更改配置

修改端口号在文件夹etc 中 nexus-default.properties

修改服务器相关配置在bin文件夹中的nuxus.vmoptions

仓库分类

  • 宿主仓库hosted
    • 保存无法从中央仓库获取的资源
      • 自主研发
      • 第三方非开源项目
  • 代理仓库proxy
    • 代理远程仓库,通过nexus访问其他公共仓库,例如中央仓库
  • 仓库组group
    • 将若干个仓库组成一个群组,简化配置
    • 仓库组不能保存资源,属于设计型仓库

资源获取

直接从私服获取即可

资源上传

上传时提供对应的信息

  • 保存的位置(宿主仓库)
  • 资源文件
  • 对应坐标
资源上传与下载
  • 访问私服的用户名和密码
  • 找到setting文件,配置本地仓库访问私服,进去后寻找servers标签,在serves中配置server,指定用户名和密码(servers只能有一个)

<!-- 配置访问服务器的权限,用户名和密码 -->

<servers>

<server>

<!--名称可以自定义,但是可以在私服中统一定义,防止出错-->

<id>suimeng-releases</id>

<!--私服的用户名-->

<username>suimeng</username>

<!--私服的密码-->

<password>suimeng</password>

</server>

<server>

<!--名称可以自定义,但是可以在私服中统一定义,防止出错-->

<id>suimeng-anapshots</id>

<!--私服的用户名-->

<username>suimeng</username>

<!--私服的密码-->

<password>suimeng</password>

</server>

</servers>

  • 配置私服镜像

<!--配置私服镜像,将其他私服屏蔽-->

<mirror>

<id>nexus-suimeng</id>

<mirrorOf>*</mirrorOf>

<url>私服访问地址(在私服中URL可以复制)</url>

</mirror>

更改idea中pom文件的设置

<!--发布的配置管理-->
<distributionManagement>
<!--配置发布版的上传-->
<repository>
<id>与setting中保持一致</id>
<url>发布版的URL</url>
</repository>
<!--配置测试版的上传-->
<snapshotRepository>
<id>与setting中保持一致</id>
<url>测试版的URL</url>
</snapshotRepository>
</distributionManagement>

其中id要与setting中保持一致的原因是:上传时直接访问URL,根据id到本地仓库的setting中寻找用户名和密码(使用deploy上传)

  • 15
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值