Maven详解

Maven   

Maven简介

  Maven 翻译为"专家"、“内行”,是 Apache 下的一个纯 Java 开发的开源项目。基于项目对象模型(缩写:POM,Project Object Model)概念,Maven利用一个中央仓库能管理一个项目的构建、报告和文档等步骤。
  Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。。
  官网地址:Maven下载地址(官网)

Maven核心功能

一般项目的问题
  1. 需要把jar复制到项目中,繁琐
  2. 项目体积更大,不利于维护
  3. 不利于团队开发

Maven主要有两大核心功能:
  1. 依赖管理。(jar包的管理)
  2. 项目构建。(清理、编译、单元测试、打包、安装、部署、运行)

Maven下载

在这里插入图片描述

配置Maven环境变量

  1.右键我的电脑(或者计算机)-属性-高级系统设置-高级-环境变量-系统变量-新建MAVEN_HOME,值为maven的安装目录
  2.把%MAVEN_HOME%\bin;追加到Path变量的值后面
  3.检验是否成功:cmd-> mvn -v 或 mvn -version
  4.修改配置文件:maven安装目录下conf目录中settings.xml
在这里插入图片描述

配置Maven仓库

  Maven使用仓库管理各种jar包和插件
  Maven仓库分为:本地仓库(local)、远程仓库(remote)两大类
  本地仓库: 本地电脑中的仓库。默认位置为: ${user:home}/.m2/repository
  远程仓库: 远程仓库又包括:中央仓库+私服+其它公共远程仓库 (比如阿里、163等)
  中央仓库:是maven自带的远程仓库,默认地址:Maven自带的远程仓库,由于默认中央仓库的服务器在国外,下载会比较慢,一般需要配置使用国内的公共远程仓库作为中央仓库镜像。注意配置了中央仓库镜像就不再走默认中央仓库
  私服:是架设在本机或者局域网中的一种特殊的远程仓库,通过私服可以方便的管理其它所有的外部远程仓库

配置

<!--第一个位置在根节点下添加本地仓库位置-->
<!--你想要把下载的jar包放在哪-->
<localRepository>D:\Repositories\Maven</localRepository>

<!--第二个位置,在mirrors节点下添加 中央仓库镜像-->
 <mirror>
	      <id>alimaven</id>
	      <name>aliyun maven</name>
	      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
	      <mirrorOf>central</mirrorOf>       
 </mirror> 
<!--第三个位置,在profiles节点下添加 jdk版本全局配置,因为默认为1.5-->
<profile>  
        <id>jdk18</id>  
        <activation>  
            <activeByDefault>true</activeByDefault>  
            <jdk>1.8</jdk>  
        </activation>  
        <properties>  
            <maven.compiler.source>1.8</maven.compiler.source>  
            <maven.compiler.target>1.8</maven.compiler.target>  
            <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>  
        </properties>   
 </profile>

检索顺序:
在这里插入图片描述

Maven常见命令
  • clean 清理编译文件
  • compile 编译文件
  • test 编译并运行test目录的代码
  • package 先编译,在测试,在打包
  • install 安装,包括前面的编译,测试,打包

其他命令
  mvn deploy:部署,部署到私服
  mvn tomcat:run:运行

Maven构建生命周期

  1. Clean:项目构建前的清理操作
  2. Default(Build): 核心生命周期核心过程:编译,测试,运行,打包等等
  3. Site:项目站点文档创建。

Maven POM文件

  POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等
  执行任务或目标时,Maven 会在当前目录中查找 POM。它读取 POM,获取所需的配置信息,然后执行目标
  POM 中可以指定以下配置:
    项目依赖
    插件
    执行目标
    项目构建 profile
    项目版本
    项目开发者列表
    相关邮件列表信息

基本的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/xsd/maven-4.0.0.xsd">
 
    <!-- 模型版本 -->
    <modelVersion>4.0.0</modelVersion>
    <!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.companyname.project-group,maven会将该项目打成的jar包放本地路径:/com/companyname/project-group -->
    <groupId>com.companyname.project-group</groupId>
 
    <!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
    <artifactId>project</artifactId>
 
    <!-- 版本号 SNAPSHOT 快照版  RELEASW  发布版-->
    <version>1.0-SNAPSHOT</version>
  	
  	<!--打包形式 例如jar、war、ear、pom-->
  	<packaging>jar</packaging>
