Maven实战读书笔记(7)

远程仓库的认证

1、一般来说,远程仓库无须认证就可以访问

2、但有时候出于安全考虑,需要提供认证信息,为了防止非法的仓库访问,管理员为每个仓库提供了一组用户名及密码

3、这时为了让Maven访问仓库内容,就需要配置认证信息

如何配置认证信息?

1、配置认证信息和配置仓库信息不同,仓库信息可以直接配置在POM文件中,但是认证信息必须配置在settings.xml文件中

2、这是因为POM往往是被提交到代码仓库中供所有成员访问的,而settings.xml一般只放在本机。因此,在settings.xml中配置认证信息更为安全

在settings.xml中配置仓库认证信息

<settings>

...

<servers>

<server>

<id>my-proj</id>

<username>repo-user</username>

<password>repo-pwd</password>

</server>

</servers>

...

</settings>

对以上配置信息说明:

1、Maven使用settings.xml文件中并不显而易见的servers元素及其server子元素配置仓库认证信息

2、在该配置中仓库的认证用户名为repo-user,认证密码位repo-pwd

3、这里的关键是id元素,settings.xml中server元素的id必须与POM中需要认证的repository元素的id完全一致,换句话说,正是这个id将认证信息与仓库配置联系在了一起

私服的一大作用之部署第三方构件

1、第三方构件包括组织内部生成的构件,以及一些无法从外部仓库直接获取的构件

2、无论是日常开发中生成的构件,还是正式版本发布的构件,都需要部署到仓库中,供其他团队成员使用

在POM中配置构件部署地址

<project>

...

<distributionManagement>

<repository>

<id>proj-releases</id>

<name>Proj Release Repository</name>

<url>http://192.168.1.100/content/repositories/proj-releases</url>

</repository>

<snapshotRepository>

<id>proj-snapshots</id>

<name>Proj Snapshot Repository</name>

<url>http://192.168.1.100/content/repositories/proj-snapshots</url>

</snapshotRepository>

</distributionManagerment>

...

</project>

对上面的配置进行解释
1、distributionManagerment包含repository和snapshotRepository子元素,前者表示发布版本构件的仓库,后者表示快照版本的仓库

2、发布版本仓库和快照版本仓库都需要配置id、name和url

3、id为该远程仓库的唯一标识,name是为了方便人阅读,关键的url表示该仓库的地址

往远程仓库部署构件需要注意什么?

1、往远程仓库部署构件需要认证

2、在settings.xml中创建一个server元素,id与仓库的id匹配

使用mvn clean deploy

使用mvn clean deploy命令,将项目构建输出的构件部署到配置对应的远程仓库

如果项目当前的版本是快照版本,则部署到快照版本仓库地址,否则就部署到发布版本仓库地址

为什么要区分发布版和快照版呢?

考虑这样一种场景,小张在开发模块A的2.1版本,该版本还未正式发布,与模块A一同开发的还有模块B,它由小张的同事季MM开发,B的功能依赖于A。在开发过程中,小张需要经常将自己最新的构建输出,交给季MM,供她开发和测试调试,问题是,这个工作如何进行呢?

方案一:

让季MM自己签出模块A的源码进行构建。这种方法能够确保季MM得到模块A的最新构建,不过她不得不去构建模块A。多了一些版本控制和Maven操作还不算,当构件失败的时候,她会是一头雾水,最后不得不找小张解决。显然,这种方式是低效的

方案二:

重复部署模块A的2.1版本供季MM下载。虽然小张能够保证仓库中的构件是最新的,但对于Maven来说,同样的版本和同样的坐标就意味着同样的构件。因此,如果季MM在本机的本地仓库包含了模块A的2.1版本构件,Maven就不会再对照远程仓库进行更新。除非她每次执行Maven命令之前,清除本地仓库,但这种要求手工干预的做法显然也是不可取的

方案三:

不停更新版本2.1.1、2.1.2、2.1.3 ... ... 首先,小张和季MM两人都需要频繁地更改POM,如果有更多的模块依赖于模块A,就会涉及更多的POM更改;其次,大量的版本其实仅仅包含了微小的差异,有时候是对版本号的滥用

那么如何解决上述问题?

Maven的快照版本机制就是为了解决上述问题的,在该例中,小张只需要将模块A的版本设定为2.1-SNAPSHOT,然后发布到私服中,在发布的过程中,Maven会自动为构件打上时间戳。比如2.1-20091214.221414-13就表示2009年12月14日22点14分14秒的第13次快照。有了该时间戳,Maven就能随时找到仓库中该构件2.1-SNAPSHOT版本最新的文件,这时,季MM配置对于模块A的2.1-SNAPSHOT版本的依赖,当她构建模块B的时候,Maven会自动从仓库中检查模块A的2.1-SNAPSHOT的最新构件。当发现有更新时,便进行下载。默认情况下,Maven每天检查一次更新 (由仓库配置的updatePolicy控制),用户也可以使用命令行-U参数强制让Maven检查更新,如mvn clean install -U

什么时候变成发布版本,为什么发布版本稳定,快照版本不稳定?

