为啥 Maven 不总是从 theartefactory 下载最后一个依赖项,从竹子构建?

Posted

技术标签:

【中文标题】为啥 Maven 不总是从 theartefactory 下载最后一个依赖项,从竹子构建?【英文标题】:Why does Maven not always download the last dependency from theartefactory, build from bamboo?为什么 Maven 不总是从 theartefactory 下载最后一个依赖项,从竹子构建? 【发布时间】:2011-12-13 12:53:35 【问题描述】:

我正在使用竹子来自动构建我们的模块,并使用 maven 来构建工具。 它可以正常工作,但有时如果我需要增加模块的版本(例如从 1.0-SNAPSHOT 更改为 1.1-SNAPSHOT)

我做以下事情: 1)在我的svn存储库中标记1.0-SNAPSHOT版本在同一目录结构下,但在标记根目录中。这样做是出于兼容性原因。 2) 创建竹子构建计划,构建标记模块。 3)增加模块的版本,在trunk中。

到目前为止一切顺利。但是有时当我构建客户的项目时,标记的模块不是从 maven 下载的(即使我可以看到它是用竹子正确构建的)并且它使用标记之前的旧 jar。此外,maven 并不总是下载最后一个 jar,我必须手动从 .m2 目录中删除它或更新模块并在我的机器上手动重建它(不使用离线模式)。这很痛苦,但作为开发人员,我可以做到这一点,但我们的项目也是由管理员构建的,他们不知道如何管理它,他们有时会部署具有错误依赖关系的项目,这会导致麻烦:)。

如果有人知道如何解决这个问题,请告诉我。

【问题讨论】:

这将始终从存储库中获取最新快照:mvn -U clean install,这是 mvn --update-snapshots clean install 的缩写形式 您能否在本地构建和竹服务器中混合使用 maven 2 和 maven 3 - 不同的? 【参考方案1】:

查看您的 settings.xml 文件。你会发现这样的部分:

    <profile>
      <id>FooBar</id>
      <!--Enable snapshots for the built in central repo to direct -->
      <!--all requests to nexus via the mirror -->
      <repositories>
        <repository>
          <id>nexus</id>  
          <!-- use a bogus URL as this gets overwritten by the mirror settings -->
          <url>http://central</url>
         <releases>
            <enabled>true</enabled>
             <updatePolicy>daily</updatePolicy>
         </releases>
          <snapshots>
            <enabled>true</enabled>
             <updatePolicy>always</updatePolicy>
         </snapshots>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <id>nexus</id>
          <!-- use a bogus URL as this gets overwritten by the mirror settings -->
          <url>http://central</url>
          <releases>
            <enabled>true</enabled>
            <updatePolicy>daily</updatePolicy>
          </releases>
          <snapshots>
            <enabled>true</enabled>
            <updatePolicy>daily</updatePolicy>
          </snapshots>
        </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>
  <activeProfiles>
    <!--make the profile active all the time -->
    <activeProfile>FooBar</activeProfile>
  </activeProfiles>

确保每次您想下载工件的任何地方都使用&lt;updatePolicy&gt;always&lt;/updatePolicy&gt;,而不是使用本地的。

【讨论】:

如果存储库中的代码比我的本地 jar 更新,我只想下载。 @user358448 据我了解,如果本地库更新,maven 不会替换它们。 “总是”设置只是“总是”尝试从存储库更新您的工件(仅当它们较新时)。如果您有很多 SNAPSHOTS 并且需要经常构建,这可能会非常耗时。因此,如果您确定存储库版本没有更改(但在您的情况下确实如此),您可以更改策略。试试看!【参考方案2】:

在构建依赖于该模块的客户端应用程序时尝试mvn deploy -U-U 参数用于在构建依赖项目时检索最新构建的 SNAPSHOT 依赖项(不是指最新版本,而是最后构建的 SNAPSHOT 工件),在您的情况下可能是客户端应用程序。

【讨论】:

以上是关于为啥 Maven 不总是从 theartefactory 下载最后一个依赖项,从竹子构建?的主要内容,如果未能解决你的问题,请参考以下文章

HTTPS并不总像它看起来那么可靠

如何从动态起点填写选择?

maven 聚合工程中排除依赖为啥无效

为啥maven更新要删除文件

Ajax Chat 长轮询

为啥 Maven 每次都下载 maven-metadata.xml?