</project>

所有的POM文件都需要project元素和三个必须元素:
   groupid(公司名)
   artifactid(项目名)
   version(版本号)
这三个必须的元素叫做坐标(GAV)
【所有的内容都会生成了一个文件夹,生成的jar包的名字 项目名-版本号

Maven引入外部依赖

  pom.xml 的 dependencies(依赖关系) 列表列出了我们的项目需要构建的所有外部依赖项【相当于平常文件中导入的jar包,每一个jar包对应一个外部依赖】
例: junit-4.12.jar 这个jar包对应的dependencies(依赖关系) 列表中的依赖如下所示

<dependencies>
  		<!--坐标GAV-->
		<dependency>
		  <groupId>junit</groupId>
		  <artifactId>junit</artifactId>
		  <version>4.12</version>
		  <scope>test</scope>
		</dependency>
		
		<!--下面还可以添加多个依赖-->
</dependencies>
IDEA中配置Maven

第一步:安装插件
   Idea自带maven插件,目前Idea不需要安装。
第二步:配置Maven
   在Idea的启动初始界面,打开:Configure–>Settings–>Build,Execution,Deployment–>Maven
如下图
在这里插入图片描述
在这里插入图片描述
第三步:创建Maven工程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

添加依赖

  网搜索依赖进行添加: 推荐网站:搜索添加依赖需要的代码
  示例:

<dependencies>
	<dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.41</version>
    </dependency>
</dependencies>

添加到项目的pom文件内容说明(切换pom.xml到Dependencies目录下):
  type:类型
     取值说明:
       jar:jar包
   Scope:声明jar包的存活时间
  取值说明:
    1、provided:编译和测试时需要,打包和运行不需要 例如servlet-api jsp-api
    2、compile:编译、测试、运行、打包需要 druid dbutils fileupload
    3、runtime:测试、运行、打包需要 mysql驱动
    4、test:测试 例如junit
     5、system:编译和测试时需要,显示引用,Maven不会检索

使用Maven优化项目
  1. 创建项目
  2. 创建java,resources目录
  3. 修改web.xml版本在这里插入图片描述
  4. 把静态资源复制到webapp目录下
  5. pom文件引入全部外部依赖(导入jar包)
  6. 运行 【一般自己配置tomcat】

特殊:安装仓库中没有的jar包
  例:安装ValidateCode.jar包,先找到ValidateCode.jar所在的位置,然后cmd,在输入以下代码,下载包

mvn install:install-file -DgroupId=com.qf -DartifactId=validatecode -Dversion=1.0.0 -Dpackaging=jar -Dfile=ValidateCode.jar
Maven传递依赖
什么是传递依赖

  当项目依赖一个jar包时,与这个jar包关联的其他jar包也会关联到当前项目,这种现象就是传递依赖。
比如A项目依赖B项目,B又依赖C项目, 此时A中也包含了C的依赖
A项目依赖B项目,就相当于把B项目中的jar包导入A项目

传递依赖出现的问题

例如:
  A依赖B,A也依赖C,假如B和C中有相同的jar包,只是版本不一样,但是A只能用一个,这时就会出现问题

解决jar包冲突的方式
  1. 排除原则(常用)
      例如:项目A依赖项目B,如果A不想用B中的某个jar包,就在< dependency > < /dependency >中间加上以下代码,以下代码是去除mysql依赖
<exclusions>
	<exclusion>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
	</exclusion>
</exclusions>
  1. 版本号限定选择(常用)
      方法:
        1.添加属性(jar包的版本号)
        2.版本锁定(指定用那个版本)
        3.依赖管理(导入jar包)
<!-- 标记版本号 -->
 <!--01添加属性-->
    <properties>
        <mysql.version>5.1.42</mysql.version>
    </properties>

    <!--02版本锁定-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
      <!-- 03依赖管理 -->
      <dependencies>
          <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
      </dependencies>
  1. 路径就近原则(基本不用)
  2. 第一声明优先原则(基本不用)