当项目经过完善的测试后需要发布的时候,就应该将快照版本更改为发布版本

例如,将2.1-SNAPSHOT更改为2.1,表示该版本已经稳定,且只对应了唯一的构件,相比之下2.1-SNAPSHOT往往对应了大量的带有不同时间戳的构件,这也决定了其不稳定性

对于快照版本的一些建议

快照版本只应该在组织内部的项目或模块间依赖使用,因为这时,组织对于这些快照版本的依赖具有完全的理解及控制权

项目不应该依赖于任何组织外部的快照版本依赖,由于快照版本的不稳定性,这样的依赖会造成潜在的危险。也就是说,即使项目构建今天是成功的,由于外部的快照版本依赖实际对应的构件随时可能变化,项目的构建就可能由于这些外部的不受控制的因素而失败

时间: 2024-11-05 17:17:55

Maven实战读书笔记(7)的相关文章

Maven实战读书笔记(15)

关于灵活的构建 一个优秀的构建系统必须足够灵活,它应该能够让项目在不同的环境下都能成功地构建. 例如,典型的项目都会有开发环境.测试环境和产品环境,这些环境的数据库配置不尽相同,那么项目构建的时候就需要能够识别所在的环境并使用正确的配置 还有一种常见的情况是,项目开发了大量的集成测试,这些测试运行起来非常耗时,不适合在每次构建项目的时候都运行,因此需要一种手段能让我们在特定的时候才激活这些集成测试,Maven为了支持构建的灵活性,内置了三大特性,即属性.Profile和资源过滤 Maven属性

Maven实战读书笔记(8)

何为Maven的生命周期? 1.Maven从大量项目和构建工具中学习和反思,然后总结了一套高度完善的.易扩展的生命周期 2.这个生命周期包含了项目的清理.初始化.编译.测试.打包.集成测试.验证.部署和站点生成等几乎所有的构建步骤 3.Maven的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,实际的任务(如编译源代码)都是交由插件来完成的 Maven的这种思想与设计模式的模板方法非常相似 模板方法模式在父类中定义算法的整体结构,子类可以通过实现或者重写父类的方法来控制实际的行为,这样

Maven实战读书笔记(3)

POM是什么? 1.像Make的Makefile.Ant的build.xml一样,Maven项目的核心是pom.xml 2.POM (Project Object Model, 项目对象模型) 定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等等 如何编写一个Hello World的POM? 新建一个名为pom.xml的文件,输入内容如下: <?xml version="1.0" encoding="UTF-8"?> <project xm

Maven实战读书笔记(13)

WAR 1.基于Java的Web应用,其标准的打包方式是WAR 2.WAR与JAR类似,不过它包含更多的内容,如JSP文件.Servlet.Java类.web.xml配置文件.依赖JAR包.静态web资源(如HTML.CSS.JavaScript文件)等 一个典型的WAR文件的目录结构 - war / + META-INF / + WEB-INF / | + classes / | | + ServletA.class | | + config.properties | | + ... | |

maven实战读书笔记(1)

Maven这个词的中文翻译是? 可以翻译为"知识的积累",也可以翻译为"专家"或"内行" Maven是啥?干什么的? 1.一个跨平台的项目管理工具 2.Apache组织的一个颇为成功的开源项目 3.Maven主要服务于基于Java平台的项目构建.依赖管理和项目信息管理 4.适合小型的开源类项目.大型的企业级应用 5.适合传统的瀑布式开发.流行的敏捷模式开发 跨平台是指?Maven是跨平台的 无论是Windows.Linux或者Mac上,都可以使用

Maven实战读书笔记(14)

什么是版本管理? 版本管理是指项目整体版本的演变过程管理,如从1.0-SNAPSHOT到1.0再到1.1-SNAPSHOT 什么是版本控制? 版本控制是指借助版本控制工具(如Subversion)追踪代码的每一个变更 什么时候可以将快照版本更新为发布版本 1.所有自动化测试应当全部通过 2.项目没有配置任何快照版本的依赖 3.项目没有配置任何快照版本的插件 4.项目所包含的代码已经全部提交到版本控制系统中 Maven的版本号定义约束 可能有个版本号是这样的,1.3.4-beta-2 Maven的

Maven实战读书笔记(12)- Nexus

Nexus 简介 安装Nexus Nexus的仓库与仓库组 Nexus的索引与构件搜索 配置Maven从Nexus下载构件 部署构件至Nexus Nexus的权限管理 Nexus的调度任务 其他私服软件 小结

Maven实战读书笔记(6)

Maven的坐标和依赖是?构件的逻辑表示方式和物理表示方式是? 1.坐标和依赖是任何一个构件在Maven世界中的逻辑表示方式 2.文件是Maven构件的物理表示方式 3.Maven通过仓库来统一管理这些文件 那么,构件是什么东东? 1.任何一个依赖.插件或者项目构建的输出,都可以称为构件 2.依赖log4j-1.2.15.jar是一个构件 3.插件maven-compiler-plugin-2.0.2.jar是一个构件 4.account-email项目构建完成后输出account-email-

Maven实战读书笔记(18)

代码行统计插件的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/maven-v4_0_0.xsd"> <m