美文网首页程序员技术干货
maven实战总结:坐标与仓库

maven实战总结:坐标与仓库

作者: mecury | 来源:发表于2017-12-05 21:00 被阅读119次

1.POM文件

<?xml version="1.0" encoding="UTF-8"?>
<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>homethy-whitepages-reptile</groupId>
    <artifactId>homethy-whitepages-reptile</artifactId>
    <version>1.0-SNAPSHOT</version>
</project>

modelVersion:POM 模型的版本

groupId:项目属于哪个组,或哪个组与此有关联

artifactId:定义了项目在Maven中唯一的ID

version:版本号

2.maven主要命令

  • mvn clean complie 编译主代码
  • mvn clean test 编译测试代码,在这之前会编译主代码, 测试资源处理,测试代码编译
  • mvn clean package 打包,默认为jar
  • mvn clean install 将jar安装到maven的本地仓库

第五章 坐标与依赖

1. 坐标详解

```
<dependency>
    <groupId>com.homethy</groupId>
    <artifactId>homethy-crm-search-client</artifactId>
    <version>2.2.0</version>
    <packaging>jar</packaging>
</dependency>
```
  • groupId 定义当前 Maven项目隶属的实际项目
  • artifactId 定义实际项目中的一个 Maven 项目
  • version 定义 Maven 项目所处的版本
  • packaging 定义 Maven的打包的测试,jar 或 war
  • classifier 定义构建输出的一些附属组建

2. service.properties

email.protocol = smtps
email.host = smtp.gmail.com
email.username = you-id@gmail.com
email.password = your-password
email.auth = true;
eamol.systemEmail = your-id@juvenxu.com

在pom.xml中的表现:

    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholder-Configure">
        <properties name="protocol" value="${email.protocol}"/>
        <properties name="host" value="${email.host}"/>
        ....
    </bean>

3. 依赖的配置

<project>
    ...
    <dependencies>
        <dependency>
            <groupId>...</groupId>
            <artifactId>...</artifactId>
            <version>...</version>
            <type>...</type>
            <scope>...</scope>
            <exclusions>
                <exclusion>
                    ...
                </exclusion>
                ...
            </exclusions>
        </dependency>

        ...
    </dependencies>
    ...

</project>
  • groupId, artifactId, version : 依赖的基本坐标
  • type : 依赖的类型,对应packaging
  • scope : 依赖的范围
  • optional : 标记依赖是否可选
  • exclusions : 用来排除传递性依赖

4. 依赖范围 scope

  • compile : 编译依赖范围。如果没有指定,默认使用该依赖范围
  • test : 测试依赖范围, 只针对测试classpath有效,在编译主代码或者运行项目的使用时将无法使用该依赖
  • provided : 已提供依赖范围。使用此依赖,对于编译与测试 classpath 有效,但在运行时无效
  • runtime : 运行时依赖范围。对于测试和运行classpath有效,在编译主代码时无效
  • system : 系统依赖范围。和provided依赖范围完全一致。但必须通过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仓库之外的类库文件

5.传递性依赖
项目依赖一个依赖,该依赖又依赖另外的依赖,该项目虽然直接依赖,但不要单独引入这些依赖。
6.传递性依赖与依赖范围
A-->B-->C
A对于B时第一直接依赖
B对于C时第二直接依赖
A对于C时传递性依赖

第一直接依赖\第二直接依赖 compile test provided runtime
compile compile - - runtime
test test - - test
provided provided - provided provided
runtime runtime - - runtime

7. 依赖调解

A-->B-->C-->X(1.0)

A-->D-->X(2.0)

第一原则:最短路径优先

A-->B-->Y(1.0)

  • 可选依赖:可选依赖不被传递,在项目中显式声明
  • 排除依赖:<exclusions>
  • 归类依赖:使用统一的version来管理版本
    <!--使用<version>${springframework.version}</version>-->
    <properties>
        <springframework.version>2.5.6</springframework.version>
    </properties>
  • 优化依赖

mvn dependency:list : 查看当前项目的依赖

mvn dependency:tree :
mvn dependency:analyze : 分析编译主代码需要用到的依赖

第六章: 仓库

Maven 的世界中,任何一个依赖、插件、或者项目的构建输出,都可以称为构件。Maven中统一存储这些所有Maven构件的地方,称为 Maven仓库

1. 仓库的布局

groupId/artifactId/artifactId-version.packaging

实例:构件路径的生成:groupId=org.testng, artifactId=testng, version=5.8, classifier=jdk15, packageing=jar                             
1\.基于groupId:org/testng  
2\.基于artifactId: org/testng/testng  
3\.使用版本信息:org/testng/testng/5.8  
4\.使用连接符‘-’,artifactId-version  
org/testng/testng/5.8/testng-5.8        
5\.若有classifier  
org/testng/testng/5.8/testng-5.8-jdk5   
6\.检查构件的extension,它由packaging决定,生成的最终路径为  
org/testng/testng/5.8/testng-5.8-jdk5.jar  

2.仓库的分配

  • 本地仓库
  • 远程仓库:中央仓库,私服,其他仓库
  1. 中央仓库
    Maven必须知道至少一个中央仓库
  2. 私服
    特殊的中央仓库,部署在局域网的仓库服务。私服不存在该构件时,由外部的远程仓库下载。

