gpt4 book ai didi

Gradle 不使用 Maven 本地存储库来创建新的依赖项

转载 作者:行者123 更新时间:2023-12-02 08:51:39 28 4
gpt4 key购买 nike

我有 Maven M2_HOME定义为/Users/manuelj/apache/maven/3.2.5

我有settings.xml文件,位于/Users/manuelj/apache/maven/3.2.5/conf/settings.xml

其中我声明了以下内容:

<localRepository>/Users/manuelj/apache/maven/repository</localRepository>

到目前为止,Maven 一切正常。任何新的依赖项都会在那里。

我有一个基于 Gradle 的项目,在我的 build.gradle 中,存在以下内容:

apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'eclipse'
apply plugin: 'application'

version = '1.0.0'
sourceCompatibility = '1.8'

repositories {
mavenLocal()
mavenCentral()
}
… more

到这里为止,一切都工作正常。代码编译,执行良好。

我的困惑如下。

按照我的理解是Gradle的mavenLocal()应该使用与 <localRepository> 相同的路径定义于 Maven 的 settings.xml文件。

现在确认 Maven 本地存储库中存在一些已下载的依赖项。

当我执行例如 gradle build 时,我确实意识到

  • 如果 Maven 本地存储库中已存在依赖项,则从那里使用它。
  • 如果 Maven 本地存储库 Gradle 中不存在依赖项,请将新依赖项下载到:/Users/manuelj/.gradle/caches/modules-2/files-2.1

我希望新的依赖项直接进入同一个 Maven 本地存储库。

那么,还需要什么额外的配置呢?

最佳答案

解析本地 Maven 存储库的依赖关系

Gradle 能够通过 mavenLocal() 解析存储在本地 Maven 存储库(通常 ~/.m2/repository)中的工件。 .

根据documentation , mavenLocal() 的解析如下:

Gradle uses the same logic as Maven to identify the location of your local Maven cache. If a local repository location is defined in a settings.xml, this location will be used. The settings.xml in USER_HOME/.m2 takes precedence over the settings.xml in M2_HOME/conf. If no settings.xmlis available, Gradle uses the default location USER_HOME/.m2/repository.

要解析非标准本地 Maven 存储库中的工件,您可以在 build.gradle 中使用以下配置:

repositories {
maven {
url '/Users/manuelj/apache/maven/repository'
}
}

(来自:How does Gradle resolve the directory of the local maven repository?)

自定义 Maven 存储库已记录 here .

在本地 Maven 存储库中存储工件

Gradle 将已解析的依赖项存储在其自己的 Dependency Cache 中。依赖项缓存不仅仅是一个简单的 Maven 工件存储库:

  • 存储二进制文件(jar)、工件元数据(POM、Ivy 文件)、依赖项解析结果和模块描述符。
  • 针对性能进行了调整,例如更短的文件路径。
  • 消除重复工件:相同的二进制文件仅存储一次。
  • 跟踪依赖项的来源。从 jcenter() 解析的依赖项可能与从 mavenCentral() 解析的依赖项不同。
  • 自动、时间和使用情况、缓存清理。

可以通过 Maven Publish Plugin 贡献的 publishToMavenLocal 任务轻松地将构建生成的工件推送到本地 Maven 存储库。 .

但是解决的依赖关系又如何呢?由于上述原因,Gradle 无法将依赖项存储在本地 Maven 存储库中。目前甚至没有内置功能可以从构建脚本将依赖项发布到 Maven 的本地存储库。那么你有什么选择:

  • 创建一个执行必要的跑腿工作的 shell 脚本。 Daniel Dietrich曾经写过一篇并发表在 Twitter (Gist)。
  • 使用类似 Nexus 的工件代理或Artifactory 。 Maven 和 Gradle 可以配置为使用来自同一代理的依赖项。这种设置在专业环境中很常见,也是我个人的偏好。

关于Gradle 不使用 Maven 本地存储库来创建新的依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32107205/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com