如何配置settings.xml以从Artifactory私有虚拟存储库中提取?

时间:2016-02-10 21:39:46

标签: java maven maven-2 maven-3 artifactory

我是Apache Archiva的资深人士,他最近转投Artifactory Pro。我一直试图在Artifactory中复制一个我在Archiva中实现虚拟私有存储库的设置。最终结果应该是不同的团队可以访问他们自己的团队工件,远程存储库,默认本地存储库以及公司范围的存储库。

但是,每当我配置Maven settings.xml以使用我的私有虚拟存储库时,我都无法只下载某些依赖项,这些依赖项可以从Maven Central获取和从中提取。如果我使用Artifactory的默认settings.xml(libs-release,libs-snapshot,plugins-release,plugins-snapshot和no virtual repository),那么我可以下载Maven Central上可用的所有依赖项以及我的项目需要。

我在Windows服务器2012虚拟服务器上运行Artifactory v4.4.2在他们提供的Tomcat上运行。我没有在代理后面跑。我对Archiva没有这样的问题。

关于我的私有虚拟存储库设置,我有一个名为" test"的虚拟存储库。这是一个"泛型"包装类型。该存储库包含以下存储库:

  • 远程回购
  • 库释放
  • 库快照
  • 插件释放
  • 插件快照
  • 测试释放本地
  • 测试快照本地
  • 公司释放本地
  • 公司快照本地

列出的前5个repos是提供Artifactory的默认虚拟存储库repos。列出的最后4个回购是本地回购,它们是通用包类型。

我想我应该用镜子。

以下是我正在使用的一个示例settings.xml(我的用户名和密码将填充在我保存到Maven conf文件夹的生成的settings.xml中):

<?xml version="1.0" encoding="UTF-8"?>
<settings xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd" xmlns="http://maven.apache.org/SETTINGS/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <servers>
    <server>
      <username>${security.getCurrentUsername()}</username>
      <password>${security.getEscapedEncryptedPassword()!"*** Insert encrypted password here ***"}</password>
      <id>central</id>
    </server>
    <server>
      <username>${security.getCurrentUsername()}</username>
      <password>${security.getEscapedEncryptedPassword()!"*** Insert encrypted password here ***"}</password>
      <id>snapshots</id>
    </server>
  </servers>
  <mirrors>
    <mirror>
      <mirrorOf>*</mirrorOf>
      <name>test</name>
      <url>http://localhost:8082/artifactory/test</url>
      <id>test</id>
    </mirror>
  </mirrors>
  <profiles>
    <profile>
      <repositories>
        <repository>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
          <id>central</id>
          <name>libs-release</name>
          <url>http://localhost:8082/artifactory/libs-release</url>
        </repository>
        <repository>
          <snapshots />
          <id>snapshots</id>
          <name>libs-snapshot</name>
          <url>http://localhost:8082/artifactory/libs-snapshot</url>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
          <id>central</id>
          <name>plugins-release</name>
          <url>http://localhost:8082/artifactory/plugins-release</url>
        </pluginRepository>
        <pluginRepository>
          <snapshots />
          <id>snapshots</id>
          <name>plugins-snapshot</name>
          <url>http://localhost:8082/artifactory/plugins-snapshot</url>
        </pluginRepository>
      </pluginRepositories>
      <id>artifactory</id>
    </profile>
  </profiles>
  <activeProfiles>
    <activeProfile>artifactory</activeProfile>
  </activeProfiles>
</settings>

我无法通过我的虚拟存储库从Maven Central获取的工件示例是poi-ooxml-schemas-3.10-FINAL.jar或许多Apache Maven插件。一旦删除镜像部分,我就可以从Maven Central下载所有依赖项。这对我来说毫无意义。我的虚拟存储库配置为包含remote-repos虚拟存储库,因此应该能够从Maven Central中提取所有内容。

我做错了什么?

3 个答案:

答案 0 :(得分:6)

嗯,这里的实际情况似乎是this is a bug与通用虚拟存储库的预定义layout相关。 在修复此问题之前,建议的解决方法是基于简单默认布局创建新的存储库布局。 所以,而不是简单的默认布局: [orgPath] / [模块] / [模块] - [baseRev]( - [fileItegRev])。[EXT]

应该创建一个如下所示的新布局: [orgPath] / [模块] / [模块] - [baseRev] [EXT]

创建此新存储库布局后,您可以将存储库的已定义布局更改为新创建的存储库布局。

这将解决您提到的行为。

答案 1 :(得分:2)

O.K。我自己想出了部分答案,并通过JFrog支持帮助找到了答案的另一部分。

以下是我发现的第一组问题:

  1. 我注意到如果我使用具有Generic类型的本地存储库的Generic类型的虚拟存储库,那么工件检索将下载我的大多数pom的依赖项,但不会下载所有依赖项
  2. 我注意到如果我使用具有Maven类型的本地存储库的Generic类型的虚拟存储库,那么工件检索将下载我的大多数pom的依赖项,但不是所有依赖项
  3. 这些问题对我来说似乎是个错误。

    所以,我最终定义了一个虚拟存储库(在下面的配置中命名为test-maven)和两个本地存储库,所有这些都是Maven类型。这两个本地存储库包含在虚拟存储库中。

    我想出了一个有效的settings.xml,但它使用了一个镜像,JFrog支持人员告诉我这不是最佳做法。记住这个建议,这是适用于我的最终settings.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <settings xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd" xmlns="http://maven.apache.org/SETTINGS/1.1.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <servers>
        <server>
          <username>USERNAME</username>
          <password>PASSWORD</password>
          <id>test-maven</id>
        </server>
      </servers>
      <profiles>
        <profile>
          <repositories>
            <repository>
              <snapshots />
              <id>test-maven</id>
              <name>test-maven</name>
              <url>http://localhost:8082/artifactory/test-maven</url>
            </repository>
          </repositories>
          <pluginRepositories>
            <pluginRepository>
              <snapshots />
              <id>test-maven</id>
              <name>test-maven</name>
              <url>http://localhost:8082/artifactory/test-maven</url>
            </pluginRepository>
          </pluginRepositories>
          <id>artifactory</id>
        </profile>
      </profiles>
      <activeProfiles>
        <activeProfile>artifactory</activeProfile>
      </activeProfiles>
    </settings>
    

    使用此配置,我验证了我可以下载发布到Maven Central的所有工件,更多远程存储库,本地快照Maven存储库中的快照以及本地快照Maven存储库中的发行版。此设置允许我为每个开发团队使用私有存储库。

答案 2 :(得分:0)

  

一旦删除镜像部分,我就可以从Maven Central下载所有依赖项。

您无法访问镜像,因为您尚未指定要使用的凭据。 (您也没有启用匿名访问)

来自:https://www.jfrog.com/confluence/display/RTF/Maven+Repository#MavenRepository-ConfiguringAuthentication

  

每个&lt; repository&gt;和&lt;镜子&gt;文件中指定的元素必须具有相应的&lt; server&gt;匹配&lt; id&gt;的元素指定用户名和密码。

你的镜子的id是测试。所以你需要为它添加另一个服务器条目:

<servers>
    <server>
        <username>USERNAME</username>
        <password>PASSWORD</password>
        <id>test-maven</id>
    </server>
    <server>
        <!-- credentials for mirror -->
        <username>USERNAME</username>
        <password>PASSWORD</password>
        <id>test</id>
    </server>
</servers>

Artifactory创建settings.xml文件的“设置我”功能不会添加&lt; server&gt;,这有点令人讨厌。自动进入镜子。