3.远程仓库的配置
配置 POM 使用仓库

    <repositories>
        <repository>
            <id>jboss</id>
            <name>JBoss Repository</name>
            <url>http://repository.jboss.com/maven2/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
  • repository : 声明一个远程仓库
    • id : 一个仓库的id,唯一
    • name : 仓库名称
    • url : 仓库地址
    • release : 控制对于发布版本构件的下载
      • enable : 开启仓库对于发布版本构件下载的支持
      • checksumPolicy : 控制校验文件的策略
        • warn : 默认,Maven在验证时输入警告信息
        • fail : 校验错误使构建失败
      • updatePolicy :
        • daily
        • never
        • always
        • interval : 跟时间,每个多少分钟更新一次
    • snapshots : 控制对于快照版本构件的下载支持
      • enable :
      • checksumPolicy :
      • updatePolicy :

4.远程仓库的认证
在setting.xml文件中配置仓库认证信息

<servers>
    <server>
        <id>my-proj</id>
        <username>repo-user</username>
        <password>repo-pwd</password>
    </server>
</servers>
  • server
    • id : 仓库定义时在 repository 中设置的 id
    • username
    • password

5.部署至远程仓库

    <distributionManagement>
        <repository>
            <id>proj-release</id>
            <name>Proj Release Repository</name>
            <url>http://192.168.1.100/content/repositories/proj-releases</url>
        </repository>
        <snapshotRepository>
            <id>proj-snapshot</id>
            <name>Proj Snapshot Repository</name>
            <url>http://192.168.1.100/content/repositories/proj-snapshot</url>
        </snapshotRepository>
    </distributionManagement>

mvn clean install 将构件部署到远程仓库

  • repository : 配置发布构件部署
  • snapshotRespository : 配置快照版本构件部署
  • id : 远程仓库的唯一id
  • name : 为了方便人阅读
  • url : 仓库地址

6.快照版本
快照版本在每次发布的时候Maven都会都会为其打上时间戳,在执行
mvn clean install -U
的时候,会从仓库中找到最新的快照版本

7.从仓库中解析依赖的机制

  1. 当依赖的范围为system的时候,Maven 直接从本地系统中解析构件。
  2. 根据路径先由本地仓库寻找构件,存在则解析成功
  3. 若本地不存在相应的构件,依赖的版本又是发布版本构件,则遍历所有的远程仓库,发现后,解析并使用。
  4. 若依赖为RELEASELATEAST,则基于更新策略读取所有的远程仓库的元数据(groupId/artifactId/version/maven-metadata.xml),将其与本地仓库的对应元数据合并后,计算RELEASELATEAST的值, 基于这个值去检查本地与远程仓库
  5. 若依赖为snapshot,则基于更新策略读取所有的远程仓库的元数据(groupId/artifactId/version/maven-metadata.xml),将其与本地仓库的对应元数据合并后,得到快照的值,基于这个值检查本地与远程
  6. 如果最后解析的为时间戳格式的snapshot如:1.4.1-20091104,则复制其时间戳格式到非时间戳格式SNAPSHOT,并使用非时间戳的构件

8. 镜像

若仓库 X 能提供 仓库 Y 存储的所有内容,则称 X 为 Y 的镜像,合适的镜像往往速度更快。
配置私服镜像settings.xml:

<mirrors>
    <mirror>
        <id>internal-repository</id>
        <name>Internal Repository Manager</name>
        <url>http://192.168.1.100</url>
        <mirrorOf>*</mirrorOf>
    </mirror>
</mirrors>
  • id : 仓库id, 唯一
  • name : 方便阅读
  • url : 仓库地址
  • mirrorOf
    • <mirrorOf> * </mirrorOf> : 匹配所有的仓库
    • <mirrorOf> external:*</mirrorOf> : 匹配所有仓库,使用localhost的除外,即排除本机
    • <mirrorOf> repo1, repo2 </mirrorOf> : 匹配仓库 repo1, repo2
    • <mirrorOf> *, !repo1 </mirrorOf> : 匹配所有仓库,repo1除外

9.仓库的搜索服务

  • Sonartype Nexus
    提供结果共构件的坐标及其所属仓库
  • Jarvana
    提供浏览构件内部的内容
  • MVNbrowser
    显示构件依赖的构件
  • MVNrepository
    显示各个构件的版本变化

相关文章

  • maven实战总结:坐标与仓库

    1.POM文件 modelVersion:POM 模型的版本 groupId:项目属于哪...

  • Maven坐标与仓库

    2.1 Maven坐标 Maven通过下面几个元素定义坐标:groupId、artifactId、version、...

  • Maven实战之Maven仓库

    Maven实战之Maven仓库 Maven仓库作用 仓库,顾名思义就是存放物品的地方。在Maven中,我们可以将其...

  • 2022-06-05 Maven基础知识(2)- Maven 坐

    Maven 坐标、Maven 外部依赖、Maven 仓库 查看内容请点击下面的链接: https://www.cn...

  • Maven实战之坐标及依赖

    Maven实战之坐标及依赖 坐标 坐标的含义 现实生活中的坐标是用来定义一个地点的,Maven中的坐标是用来定义一...

  • Maven 仓库和坐标

    ① pom.xml:Project Object Model 项目对象模型,这是 Maven 的核心配置文件,所有...

  • java jar生成maven坐标

    使用本地maven仓库地址,配合需要生成jar名进行匹配坐标

  • maven笔记

    文件目录 src 常用指令 maven坐标和仓库 maven生命周期 pom.xml常用元素介绍 project ...

  • Maven实战笔记-坐标

    坐标(Coordinate)用来唯一标识 Maven 构件。坐标元素例子: groupId:定义当前 Maven ...

  • Maven的核心概念

    一、Maven坐标和仓库   Maven坐标是一个唯一的标识,用于表示我们的项目的一些信息或者引用jar包的位置。...

网友评论

    本文标题:maven实战总结:坐标与仓库

    本文链接:https://www.haomeiwen.com/subject/mahhixtx.html