meaven怎么下载jar包

JAVA(Maven

根据坐标创建maven工程maven中的坐标使用三个【向量】在【Maven的仓库】中唯一的定位到一个【jargroupId:公司或组织的idartifactId:一个项目或者项目中的一个模块的Idversion:版本号三个向 量的取值方式例如1.0-...

maven将所有依赖和scala源码编译后的结果打包成一个jar-

如果不修改maven的配置文件,无法将用到的依赖打包到jar包里,每次在服务器上运行jar包都需要下载。通过maven-jar-plugin方式打包成可执行jar文件,但是这种方式会将所有依赖(包括外部依赖)单独打包到另外一个指定文件夹下,...

Java之道丨Maven(续)

每次pom.xml配置完后,Alt+F5(项目右键→Maven,Update Project),Maven就会去仓库下载下载完后F5(项目右键→Refresh),就可以在Libraries的Maven Dependencies中看到下载来的jar包了!mvn dependency:sources 下载项目...

maven是干嘛的?知乎

maven的作用是:1、在文件中添加相应的配置,maven就会自动的下载相应的jar包;2、下载依赖,只要配置的j…

Java中使用Maven管理项目实战

package是maven工程的打包命令,对于java工程执行package打成jar包,对于web工程打成war。install install是maven工程的安装命令,执行install将maven打成jar包或war发布到本地仓库。从运行结果中,可以看出: 当后面的...

maven里如果出现冲突依赖,比如log.jar有不同版本冲突,java9如何通过模块化解决呢?知乎

maven里如果出现冲突依赖,比如log.jar有不同版本冲突,java9如何通过模块化解决呢?首先在maven层面不就会报错吗?其次java9模块化以后,某个拥有log.jar的项目其模块文件如果只exports xx.package,按照文…显示全部 ​ 关注...

Maven下载与配置

所以这里,我们改成阿里云提供的镜像仓库,访问国内网站,可以让 Maven jar 包的时候速度更快。注意:*这里我们改的只是为,中央仓库配置一个备用,并不是修改了中央仓库,中央仓库还是国外的,当中央仓库无法访问到的...

我的Java Web之路45-Maven登场-今日头条

groupId和artifactId是Maven定义的用于标识所有工程/项目(实际上就是我们所说的组件/构件/库,或者应用,只要是提供给别人使用的都可以一种物理形态比如JAR文件、WAR文件等存在)的概念,这又体现了对象的唯一标识符问题。...

Java教程:Maven是什么?Maven能用来做什么?

若没有通过maven进行大型项目的依赖管理,我们在开发项目时,需要引入大量的jar包。那么此时,jar包jar包之间很多时候是需要版本匹配的,如果版本不匹配,此时很容易出现版本冲突问题。当使用maven进行项目依赖(jar包)管理,...

如何评价 maven?知乎

➜ ~ gpg - - generate - key 紧 接着 跟着 操作 就 能 生成 秘 钥 , 以下 是 我 的 生成 结果 , 打 了 码 : gpg ( GnuPG / MacGPG 2 ) 2 . 2 . 32 ; Copyright ( C ) 2021 Free Software Foundation , Inc . This is free software : you are free to change and redistribute it . There is NO WARRANTY , to the extent permitted by law . 注意 : 使用 “ gpg - - full - generate - key ” 以 获得 一个 全 功能 的 密钥 生成 对话 框 。 GnuPG 需要 构建 用户 标识 以 辨认 您 的 密钥 。 真实 姓名 : xxxxxxx 电子 邮件 地址 : xxxxxxx @ foxmail . com 您 选定 了 此 用户 标识 : “ xxxxxxxx < xxxxx @ foxmail . com > ” 更改 姓名 ( N ) 、 注释 ( C ) 、 电子 邮件 地址 ( E ) 或 确定 ( O ) / 退出 ( Q ) ? u 更改 姓名 ( N ) 、 注释 ( C ) 、 电子 邮件 地址 ( E ) 或 确定 ( O ) / 退出 ( Q ) ? o 我们 需要 生成 大量 的 随机 字节 。 在 质数 生成 期间 做 些 其他 操作 ( 敲打 键盘 、 移动 鼠标 、 读写 硬盘 之 类 的 ) 将 会 是 一个 不错 的 主意 ; 这 会 让 随机 数 发生 器 有 更 好 的 机会 获得 足够 的 熵 。 我们 需要 生成 大量 的 随机 字节 。 在 质数 生成 期间 做 些 其他 操作 ( 敲打 键盘 、 移动 鼠标 、 读写 硬盘 之 类 的 ) 将 会 是 一个 不错 的 主意 ; 这 会 让 随机 数 发生 器 有 更 好 的 机会 获得 足够 的 熵 。 gpg : 密钥 54 E C 3C 8 FA 3A 5B 50 F 被 标记 为 绝对 信任 gpg : 目录 ‘ / Users / xxxxxxxxx / . gnupg / openpgp - revocs . d ’ 已 创建 gpg : 吊销 证书 已 被 存储 为 ‘ / Users / xxxxxxxxx / . gnupg / openpgp - revocs . d / xxxxxxxxxxxxxxxxxxxxxxxxxxxx . rev ’ 公钥 和 私 钥 已经 生成 并 被 签名 。 pub rsa 3072 2021 - 12 - 06 [ SC ] [ 有效 至 : 2023 - 12 - 06 ] 8 BDxxxxxxxxxxxxxxxxxxxxxxxxxxxxB 50 F uid xxxxxxxx < xxxxxxxx @ foxmail . com > sub rsa 3072 2021 - 12 - 06 [ E ] [ 有效 至 : 2023 - 12 - 06 ] 秘 钥 生成 好 后 , 需要 你 把 公钥 上传 到 公共 服务器 供 sonatype 验证 。 官网 教程 里 有 三 个 地址 可以 用 : keyserver . ubuntu . com keys . openpgp . org pgp . mit . edu 我 按照 官网 给 的 办法 上传 : ➜ ~ gpg - - keyserver pgp . mit . edu : 11371 - - send - keys 8 BD 96 B0 EA 18E 5162 B 9 4 E A 7 F 754 E C 3C 8 FA 3A 5B 50 F gpg : 正在 发送 密钥 54 E C 3C 8 FA 3A 5B 50 F 到 pgp . mit . edu : 11371 gpg : 发送 至 公钥 服务器 失败 : 文件 结尾 gpg : 发送 至 公钥 服务器 失败 : 文件 结尾 ➜ ~ gpg - - keyserver keyserver . ubuntu . com - - send - keys 8 BD 96 B0 EA 18E 5162 B 9 4 E A 7 F 754 E C 3C 8 FA 3A 5B 50 F gpg : 正在 发送 密钥 54 E C 3C 8 FA 3A 5B 50 F 到 hkp : / / keyserver . ubuntu . com gpg : 发送 至 公钥 服务器 失败 : Network is unreachable gpg : 发送 至 公钥 服务器 失败 : Network is unreachable ➜ ~ gpg - - keyserver pgp . mit . edu : 11371 - - send - keys 54 E C 3C 8 FA 3A 5B 50 F gpg : 正在 发送 密钥 54 E C 3C 8 FA 3A 5B 50 F 到 pgp . mit . edu : 11371 gpg : 发送 至 公钥 服务器 失败 : 文件 结尾 gpg : 发送 至 公钥 服务器 失败 : 文件 结尾 但是 , 报 错 了 , 反复 尝试 了 各种 网上 教程 , 依然 报 错 。 我 以为 是 我 网络 的 问题 , 或者 是 那 几 个 服务器 也 失效 了 , 反正 一 遍 遍 的 排查 , 折腾 了 一个 晚上 。 就 当 快要 崩溃 时 , 我 无意 中 发现 gunpg 还是 有 应用 可以 打开 的 , 也 就是 有 GUI 界面 , 于是 我 进去 看 了 看 , 然后 在 我 的 秘 钥 点击 右 键 , 有 上传 的 服务器 的 选项 : 这样 居然 传 成功 了 , 真是 大 无 语 啊 兄弟 们 。 配置 pom . xml 和 setting . xml 第 三 步 , 你 需要 按照 官网 的 教程 , 来 配置 你 的 pom . xml 和 setting . xml 文件 。 大家 看到 这里 已经 很 累 了 , 我 就 不 按照 官网 教程 那样 一 步步 演示 了 , 直接 给 你们 总结 下 成功 需要 添加 的 配置 。 首先 是 setting . xml 。 你 需要 添加 一个 profile : < profiles > < profile > < id > ossrh < / id > < activation > < activeByDefault > true < / activeByDefault > < / activation > < properties > < gpg . executable > gpg 2 < / gpg . executable > < gpg . passphrase > yzdbwj 1993 < / gpg . passphrase > < / properties > < / profile > < / profiles > 还 需要 一个 server , 里面 需要 填写 你 的 ossrh 账号 密码 : < servers > < server > < id > ossrh < / id > < username > 你 上面 注册 的 账号 < / username > < password > 你 上面 注册 的 密码 < / password > < / server > < / servers > < / settings > setting . xml 配置 好 了 , 接 下来 是 你 项目 的 pom . xml 。 首先 , 你 需要 申明 很 多 plugin , 以及 一个 snapshotRepository , 我 把 所有 的 都 贴 在 了 这里 。 < distributionManagement > < ! - - 申明 打包 到 Maven 公有 仓库 - - > < snapshotRepository > < id > ossrh < / id > < url > https : / / s 01 . oss . sonatype . org / content / repositories / snapshots < / url > < / snapshotRepository > < / distributionManagement > < build > < plugins > < plugin > < groupId > org . sonatype . plugins < / groupId > < artifactId > nexus - staging - maven - plugin < / artifactId > < version > 1 . 6 . 7 < / version > < extensions > true < / extensions > < configuration > < serverId > ossrh < / serverId > < nexusUrl > https : / / s 01 . oss . sonatype . org / < / nexusUrl > < autoReleaseAfterClose > true < / autoReleaseAfterClose > < / configuration > < / plugin > < plugin > < groupId > org . apache . maven . plugins < / groupId > < artifactId > maven - source - plugin < / artifactId > < version > 2 . 2 . 1 < / version > < executions > < execution > < id > attach - sources < / id > < goals > < goal > jar - no - fork < / goal > < / goals > < / execution > < / executions > < / plugin > < plugin > < groupId > org . apache . maven . plugins < / groupId > < artifactId > maven - javadoc - plugin < / artifactId > < version > 2 . 9 . 1 < / version > < configuration > < javadocExecutable > $ { java . home } / . . / bin / javadoc < / javadocExecutable > < / configuration > < executions > < execution > < id > attach - javadocs < / id > < goals > < goal > jar < / goal > < / goals > < / execution > < / executions > < / plugin > < plugin > < groupId > org . apache . maven . plugins < / groupId > < artifactId > maven - gpg - plugin < / artifactId > < version > 1 . 5 < / version > < executions > < execution > < id > sign - artifacts < / id > < phase > verify < / phase > < goals > < goal > sign < / goal > < / goals > < / execution > < / executions > < / plugin > < / plugins > < / build > 注意 , 在 maven - javadoc - plugin 这 个 插件 添加 后 , 最 好像 上面 一样 , 加上 一个 官方 教程 没有 提到 的 : < configuration > < javadocExecutable > $ { java . home } / . . / bin / javadoc < / javadocExecutable > < / configuration > 否则 你 可能 会 编译 失败 , 提示 找 不 到 你 的 JAVA _ HOME 环境 变量 , 就 像 下 图 这样 : MavenReportException : Error while creating archive : Unable to find javadoc command : The environment variable JAVA _ HOME is not correctly set . 之后 , 你 还 可以 添加 上 你 的 一些 个人 信息 : < licenses > < license > < name > The Apache Software License , Version 2 . 0 < / name > < url > http : / / www . apache . org / licenses / LICENSE - 2 . 0 . txt < / url > < distribution > actable < / distribution > < / license > < / licenses > < developers > < developer > < name > xxxxxxxxx Yang < / name > < email > xxxxxxxxx @ foxmail . com < / email > < organization > xxxxxxxxxx < / organization > < / developer > < / developers > < scm > < tag > master < / tag > < url > git @ github . com : qqxx 6661 / logRecord . git < / url > < connection > git @ github . com : qqxx 6661 / logRecord . git < / connection > < developerConnection > git @ github . com : qqxx 6661 / logRecord . git < / developerConnection > < / scm > 正式 打包 发布 最后 , 一切 都 准备 好 了 , 你 可以 进行 最 神圣 的 一个 指令 mvn clean deploy 紧 接着 就 上传 成功 了 你 的 工 单 这 时候 也 会 更新 一 条 信息 : Central sync is activated for cn . monitor 4 all . After you successfully release , your component will be available to the public on Central https : / / repo 1 . maven . org / maven 2 / , typically within 30 minutes , though updates to https : / / search . maven . org can take up to four hours . 你 的 Jar 包 会 在 30 分钟 左右 能够 被 拉取 。 下 图 就是 成功 的 截图 拉 。 后记 不 知道 看 完 文章 , 你 觉 不 觉得 麻烦 呢 ? 其实 我 自己 看 一 遍 写 的 文字 , 感觉 步骤 还是 蛮 简单 的 。 但 自己 之前 搞 不定 的 时候 , 还是 感觉 蛮 痛苦 的 。 希望 我 走 的 弯路 , 能 帮 大家 避开 大坑 , 更 快 的 完成 自己 项目 的 上传 。 我 是 目前 在 阿里 搬 砖 的 工程师 蛮 三 刀 酱 。 持续 的 创作 离 不 开 你 的 点 赞 和 转发 分享 ! 参考 https : / / segmentfault . com / a / 1190 000023781503 - END - ​ 赞同 ​ ​ 添加 评论 ​ 分享 ​ 收藏 ​ 喜欢 收起 ​ 更 多 回答 已 认证 帐号 ​ 关注 806 人 赞同 了 该 回答 翻 了 好久 , 终于 又 找到 一个 感 兴趣 的 , 可以 讲 的 科 谱 问题 了 。 看到 各种 求职 啊 打架 啊 变色 的 话题 , 都 没 什么 兴趣 , 就 想 认真 的 试 着 能否 把 一些 概念 和 问题 说 的 简章 直接 一些 。 先 说 一些 题 外 话 , 不 喜欢 的 可以 直接 跳 过 。 最近 其实 很 喜欢 一个 词 , 叫做 “ 上帝 视角 ” 。 什么 叫 上帝 视角 呢 ? 就是 你 要 站 在 一个 创建 者 的 角度 , 去 思考 , 一个 东西 为 什么 会 出现 。 最初 的 这种 方式 是 我 在 硕士 的 时候 训练 了 出来 的 , 很 多 人 会 问 我 说 , 本科 和 硕士 什么 区别 ? 别的 不 都 不 谈 , 单 从 知识 的 角度 来 说 , 本科 是 去 用 , 比如 说 , Http 是 什么 , 而 硕士 去 设计 和 创造 , 要 解决 的 问题 是 : http 现在 还有 什么 地方 不足 的 ? 应该 怎么 改进 ? 被 写 论文 逼疯 的 日子 还是 挺 爽 的 。 也 很 感谢 这 是 那 三 年 时间 , 才 突然 间 发现 , 这 个 世界 原来 并 不是 单纯 的 别人 告诉 我 , 我 就 去 学习 的 , 原来 我 也 可以 尝试 去 改变 和 创造 一个 新 世界 。 虽然 技术 水准 太 渣 , 跟 很 多 真正 的 大 牛 没 办法 比 , 但是 好坏 终于 不 在 和 以前 一样 , 以为 书本 上学 到 的 就是 公理 。 那么 上帝 视角 是 什么 呢 ? 在 学习 的 过程 中 , 不是 单纯 的 去 学 , 去 用 。 拿 Maven 举例 , 不是 单纯 的 去 背 , Maven 的 install , deploy , 生命 周期 , Setting 是 干 嘛 的 , 而是 去 想 : Maven 要 解决 的 问题 是 什么 ? 如果 要 解决 这 个 问题 , 应该 用 什么 样 的 方案 去 实现 ? Maven 现有 的 实现 方式 有 没有 问题 ? 这 才 是 我 一直 推崇 的 学习 的 方式 . 也 是 在 修真 院 的 小 课堂 中 反复 强调 的 目录 模板 . 好 了 , 跳 过 这 一 段 , 片头 稍微 有点 长 . 我们 来 看 一下 , Maven 倒 底 是 什么 东西 , 要 解决 了 什么 问题 . 背景 一 在 maven 之前 , 是 Ant 的 天下 . Ant 是 一个 纯粹 的 编译 工具 , Java 是 需要 编译 的 , 需要 把 源 文件 , 编译 成 二进制 文件 . 背景 二 在 一个 正常 的 系统 中 , 会 引入 大概 三十 到 五 十 个 第 三 方 Jar 包 . 什么 叫 第 三 方 Jar 包 ? 就是 一 把 一些 公共 的 方法 , 编译 过后 的 Class 文件 , 打 成 包 , 让 其他 的 系统 来 使用 . 这 是 一个 常见 的 抽取 公共 代码 的 方法 . 背景 三 在 过去 的 打包 中 , 比如 说 , 你 要 做 一个 网站 程序 , 通常 是 打 出来 一个 War 包 , 里面 会 有 一个 Lib 的 目录 , 在 Lib 目录 下面 , 会 有 各种 各样 的 第 三 方 Jar 包 . 有 了 这 三 个 背景 , 再 看 当初 是 出现 了 什么 问题 . java 的 世界 中 离 不 开 Spring , 怎么 使用 Spring 的 jar 包 ? 通常 是 在 Spring 的 官网 上去 搜 Spring 的 jar 包 , 然后 下载 , 然后 拷贝 到 Lib 库里 . 上传 到 SVN 上 的 时候 , 也 会 通常 把 Lib 库 上传 到 SVN 中 . 这 是 过去 在 没有 maven 的 年代 做 的 事情 . 马丹 , 今天 心情 不好 , 想 不 出来 更 好 的 比喻 , 我 就 直接 讲 事情 了 . 直接 拷贝 Lib 包 会 出现 什么 问题 ? 最大 的 问题 就是 Lib 包 没有 版本 号 . 第 三 方 的 包 都会 升级 , 版本 号 不对 这 是 最 烦 的 一 件 事 . Lib 目录 下 没有 版本 号 的 名字 , 你 哪 知道 现在 用 的 是 哪 一个 版本 ? 所以 这 是 第 一 个 问题 . 第 二 个 问题 , 就是 你 判断 不 了 现在 的 Lib 是不是 对 的 . 会 有 人 手 残 不 知道 为 嘛 改 Lib 包 的 名字 . 第 三 个 问题 , 除了 公用 的 第 三 方 包 , 在 项目 中 还有 自己 的 公用 包 , 版本 升级 很 麻烦 , 一旦 升级 , 所有 的 使用 过 的 项目 , 想 要 升级 , 都 必须 重新 拷 Lib 包 过来 . 这些 问题 , 实现 上 已经 很 严重 了 , 特别 是 , 经常 想 找 一些 第 三 方 包 找 不 到 . 问题 摆 出来 了 , 怎么 解决 ? Maven 在 当时 给 出 的 是 一个 非常 大胆 的 方案 , 从 这 个 角度 来 看 , 和 苹果 的 Appstore 一样 , 是 一个 划 时代 的 改变 . 在 苹果 的 Appstore 出现 之前 , 大家 下载 软件 , 是不是 经常 去 天空 软件 城 之 类 的 下载 网站 一个 个 的 去 下载 ? 有 没有 想 过 会 有 应用 商店 一样 的 东西 , 可以 直接 通过 苹果 系统 的 管理 , 把 本地 的 App 和 远程 的 App 联系 起来 , 标明 版本 号 , 还 可以 自动 更新 ? Maven 其实 提供 的 就是 一个 免费 的 Java 版 AppStore , 确切 的 来 说 , 叫 LibStore . 他 把 当时 知名 的 大 的 第 三 方 jar 包 都 放 到 一个 叫做 中心 仓库 的 东西 , 大家 做 项目 , 直接 去 中心 仓库 下载 就 可以 了 . 现在 看 起来 , 你 可能 会 觉得 , 啊 , 这 不是 理所当然 的 事情 么 ? 可是 在 当时 , 这 可是 具备 划 时代 意义 的 创造 . 把 第 三 方 jar 包 放 到 中心 仓库 的 好处 是 什么 ? 第 一 , 不会 出现 版本 错乱 的 问题 , 也 不会 出现 虚假 jar 包 的 问题 , 因为 所有 的 Jar 包 都 是 从 中心 仓库 拿 到 的 . 第 二 , 不会 出现 版本 一旦 更新 , 我 需要 把 Jar 包 四处 去 拷贝 , 四处 去 跟 人 讲 , 我 的 jar 包 更新 了 , 大家 都 来 下载 一下 最新 包 的 问题 . 单纯 把 Jar 包 放 到 中心 仓库 , 听 起来 是 很 不错 的 方案 , 但是 具体 怎么 落地 实施 呢 ? 首先 . 所有 的 Jar 包 必须 有 一个 惟一 的 ID . 这 个 惟一 的 ID , 怎么 设计 ? 很 多 人 会 说 , 自 增 啊 . . 自 增 个 毛线 . 有 比 自 增 更 好 的 方式 没 ? UUID ? 算 了 , 还 不如 自 增 . 说 时间 缀 的 同学 也 请 做 下 . 说 用 QQ 号 做 惟一 标志 的 同学 请 出去 . 惟一 , 惟一 , 在 这 个 世界 里 , 有 什么 东西 是 惟一 的 ? 身份 证 号 ? 指纹 ? 不行 , 我 要 上网 去 查查 , 怎么 给 惟一 的 东西 编号 . 我 打开 了 浏览 器 , 输入 了 google , 啊 呸 , 输入 了 百度 , 毕竟 要 支持 国产 , 不 好用 也 要 支持 , 等等 , 我 想到 了 . 网址 ! 域名 ! 域名 是 干 嘛 的 ? 给 每 一个 独立 的 网站 都 有 一个 独一无二 的 标记 ! 我 明白 了 , 我们 要 的 不 仅仅 是 惟一 , 更 是 好 记 的 惟一 ! 域名 我们 记得 很 清楚 啊 , 三级 结构 . www . baidu . com . 从 左 到 右 , www 表示 是 网页 , baidu 表示 是 公司 名称 , com 表示 是 公司 . 这种 三级 机构 , 可 不 可以 拿 过来 借鉴 用 做 Jar 的 惟一 标记 ? 首先 , 公司 名 , 是不是 可以 是 惟一 的 ? 有 一个 层级 用来 表示 这 个 Jar 包 属于 公司 , 机构 , 或者 是 个人 , 管 他 呢 . 这 就是 一个 独立 的 , 可以 直接 用 网址 来 代表 公司 名 啊 . 比如 , 就 叫做 org . springframework . 其次 , 一个 公司 里 有 可能 会 提供 多 个 Jar 包 , 每 一个 Jar 包 可以 理解 为 是 独立 的 项目 , 比如 说 , spring - context 最后 . 每 一个 不同 的 项目 会 有 一个 版本 号 , 比如 说 5 . 0 . 8 . RELEASE 现在 , 我们 把 公司 名 - 项目 名 - 版本 号 来 构建 成 了 一个 惟一 又 好 记 的 ID , 他们 可以 用 XML 来 表示 , 就是 这样 的 . < dependency > < groupId > org . springframework < / groupId > < artifactId > spring - context < / artifactId > < version > 5 . 0 . 8 . RELEASE < / version > < / dependency > 其实 简单 的 , 可以 这么 理解 . 5 . 0 . 8 . RELEASE . spring - context . springframework . org 这 就是 一个 从 右 到 左 的 惟一 标记 , 而且 和 域名 一样 , 简单 好 记 ~ ~ 哈哈 哈哈 , 我 果然 是 一个 天才 . 但是 等等 , 这 个 配置 文件 叫做 什么 名字 好 ? Project Object Model , 代表 着 一个 Project , 原本 是 没有 结构 的 , 混乱 的 非 标准 化 的 项目 , 我们 可以 通过 一个 对象 来 把 它 完整 的 描述 出来 , 就 叫做 POM 好 了 ~ ~ 在 POM 里 , 我们 先 做 了 一 件 事 , 只要 我 在 POM 文件 中 声明 了 Dependency , 我 就 知道 了 , 我 应该 去 中心 资源 库 去 下载 到 这 个 jar 包 . 是不是 一个 苹果 版 的 AppStore ! 是不是 应该 去 告 苹果 应用 商店 的 抄袭 ! 是不是 应该 称 我 为 编程 界 的 乔布斯 ( 如果 真是 我 发明 的 Maven 就 好 了 . ) 妈妈 再也 不会 担心 我 用到 假 的 jar 包 了 . 而且 , 我 在 上传 源码 的 时候 , 再也 不 需要 上传 Jar 包 占据 空间 , 每次 Down 代码 要 一个 多 小时 了 . 就 这么 一个 中心 化 的 仓库 , 一下 整个 世界 明朗 了 , 是不是 很 棒 ? 好 了 , 我 得 出门 了 , 等 我 回来 了 , 心情 好 了 , 再 接着 说 , 单纯 只是 做 一个 中心 仓库 , 还 会 出现 什么 问题 , 私服 又 是 什么 , Snapshot 和 Release 又 是 什么 ? 2018 年 9 月 3 号 晚 更新 一次 。 其实 挺 不 开心 的 , 毕竟 认真 写 了 这么 多 东西 , 还 比 不 上 抖 个 机灵 , 而且 总是 遇到 各种 杠 精 。 但是 这 个 号 我 不 怼 人 ~ ~ 只 拉 黑 。 我们 来 接着 说 , 当 中央 仓库 建立 起来 之后 , 举世 欢庆 。 说是 开辟 了 一个 新 时代 也 不 过份 , 其实 IT 行业 经常 是 互相 借鉴 和 致敬 , 所以 Maven 的 中心 仓库 倒 底 是不是 首创 , 还是 Linux 的 apt 更 早 , 不得而知 ( 好 吧 我 承认 不 愿意 花 时间 去 查证 了 。 。 ) 总之 现在 大家 很 开心 , 但是 跟着 又 面临 了 很 多 问题 。 这些 问题 在 没有 中心 仓库 的 时候 不 存在 , 在 有 中心 仓库 的 时候 暴露 了 出来 。 什么 问题 呢 ? 第 一 个 谁 来 负责 在 中心 仓库 上传 Jar 包 呢 ? 第 二 个 如果 在 公司 有 内部 使用 的 Jar 包 , 我 不 想 让 别人 使用 怎么办 呢 ? 第 三 个 全球 都 访问 一个 中心 仓库 ? 那 。 。 。 。 得 有 多 慢 啊 。 是 的 , 这 就是 三 个 问题 。 其实 我 确定 不 了 是 先 有 这 三 个 问题 , 还是 Maven 在 设计 之 初 就 想到 了 。 今天 说 到 的 这些 , 全部 是 我 的 推演 , 是 我 的 理解 , 不 愿意 花 太 多 时间 去 求证 , 始终 不是 一个 好 事情 , 但是 坦白 的 说 。 。 。 我 更 喜欢 这种 过程 。 想 要 解决 上传 Jar 的 问题 , 就是 需要 一个 账户 体系 , 这 是 很 简单 的 。 setting . xml 文件 可以 搞定 一切 。 关键 点 在于 第 二 个 和 第 三 个 。 先 说 第 三 个 , 解决 这种 全球 访问 的 最好 解决 方案 是 什么 ? 如果 你们 了解 DNS 的 话 , 会 发现 DNS 其实 给 出 了 一些 好 的 参考 。 DNS 会 在 全球 有 多 个 根 服务器 。 美国 VeriSign 公司 2 台 美国 PSINet 公司 1 台 美国 ISI ( Information Sciences Institute ) 1 台 美国 ISC ( Internet Software Consortium ) 1 台 美国 马里兰 大学 ( University of Maryland ) 1 台 美国 太空 总署 ( NASA ) 1 台 美国 国防 部 1 台 美国 陆军 研究 所 1 台 挪威 NORDUnet 1 台 日本 WIDE ( Widely Integrated Distributed Environments ) 研究 计划 1 台 网络 管理 组织 IANA ( Internet Assigned Number Authority ) 1 台 欧洲 网络 管理 组织 RIPE - NCC ( Resource IP Europeens Network Coordination Centre ) 1 台 同时 有 递归 服务器 。 这 其实 是 一个 很 好 的 参考 。 而且 我 确信 , 大家 其实 知道 私服 概念 , 应该 是 从 网游 开始 。 我 还 记得 当年 有 同学 自己 搭 了 一个 传奇 私服 , 玩 的 所向披靡 。 CS 当时 也 有 很 多 私服 啊 。 所以 用 在 Maven 上 就 简单 了 。 第 一 是 有 镜像 站点 , 第 二 是 提供 私 服务器 。 私服 服务器 , 我 用 的 最 多 的 就是 Nexus 。 有 了 Nexus , 第 二 个 问题 也 解决 掉 了 。 私服 提供 什么 功能 呢 ? 第 一 个 , 缓存 中心 仓库 的 Jar 包 。 第 二 个 , 缓存 其他 第 三 方 仓库 的 Jar 包 。 第 三 个 , 允许 上传 自己 的 Jar 包 。 这 三 个 功能 就 很 完美 了 ~ ~ ~ ~ 你 想 一下 , 首先 , 私服 往往 是 搭 在 公司 内网 , 在 公司 内网 下 Jar 包 , 很快 的 , 不 信 你 直接 连 中心 仓库 试试 呢 ? 其次 , 公司 里 内部 的 公用 Util 类 , 可以 放心 上传 到 私服 里 啦 。 我 对 Maven 一直 比较 看重 , 就是 喜欢 它 的 设计 思想 。 私服 的 解决 方案 在 这里 我 看 了 是 相对 完美 的 。 但是 , 只有 私服 , 够 么 ? 不 不 不 不 , 对于 追求 极限 的 我们 来 说 , 就算 是 你 在 内网 可以 直接 Down 下来 Jar 包 , 也 不够 ! 怎么 样 可以 更 快 ? 记 不 记得 DNS 里 还有 一个 大 杀 器 , 本地 Host 文件 ? 所以 , 我们 可 不 可以 在 用户 自己 的 机器 上 , 再 来 一个 本地 仓库 ? 当然 可以 ! 这 就是 Repository 的 来历 。 大概 的 示意 就是 这样 的 。 所以 , 当 你 执行 Maven Install 的 时候 , 它 的 顺序 是 什么 呢 ? 就是 先 去 本地 仓库 里 找 , 再 去 私服 里 找 , 再 去 中心 仓库 里 找 。 三 层 结构 , 这 像 什么 ? 这 是 一个 缓存 结构 的 经典 架构 啊 。 二 级 缓存 , 一个 中心 化 的 缓存 集群 , 一个 本地 的 缓存 。 适用 于 变动 不大 的 数据 。 如果 一个 Jar 包 频率 的 变动 , 那 需要 更新 的 缓存 就 太 多 了 。 这 同样 就 引 出来 了 另 一个 问题 : 版本 。 在 说 到 版本 之前 , 先 继续 说 一下 关于 缓存 , 其实 缓存 的 设计 太 多 了 , 生活 中 到处 都 是 。 批发 市场 的 价值 是 什么 ? 小区 周围 的 菜 市场 是 什么 ? 厕所 里 如果 只 放 一 卷纸 , 放 一 没有 了 怎么办 ? 一 种 解决 办法 就是 同时 放 两 卷纸 , 一 卷纸 用 完 之后 再 补充 一 卷纸 上来 , 同样 是 没 纸 了 补充 纸 , 你 永远 都 不会 担心 哪 天 粗心大意 发现 没有 纸 了 ! ( 不要 问 我 为 什么 这么 怨 念 ) 除非 你 在 厕所 一次 用 完 两 卷纸 。 其实 缓存 无处不在 , 有 时候 写 代码 时间 长 了 , 看 这 个 世界 就 会 有 一些 奇奇 怪 怪 的 色彩 。 不外乎 时间 和 空间 两 个 词 而已 。 好 了 , 不 扯 这么 多 了 , 今天 有点 儿 犯困 。 有 了 缓存 , 缓存 的 核心 就 在于 是 失效 策略 。 Maven 的 本地 仓库 , 私服 , 中心 仓库 两 级 缓存 , 怎么 设计 失效 策略 ? 这 就是 Maven 版本 的 设计 , Release 和 Snapshot 的 关键 点 。 如果 emmmm , 心情 好 的 话 , 我 应该 会 再 花 半 个 小时 左右 的 时间 讲 一下 。 结论 是 不 太 喜欢 , 但是 并 没有 很 好 的 解决 方法 。 项目 构建 的 细节 从 提出 这 个 概念 的 那 一 天 开始 就 没有 变 得 简单 过 , 你 可以 抱怨 xml 膨胀 的 缩 进 , 也 可以 嘲笑 别人 不会 使用 eclipse / idea 的 缩 进 规则 偏好 。 但是 从 本质 上来 说 ant 也好 , mvn 也好 , gradle 也好 , 解决 的 无非 都 是 依赖 树 , 打包 规则 , 简单 开发 用 插件 这些 问题 。 遵循 的 人 多 了 , 自然 就 成 了 规则 , 思考 规则 背后 原理 还是 很 重要 的 。 举 个 例子 , 并 不是 所有 人 都 知道 jar 包 的 压缩 规则 以及 目录 结构 。