ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

后端笔记之Maven配置以及解决Maven中央仓库没有的依赖

后端笔记之Maven配置以及解决Maven中央仓库没有的依赖 下一篇后端架构笔记之Maven多模块与微服务一、Maven配置区别自定义 Maven 和 IDE 捆绑 Maven拉取依赖的「来源」是一样的都是远程仓库但「拉取效率、配置灵活性」有区别拉取来源两者默认都是从 Maven 官方中央仓库拉取但自定义配置里加了阿里云镜像所以实际是从阿里云拉速度快而 IDE捆绑的 Maven 如果用默认配置是从官方中央仓库拉速度慢。核心差异不只是速度自定义 Maven 还能自由改本地仓库位置、加私服认证、配代理等IDE 捆绑的 Maven配置更固定想改这些得手动调整用户目录下的 settings.xml。简单说拉取的依赖内容是一样的但自定义 Maven 能通过配置让拉取过程更高效、更贴合你的使用习惯。1、 区别最大区别控制权归属1自定义 Maven手动安装版你完全掌控 Maven 的版本、配置文件和本地仓库位置。你可以随时升级、更换 Maven 版本也可以修改 settings.xml 来配置镜像、代理等不受 IDE 更新的影响。2IDE 捆绑 MavenMaven 的版本和基础配置由 IDE 决定你只能在 IDE 提供的范围内调整。当 IDE 更新时内置 Maven 也可能被自动更新可能引发兼容性问题。2、拉取依赖能力这两种配置拉取依赖的能力是完全一样的。1能否拉取到某个依赖只取决于 settings.xml 中配置的镜像源比如阿里云镜像、中央仓库而不是 Maven本身是自定义的还是 IDE 捆绑的。2 自定义配置的优势在于可以更方便地修改镜像源让依赖下载速度更快但这并不代表能拉取到更多依赖。3、仓库大小与依赖数量的关系1本地仓库的大小是由项目中实际用到的依赖数量和大小决定的和 Maven 是自定义还是 IDE 捆绑无关。2不管用哪种配置只要是同一个项目下载的依赖都是一样的仓库大小也会是一样的。二、settings.xml 配置只要 IDE 里指定了这个 settings.xmlMaven 就会按这个规则运行。settings.xml 里关于镜像源配置核心配置mirrors!-- 阿里云镜像重点 --mirroridalimaven/id!-- 镜像唯一标识随便起但不能重复 --namealiyun maven/name!-- 镜像名称仅说明用 --urlhttp://maven.aliyun.com/nexus/content/groups/public//url!-- 阿里云镜像地址 --mirrorOfcentral/mirrorOf!-- 表示替代 Maven 官方中央仓库 --/mirror!-- 禁用 HTTP 外部仓库安全配置 --mirroridmaven-default-http-blocker/idmirrorOfexternal:http:*/mirrorOf!-- 匹配所有 HTTP 协议的外部仓库 --urlhttp://0.0.0.0//url!-- 无效地址相当于禁用 --blockedtrue/blocked!-- 明确标记禁用 --/mirror/mirrors阿里云镜像的作用Maven 官方中央仓库在国外下载依赖慢且容易失败配置阿里云镜像后Maven会从国内的阿里云服务器下载依赖速度提升几十倍。禁用 HTTP 仓库的作用强制使用 HTTPS 协议下载依赖避免 HTTP 协议的安全风险比如依赖包被篡改。三、达梦数据库的 JDBC 驱动达梦驱动属于商业软件的依赖达梦数据库的 JDBC 驱动既没上传到 Maven 中央仓库中央仓库只有公共开源的依赖也没上传到阿里云等公共镜像仓库所以不管是从中央仓库还是阿里云仓库下载时会提示 “找不到”它。DmJdbcDriver18还是其他版本的达梦驱动都无法直接从中央仓库或阿里云等公共镜像仓库下载必须通过以下方式获取1从达梦数据库的安装目录中提取驱动 Jar 包通常在drivers/jdbc文件夹下或者官网提供jar包达梦驱动下载路径2手动将 Jar 包安装到本地 Maven 仓库用mvn install:install-file命令3若企业有私有 Maven 仓库可将驱动上传到私有仓库后再引入。1、新建lib文件夹在父项目根目录下新建一个名为 lib 的文件夹。2、复制jar包把 DmJdbcDriver18.jar 复制到这个新建的 lib 文件夹里。3、配置 system 依赖失败system 依赖不适合多模块项目如果项目没有拆分多模块可以使用该方法。(1) 修改父 pom.xml里的 DM8 依赖配置替换成下面这个本地 jar 包的写法!-- 本地达梦DM8驱动 --dependencygroupIdcom.dameng/groupIdartifactIdDm8JdbcDriver18/artifactIdversion8.1.2/versionscopesystem/scopesystemPath${project.basedir}/lib/DmJdbcDriver18.jar/systemPath/dependency${project.basedir}是 Maven 内置变量指向父项目根目录能保证路径在任何环境下都正确。问题因为该项目是多模块结构子模块会继承父项目的驱动依赖。所以父模块用${project.basedir}/lib/DmJdbcDriver18.jar配置 DM8 的 system 依赖时子模块如 base会继承该依赖然后${project.basedir}会指向子模块自身目录导致 Maven 去E:\project\back\base\lib找驱动实际驱动在父模块E:\project\back\lib从而报错。(2) 配置 Maven 打包时包含 system 依赖默认情况下Maven 打包时不会包含scopesystem 的依赖需要在当前父 pom.xml中添加配置确保驱动包被打进最终的 jar/war 包buildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdconfigurationincludeSystemScopetrue/includeSystemScope/configuration/plugin/plugins/build注意 system 依赖是 “系统级依赖”Maven 默认不打入包需手动加includeSystemScopetrue/includeSystemScope才会包含漏配就报错。4、解决方案1方案 一用绝对路径配置 system 依赖不灵活排除直接把父模块 pom.xml 里的systemPath改成驱动包的绝对路径这样所有子模块继承依赖时都会指向同一个正确路径不会再出现 “路径漂移”!-- 本地达梦DM8驱动 --dependencygroupIdcom.dameng/groupIdartifactIdDm8JdbcDriver18/artifactIdversion8.1.2/versionscopesystem/scope!-- 替换为你驱动包的实际绝对路径必须是父模块lib下的路径 --systemPathE:\project\back\lib\DmJdbcDriver18.jar/systemPath/dependency保存父模块 pom.xml在 IDEA 右侧 Maven 面板点击「Reload All Maven Projects」刷新依赖执行mvn clean install -U可在 IDEA 终端执行此时 base等子模块会按绝对路径找驱动报错直接消失。2方案 二放弃 system 依赖安装驱动到本地 Maven 仓库①安装驱动到本地 Maven 仓库打开命令提示符CMD进入驱动包所在目录E:\project\back\lib执行以下命令mvn install:install-file-DfileDmJdbcDriver18.jar-DgroupIdcom.dameng-DartifactIdDm8JdbcDriver18-Dversion8.1.2-Dpackagingjar执行成功后驱动会被安装到你本地 Maven 仓库默认路径C:\Users\你的用户名.m2\repository\com\dameng\Dm8JdbcDriver18\8.1.2。下面解释为什么jar包下载在E盘的目录下。②修改父模块 pom.xml删除 system 依赖改用普通依赖!-- 删除原来的system依赖替换为下面的普通依赖 --!-- 达梦DM8驱动从本地Maven仓库加载 --dependencygroupIdcom.dameng/groupIdartifactIdDm8JdbcDriver18/artifactIdversion8.1.2/version/dependencyIDEA 右侧 Maven 面板点击「Reload All Maven Projects」所有子模块会从本地仓库加载驱动彻底解决路径问题。数据库已经连接成功日志里的[dataSource-1] inited。③关于打包普通依赖无 system scope是 Maven 标准依赖打包时会自动把驱动包打进最终的 jar/war 包运行时能直接加载四、mvn install:install-file命令命令的核心作用就是把本地 jar 包 “安装” 到 Maven 的本地仓库。关键规则Maven 命令的仓库路径由「当前生效的 settings.xml」决定。IDEA 里 “自定义 Maven” 的本质是让 IDEA 调用 Maven 命令时使用你指定的 Maven 安装包 对应的settings.xml而settings.xml里的localRepository参数决定了本地仓库的位置。五、为什么不使用Add as Library因为既点了 “Add as Library…” 又在 pom.xml 里配置了 DM8 依赖但只要 Maven 本地 / 远程仓库里找不到这个驱动包打包一定会报错甚至本地用 Maven 命令运行也会报错。“Add as Library…” 是 IDEA 的一个实用功能核心作用是把当前选中的本地 jar 包比如这里的DmJdbcDriver18.jar直接添加为当前项目的 “库依赖”。1、使用场景可以理解为让 IDEA 的代码编译环境 “认识” 这个 jar 包能识别包里的类、方法等内容避免代码里出现 “找不到类” 的红色报错比如dm.jdbc.driver.DmDriver爆红。核心场景当通过非 Maven 方式比如直接下载 jar 包放到项目里引入依赖时IDEA 默认不会自动识别这个 jar 包代码里引用包内的类会爆红 —— 此时用 “Add as Library…” 就能快速解决编译报错。注意点它是 IDEA 本地的临时配置只在当前 IDEA 项目中生效不会影响 Maven 的依赖管理Maven 打包时不会自动包含这个jar 包除非你同时在pom.xml里配置了依赖和 Maven 依赖的区别 Maven 依赖是项目级的、可打包的、跨环境的依赖 Add as Library是 IDEA编辑器级的、仅用于编译的临时依赖。简单说这个功能是 让IDEA 不爆红的快捷方式但不能替代 Maven 的依赖配置否则打包后运行会报错。2、打包场景只单独用 “Add as Library…” 功能打包时大概率会出错核心原因是这个功能只是让 IDEA 编辑器识别了 jar 包但 Maven 完全 “不知道” 这个 jar 包的存在。具体解释Maven 打包的逻辑是只认pom.xml里配置的依赖完全不看 IDEA 的 “Add as Library…” 操作如果你只点了 “Add as Library…”但没在pom.xml里配置 DM8 驱动的依赖Maven 打包时不会把DmJdbcDriver18.jar打进最终的 jar/war 包部署打包后的项目时就会报 “ClassNotFoundException: dm.jdbc.driver.DmDriver”找不到驱动类项目启动失败。正确的配合方式“Add as Library…”必须和 Maven 依赖配置一起用才能既让 IDEA 不爆红又让打包不出错先在pom.xml里配置 DM8 驱动的依赖比如方案 2 的本地 Maven 仓库依赖因为pom.xml里配置 DM8 驱动还是需要在maven里找jar包的再用 “Add as Library…” 让 IDEA 识别 jar 包避免代码爆红此时 Maven 打包会自动包含驱动项目运行也不会报错。
返回列表