注意:如果是直接依赖,不遵循第一声明原则,后面的会覆盖前面的

传递依赖对依赖范围的影响

  A项目直接依赖 B项目 (最左边一列 A和B的依赖范围)
  B项目直接依赖C 项目 (最上面一行B和C的依赖范围)
  交叉点A和C的依赖范围
在这里插入图片描述
B依赖C为compile,A依赖C,看A依赖B
B依赖C为runtime,A依赖C,看A依赖B
特殊:A依赖Bcompile,B依赖Cruntime,A依赖Cruntime

依赖范围:
A 依赖B,需要再A的pom.xml文件中添加B的坐标,添加坐标时需要指定依赖范围,依赖范围包括:
  (1)compile:编译范围, 编译范围的依赖会在编译,测试,运行,打包(war)都会使用依赖jar包
  (2)provided:提供依赖,provided依赖在编译,测试时需要,运行,打包都不会包含。
  (3)runtime:运行依赖,runtime依赖在运行、测试、打包的需要,但在编译的时候不需要,比如:jdbc的驱动包
  (4)test:测试依赖,在编译和打包时不需要,他们只有在测试编译测试运行时使用, 比如junit,也不会被打包
  (5)system:系统依赖,system依赖与provided类似,但是你必须显示的提供一个对于本地系统中jar文件的路径,需要指定systemPath磁盘路径,system依赖不推荐使用
如图所示:

依赖范围编译测试运行打包(war)例子
compileyesyesyesyesbeanutils、fileupload
testnoyesnonojunit
providedyesyesnonoserlvet-api、jsp-api
runtimenoyesyesyesjdbc驱动
systemyesyesnono本地jar包。maven仓库之外的jar包

注意:
  打包jar包时,不会包含任何依赖包的。
  默认依赖范围:compile
  依赖范围由强到弱的顺序是:compile–>provided–>runtime–>test

分块构建项目
  1. 创建父工程 在父工程中添加依赖,后面的模块都继承父模块,都可以使用jar包
  2. 创建子模块继承父模块
  3. 提交的时候点击父目录中的
聚合和继承

继承
   开发中多个项目有共同的jar包依赖,可以采用继承方式简化各个项目的pom文件,在父类的pom文件中依赖共同拥有的jar。继承是为了消除重复,如果将dao、service、web分开创建独立的工程则每个工程的pom.xml文件中的内容存在重复,比如:设置编译版本、锁定mysql的版本的等,可以将这些重复的配置提取出来在父工程的pom.xml中定义。
注意:
  1.父级项目只能是pom打包方式。

    <packaging>pom</packaging>

  2.子项目是一个Maven Module

<modules>
        <module>xmservice</module>
        <module>xmweb</module>
        <module>xmdao</module>
</modules>

聚合:
项目开发通常是分组分模块开发,每个模块开发完成要运行整个工程需要将每个模块聚合在一起运行,比如:dao、service、web三个工程最终会打一个独立的war运行。
能够把项目的各个模块聚合在一起构建。一般用于分模块开发,最后整体打包发布。

注意:
  1.根项目(模块)是一个pom项目。
  2.子模块:Maven Module
  3.每个模块写完后需要上传到私服
  4.打包,需要整体打包找到最后的war项目使用Tomcat加载

   实际中,我们会将一些庞大的项目拆分为若干模块进行开发
  三层+MVC 如下:
     dao (包含实体类、utils)----------jar
    service------jar
    web----------war

私服

  不同的项目组开发不同的工程,dao工程开发完毕,发布到私服。Service从私服下载dao
  公司在自己的局域网内搭建自己的远程仓库服务器,称为私服,私服服务器即是公司内部的maven远程仓库,每个员工的电脑上安装maven软件并且连接私服服务器,员工将自己开发的项目打成jar并发布到私服服务器,其它项目组从私服服务器下载所依赖的构件(jar)
在这里插入图片描述

搭建私服环境

