一次导入maven依赖包的“趟坑”之旅

1,418 阅读5分钟

导言:

​ 前段时间工作中需要用hudi + flink来开发,但是我司某cloud部门自己定制了一套大数据依赖包(原因未知。没办法,环境由他们提供只能用了),并且这些依赖是发布到他们仓库中的,而且还需要用代理才能连接到他们的仓库。另外为了统一,组内一个同事先弄了一个项目脚手架,本来以为轻轻松松导入这个脚手架项目就能马上开发,妹想到这位同事说他自己开了公司里的”透明“代理(这个是什么东东我也不知道),但是我并不想提申请单独弄这个透明代理,于是决定自己改一下配置,折腾了一番终于弄好了。并且之后的同事用这个脚手架也是我来帮助他们配。

​ 过程中遇到了一些平时没留意的maven的配置项的坑,特此记录一下。涉及到一些公司的信息,这里只记录要点。

背景:

之前组内一位同事是我们组负责对接兄弟部门(简称c部门)的,然后他弄了个“框架”,把一些hdfs配置,hadoop配置,依赖配置等全都弄好了,其他人拿着这个脚手架就不用再把各种配置和依赖折腾了。但是,我后来发现,同事的这个脚手架工程发布了一些jar包到我们自己部门的maven仓库中,而hadoop,hdfs,hudi那些依赖在c部门的仓库,并且这个仓库还不能直接连接,需要用到代理。

问题:

问题现象:

proxy的依赖一直报错,并且idea maven的external libraries那里也是一直没有依赖。

然后还有一点很怪异的是: 随便加一个外部的依赖都不行,比如说像Druid。完全没反应,依赖不进来。

解决思路:

用 mvn 输出依赖树

mvn 用-X 输出debug信息:

mvn dependency:tree -s D:\work_code\xxxx\xxx\settings.xml -PJDK1.8,Myprofile -X

然后就各种报错:

1.首先注意到 它走的仓库是dg.xxx.com/artifactory… 于是猜测是自己安装的mvn的那个setting文件。发现还真是。

需要把mvn 本地的setting文件替换一下

2.经历上面第一步后,再次执行,有一个明显错误 :XXXX transfer file XXX “B仓库” XXX 502

于是搜了一下502,发现是bad gateway ,反正是和网关、代理相关的。

查看setting 文件中的proxy配置,发现配的是下面那个。

<proxy>
    <id>optional</id>
    <active>true</active>
    <protocol>http</protocol>
    <username>我的id</username>
    <password>xxx</password>
    <host>proxy.xxx.com</host>
    <port>8080</port>
    <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
</proxy>

然后看mvn dependency:tree的输出可以看到很多信息,比如,从dg.xxx.com/artifactory… 这获取包的时候它会打印 username和密码的。

于是提醒了我,现在setting文件有两个重要配置:

1.

2.

这两个标签作用可以参考:

1.www.cnblogs.com/jingmoxukon…

2.juejin.cn/post/684490…

有个关于mirror和proxy的对比的重要解释:

Proxy configuration relates to a standard HTTP proxy you might need reaching Internet, such as a proxy in your web browser. It does not relate to maven functionalities as such, but to reaching Internet connectivity.

If you can use a browser without a proxy, you probably don't need one for Maven either, and vice versa.

Mirror configuration, on the other hand, is meant to replace a maven repository with another. They are not related to connectivity - they change the target which your maven tries to reach.

说白了就是我们连接repository的时候有时候是需要用到代理才能连通网络的,这个proxy作为“中间人”帮我们从repository下载依赖包

  1. 重点关注server标签和proxy标签

    这两个标签有点相似的地方,就是都有username和密码

看到网上关于server的作用,server的id 指的是repository的id。于是我推测:server的username和password是为了下在jar包的时候用的

<server>
    <id>xxx</id>
    <username>xxx</username>
    <password>password</password>
</server>
  1. 为了下载自己部门用的jar包,需要配置如下仓库
<repositories>
    <repository>
        <id>xxxlocal</id>
        <url>http://dg.artifact.xxx.com/artifactory/maven-local-group/</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>

上面的配置我在pom文件中配置了。然后在setting文件中也配置了相应的用户名和密码

<server>
    <id>xxxlocal</id>
    <username>xxx</username>
    <password>xxx#</password>
</server>

完整的effective-pom如下:

<repositories>
  <repository>
    <releases>
      <enabled>true</enabled>
    </releases>
    <snapshots>
      <enabled>false</enabled>
    </snapshots>
    <id>xxxCloudSDK</id>
    <url>https://mirrors.xxxcloud.com/repository/maven/xxxcloudsdk/</url>
  </repository>
  <repository>
    <releases>
      <enabled>true</enabled>
    </releases>
    <snapshots>
      <enabled>true</enabled>
    </snapshots>
    <id>xxxlocal</id>
    <url>http://dg.artifact.xxx.com/artifactory/maven-local-group/</url>
  </repository>
  <repository>
    <snapshots>
      <enabled>false</enabled>
    </snapshots>
    <id>central</id>
    <name>Central Repository</name>
    <url>https://repo.maven.apache.org/maven2</url>
  </repository>
</repositories>
5.结合上面的proxy502问题。修改proxy如下
<proxy>
    <id>optional</id>
    <active>true</active>
    <protocol>http</protocol>
    <username>我的id</username>
    <password>xxx</password>
    <host>proxy.xxx.com</host>
    <port>8080</port>
    <nonProxyHosts>dg.artifact.xxx.com</nonProxyHosts>
</proxy>

重点是:将repository地址dg.artifacxxxei.com不用代理。

改完上面这个就可以输出mvn depencency:tree了

结论:

  1. 直接看effective pom文件就好了。 看仓库有哪些,以及setting的mirror有没有拦截哪个仓库
  2. repository是一个一个轮着来尝试的。最后不行就中央仓库

补充:maven.apache.org/guides/mini…

官网里有说自己定义repository会把super pom的repository也加进来

官网也让我们看effective pom

Repository Order
Remote repository URLs are queried in the following order for artifacts until one returns a valid result:

effective settings:
Global settings.xml
User settings.xml
local effective build POM:
Local pom.xml
Parent POMs, recursively
Super POM
effective POMs from dependency path to the artifact.
For each of these locations, the repositories within the profiles are queried first in the order outlined at Introduction to build profiles.

Before downloading from a repository, mirrors configuration is applied.

Effective settings and local build POM, with profile taken into account, can easily be reviewed to see their repositories order with mvn help:effective-settings and mvn help:effective-pom -Dverbose.

3.在effective-pom的基础上要知道:

3.1先看repository。maven在下载jar包的时候会对各个repository顺序地尝试去下载,直至最后一个中央仓库(如果有配)。

3.2 server标签的id对应某一个repository(repository的id)。在server标签这输入用户名和密码。用这个用户名和密码来和repository认证。

3.2proxy是作为网络连通的代理。默认情况下proxy会代理所有repository的url,如果某些仓库不需要代理的话记得在proxy标签中配置:nonProxyHosts的内容