ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

断网环境中的Maven使用

2021-11-30 13:30:25  阅读:185  来源: 互联网

标签:maven central 仓库 spring 环境 Maven 断网 aliyun


Linux的maven setting配置

<?xml version="1.0" encoding="UTF-8"?>

<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">

  
  <localRepository>/kingdom/apache-maven-3.8.3/repository</localRepository>

  <offline>true</offline>
  
  <mirrors>
	<mirror>
		<id>nexus-kd</id><!--重点注意这个,需要和本地仓库里下载的依赖记录文件_remote.repositories 一致-->
		<mirrorOf>*</mirrorOf>
		<name>Nexus for Kingdom</name>
		<url>file://kingdom/apache-maven-3.8.3/repository</url>
	</mirror>
  </mirrors>

</settings>

-----------------------------------------------------------

原文:断网环境中的Maven使用 - sliec - 博客园

背景诉求:

最近在帮助银行内网环境中搭建Java开发环境,其中使用到了Maven来进行项目管理。按照之前的理解,我在外网环境下把整个项目的框架先搭建好,然后把相关的文件,比如项目文件,Maven本地仓库等等拷贝进内网的电脑里面即可。

使用到:Spring Cloud相关的依赖。

问题:

在实际操作中,虽然Maven本地仓库的所有文件都已经拷贝进入了内网机器上,但是在运行项目工程的时候,还是出现了问题,导致无法正常启动。

定位问题:

先补充下Maven相关知识:

1、对于Maven安装文件中的conf/setting.xml文件,其中有一项<mirror></mirro>:

复制代码

    <mirror>
        <id>alimaven</id> //表示此镜像的id
        <mirrorOf>central</mirrorOf> //表示它是哪个远程公开仓库的镜像,这里表示是是central的中央仓库
        <name>aliyun maven</name> //此镜像的名称
        <url>http://maven.aliyun.com/nexus/content/repositories/central/</url> //此镜像的地址
    </mirror>

复制代码

2、本地仓库地址:

复制代码

  <!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  <localRepository>/path/to/local/repo</localRepository>
  -->

复制代码

正常来说,Maven读取POM文件中的依赖时,会按照:本地仓库>>setting 中指定的远程仓库>>POM文件中指定的远程仓库。

3、离线模式:离线模式决定了在通过Maven进行build时,是否会连接互联网

复制代码

  <!-- offline
   | Determines whether maven should attempt to connect to the network when executing a build.
   | This will have an effect on artifact downloads, artifact deployment, and others.
   |
   | Default: false
  <offline>true</offline>
  -->

复制代码

按照网络上的说法我们先尝试使用离线模式:

使用Idea中Maven离线模式

 然后再在终端窗口运行:

mvn clean compile -o

发现还是报错,大意是无法从远端仓库同步信息下来

复制代码

[ERROR] Plugin org.springframework.boot:spring-boot-maven-plugin:2.3.0.RELEASE or one of its dependencies could not be resolved: Failed to read artifact descriptor
for org.springframework.boot:spring-boot-maven-plugin:jar:2.3.0.RELEASE: Could not transfer artifact org.springframework.boot:spring-boot-maven-plugin:pom:2.3.0.R
ELEASE from/to alimaven (http://maven.aliyun.com/nexus/content/repositories/central/): maven.aliyun.com: Unknown host maven.aliyun.com -> [Help 1]

复制代码

 参考文章:

maven项目离线开发_以手筑城的博客-CSDN博客_maven离线仓库 说需要把本地仓库地址以及mirror镜像地址都指向本地仓库的文件地址所在。

maven的离线模式_不积跬步,无以至千里;不积小流,无以成江海-CSDN博客_maven offline 说需要开启offline 模式

即做以下设置

复制代码

<localRepository>C:/Users/sliec/.m2/repository</localRepository>
.....
  <!-- offline
   | Determines whether maven should attempt to connect to the network when executing a build.
   | This will have an effect on artifact downloads, artifact deployment, and others.
   |
   | Default: false
  <offline>true</offline>
  -->
  <offline>true</offline>

...

<mirror>
  <id>alimaven</id>
  <mirrorOf>central</mirrorOf>
  <name>aliyun maven</name>
  <url>file://C:/Users/sliec/.m2/repository </url>

</mirror>


复制代码

尝试过后还是不行。

这时提示说:

Cannot access nexus-aliyun in onffline mode and the artifact org.springframework.boot:spring-boot-starter-parent:pom:2.3.0.RELEASE has not been download from it before

最终解决办法:

在复制Maven相关文件时,需要把当前能够联网的环境下,Maven程序包,重点是配置文件,加上此时此刻的本地仓库文件一并复制。

原因在于,Maven配置文件中,执定了mirror相关的内容,然后这里存在一个mirror本身的id,然后在本地仓库中,每一个依赖包里面,都存在着一份名为:_remote.repositories的文件,这个文件记载了类似下面的这些内容:

复制代码

#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
#Fri May 29 15:05:16 CST 2020
spring-web-5.2.6.RELEASE-javadoc.jar>alimaven= //这个地方和setting.xml中的mirrorid需要保持一致
spring-web-5.2.6.RELEASE.jar>alimaven=
spring-web-5.2.6.RELEASE.jar>central=
spring-web-5.2.6.RELEASE.pom>alimaven=
spring-web-5.2.6.RELEASE.pom>central=
spring-web-5.2.6.RELEASE-sources.jar>alimaven=

复制代码

也就是说,这一份依赖包是从哪里下载来下的,上面的示例就表示是从仓库id为 :alimaven,central的远程仓库下载下来的。

setting.xml中的mirror配置内容:

复制代码

    <mirror>
        <id>alimaven</id>//重点注意这个,需要和本地仓库里下载的依赖记录文件_remote.repositories 一致
        <mirrorOf>central</mirrorOf>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
    </mirror>

复制代码

如果这份列表里面记载的仓库id,与我们使用的Maven配置文件setting.xml当中配置的mirrorid不一致,那么,我们在局域网电脑中重新通过maven进行构建时,maven会认为本地仓库里存的这份依赖,和配置的远程镜像地址不是一个源,因此不能直接使用。

此时,它会尝试根据setting.xml中配置的镜像地址,去获取新的依赖文件,结果,这时候时局域网,访问不到镜像,所以会报错,并且提示你镜像无法访问,而且这个依赖之前没有下载下来。(感觉这个逻辑也很奇怪,你直接按照我的artifactId去库里定位就完了啊,还比较来源干什么)

而我之前拷贝本地仓库和项目工程进办公环境之后,由于自己不注意,改了setting.xml文件中的mirrorid,和本地仓库地址localRepository这两个内容,导致失败。

 

标签:maven,central,仓库,spring,环境,Maven,断网,aliyun
来源: https://blog.csdn.net/baidu_33320352/article/details/121630424

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有