下载nexus
  Nexus 是Maven仓库管理器,通过nexus可以搭建maven仓库,同时nexus还提供强大的仓库管理功能,构件搜索功能等。下载地址:私服下载地址

安装nexus
  cmd进入bin目录,执行nexus.bat install

卸载nexus
  cmd进入nexus的bin目录,执行:nexus.bat uninstall

启动nexus
方法1:
  cmd进入bin目录,执行nexus.bat start
方法2:
  windows服务中直接启动nexus服务

如何验证启动成功:
  查看nexus的配置文件conf/nexus.properties

# Jetty section
application-port=8081  	# nexus的访问端口配置
application-host=0.0.0.0 	# nexus主机监听配置(不用修改)
nexus-webapp=${bundleBasedir}/nexus 	# nexus工程目录
nexus-webapp-context-path=/nexus	 # nexus的web访问路径

# Nexus section
nexus-work=${bundleBasedir}/../sonatype-work/nexus   # nexus仓库目录
runtime=${bundleBasedir}/nexus/WEB-INF  # nexus运行程序目录

访问:
http://localhost:8081/nexus/

使用Nexus 内置账户admin/admin123登陆:
点击右上角的Log in,输入账号和密码 登陆

在这里插入图片描述
nexus的仓库有4中类型:

  1. hosted,宿主仓库,部署自己的jar到这个类型的仓库,包括releases和snapshot两部分,Releases公司内部发布版本仓库、 Snapshots 公司内部测试版本仓库
  2. proxy,代理仓库,用于代理远程的公共仓库,如maven中央仓库,用户连接私服,私服自动去中央仓库下载jar包或者插件。
  3. group,仓库组,用来合并多个hosted/proxy仓库,通常我们配置自己的maven连接仓库组。
  4. virtual(虚拟):兼容Maven1 版本的jar或者插件
    nexus仓库默认在sonatype-work目录中:
将项目发布到私服
1. 把dao模块上传到私服(如果上述setting.xml文件中配置过再次检查是否配置完整正确):
    第一步:配置私服地址 
            1. 在settings.xml添加:
          <server>
                <id>releases</id>
                <username>admin</username>
                <password>admin123</password>
          </server>
          <server>
                <id>snapshots</id>
                <username>admin</username>
                <password>admin123</password>
          </server>
		2.在当前项目的pom.xml文件添加:【上传哪个,在那个里面添加】
		  <!-- 配置远程发布到私服,mvn deploy -->
              <distributionManagement>
                    <repository>
                        <id>releases</id>
                        <url>http://localhost:8081/nexus/content/repositories/releases/</url>
                    </repository> 
                    <snapshotRepository>
                        <id>snapshots</id>
                        <url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
                    </snapshotRepository> 
                </distributionManagement>
    第二步: 运行 deploy命令,不同开发工具会有差异。
    
    如果所有配置正确,发现上传私服失败,需要进入私服找到指定仓库 
         Repository--- Access Settings--Deployment Policy修改为允许发布
从私服下载jar包
3.service模块从私服下载dao包【一般这个需要配置】
        1.1、在settings.xml文件中
       <profile>
        <id>dev</id>
        <repositories>
            <repository>
                <id>nexus</id>
                <name>nexus</name>
                <url>http://localhost:8081/nexus/content/groups/public/</url>
                <releases>
                    <enabled>true</enabled>
                </releases>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </repository>
        </repositories>
		<pluginRepositories>  
    	<!-- 插件仓库,maven的运行依赖插件,也需要从私服下载插件 -->
        <pluginRepository>  
        	<!-- 插件仓库的id不允许重复,如果重复后边配置会覆盖前边 -->
            <id>public</id>  
            <name>Public Repositories</name>  
            <url>http://localhost:8081/nexus/content/groups/public/</url>  
        </pluginRepository>  
    </pluginRepositories>  
    </profile>
    2.激活私服
		<!-- 激活 -->
<activeProfiles>
  <activeProfile>dev</activeProfile>
</activeProfiles>

注意:
  私服一般安装在内网的其他服务器上,而不是本机上。因此上面的配置中localhost的部分在实际情况中应该修改为公司中内网的私服服务器地址。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值