16

我们正在尝试使用 Archiva 作为中央和其他外部存储库的 Maven 代理,以及作为我们的工件的快照存储,这些工件由 Hudson 从 SVN 自动构建并安装到快照存储库。

我无法将我的 Maven 客户端设置为同时使用内部和快照存储库。log4j我的项目有一些从 Archiva 内部存储库正确下载的外部依赖项(如)。此外,我的项目依赖于自己的项目,该项目的工件已经构建并安装到快照存储库中。但是,如果我尝试构建项目 Maven 找不到我的快照工件。

我的配置文件最初有这个设置:

<mirror>
  <id>company-internal</id>
  <name>Company's Archiva - Internal Repository</name>
  <url>http://www.mycompany.hu/archiva/repository/internal</url>
  <mirrorOf>*</mirrorOf>
</mirror>

然后我添加了以下内容:

<mirror>
 <id>company-snapshots</id>
 <name>Company Archiva - Snapshots Repository</name>
 <url>http://www.mycompany.hu/archiva/repository/snapshots</url>
 <mirrorOf>apache.snapshots</mirrorOf>
</mirror>

但是 Maven 不会尝试在构建时查找快照存储库。我做错什么了?顺便说一句,我并没有真正理解<mirrorOf>元素的目的。我试图在内部镜像设置中替换它,central但这仍然不能解决我的问题。

4

3 回答 3

18

经过反复试验,以下配置对我有用。在这里,我使用了默认的存档配置 -internal保存发布并snapshots只保存内部快照。

本质上与nexus不同,我们需要两个单独的<mirror>and<repository>声明——一个用于普通工件,另一个用于快照工件。

<mirrors>
    <mirror>
        <id>archiva</id>
        <mirrorOf>*</mirrorOf>
        <url>http://localhost:8080/archiva/repository/internal</url>
    </mirror>
    <mirror>
        <id>snapshots</id>
        <mirrorOf>snapshots</mirrorOf>
        <url>http://localhost:8080/archiva/repository/snapshots</url>
    </mirror>
</mirrors>
<profiles>
    <profile>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <repositories>
            <repository>
              <id>internal</id>
              <name>Archiva Managed Internal Repository</name>
              <url>http://localhost:8080/archiva/repository/internal/</url>
              <releases>
                <enabled>true</enabled>
              </releases>
              <snapshots>
                <enabled>false</enabled>
              </snapshots>
            </repository>
            <repository>
              <id>snapshots</id>
              <name>Archiva Managed Internal Repository</name>
              <url>http://localhost:8080/archiva/repository/snapshots/</url>
              <releases>
                <enabled>false</enabled>
              </releases>
              <snapshots>
                <enabled>true</enabled>
              </snapshots>
            </repository>
        </repositories>
    </profile>
</profiles>
于 2011-09-15T12:16:10.310 回答
2

经过多次反复试验,我得出了一个与 Raghuram 非常相似的配置。然而,使用档案,我发现了一两件事可能仍然值得注意。另外,我在我的配置中使用了镜像以供我的项目访问(<distributionManagement/>在 pom.xml 中设置),而不是直接访问存储库。

这是我的 maven settings.xml 的相关部分:

<!-- set up servers to point to mirror, for use in project pom -->
<servers>
  <server>
    <id>my.snapshots</id> <!-- use name of the mirror here -->
    <username>user</username>
    <password>pwd</password>
  </server>
</servers>

<!-- map mirror names to actual repositories -->
<mirrors>
  <!-- leave the default mirror in place -->
  <mirror>
    <id>archiva.default</id>
    <mirrorOf>*</mirrorOf>
    <url>http://server:port/archiva/repository/internal/</url>
  </mirror>
  <!-- enter my own -->
  <mirror>
    <id>my.snapshots</id>
    <mirrorOf>archiva.snapshots</mirrorOf>
    <url>http://server:port/archiva/repository/snapshots/</url>
  </mirror>
<mirrors>

<!-- activate the repo for artifact downloads by setting profile -->
<profiles>
  <activation>
    <activeByDefault>true</activeByDefault>
  </activation>
  <repositories>
    <repository> <!-- mirror will be used during runtime instead of this -->
      <id>archiva.snapshots</id> <!-- do not use mirror name here -->
      <url>http://server:port/archiva/repository/snapshots/</url>
      <releases>
        <enabled>false</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>
  </repositories>
</profile>

我发现我必须在该部分中提供与该<mirrors>部分不同的 id <profiles>,因此我似乎不允许为它们提供与 Raghuram 相同的名称。

现在,有了 settings.xml,我开始更改<distributionManagement>我项目的 pom.xml 中的部分。准确地说,我在我所有项目的父级 pom 中更改了此设置:它主要包含该<distributionManagement>部分,几乎没有其他内容。此父 pom 本身已部署到档案。

这是父 pom.xml 的相关部分:

<distributionManagement>
  <repository>
    ...
  </repository>
  <snapshotRepository>
    <id>my.snapshots</id>
    <name>Archiva Managed Snapshot Repository</name>
    <url>http://server:port/archiva/repository/snapshots</url>
    <layout>default</layout>
  </snapshotRepository>
</distributionManagement>

这种精简的东西,我认为,它有一些好处:

  • 我现在能够根据自己的工件(包括父 pom)构建项目,而无需在本地构建存储库中拥有这些工件中的任何一个(我擦除了本地存储库以进行测试)。

  • 下载(<dependencies>pom.xml 的部分)和上传(<distributionManagement>pom.xml 的部分)现在通过镜像处理。

于 2011-09-22T13:26:04.030 回答
1

经过多次反复试验,我也得出了与上述配置非常相似的配置,但直到我在下面的配置中执行此操作后,事情才对我有用。因此,如果您在组织存储库的帮助下使用 maven 而不是在本地主机中使用,则发布它以尝试改进答案。

此答案适用于那些需要为您的组织维护的多个存储库进行多个镜像配置的人,那么这将作为示例。

my.snapshots 用户密码

<!-- map mirror names to actual repositories -->
<mirrors>
   <!-- enter my own -->
  <mirror>
    <id>my.snapshots</id>
    <mirrorOf>archiva.snapshots</mirrorOf> <!-- this name should be the same as configured for the below repository id.>
    <url>http://server:port/archiva/repository/snapshots/</url>
  </mirror>
  <!-- leave the default mirror in place -->
  <mirror>
    <id>archiva.default</id>
    <mirrorOf>central</mirrorOf> < !-- Instead of *, replace it with "central"-->
    <url>http://server:port/archiva/repository/internal/</url>
  </mirror>
<mirrors>

<!-- activate the repo for artifact downloads by setting profile -->
<profiles>
  <activation>
    <activeByDefault>true</activeByDefault>
  </activation>
  <repositories>
    <repository> <!-- mirror will be used during runtime instead of this -->
      <id>archiva.snapshots</id> <!-- do not use mirror name here -->
      <url>http://server:port/archiva/repository/snapshots/</url>
      <releases>
        <enabled>false</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>
  </repositories>
</profile>
于 2014-08-25T15:30:21.097 回答