【问题标题】:Gradle does not use the Maven Local Repository for a new dependencyGradle 不会将 Maven 本地存储库用于新的依赖项
【发布时间】:2015-11-13 10:39:13
【问题描述】:

我的 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() 应该使用与Maven 的settings.xml 文件中定义的&lt;localRepository&gt; 相同的路径。

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

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

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

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

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

【问题讨论】:

标签: gradle build.gradle


【解决方案1】:

从本地 Maven 存储库解析依赖项

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

根据documentationmavenLocal()是这样解析的:

Gradle 使用与 Maven 相同的逻辑来识别本地 Maven 缓存的位置。如果在settings.xml 中定义了本地存储库位置,则将使用此位置。 USER_HOME/.m2 中的 settings.xml 优先于 M2_HOME/conf 中的 settings.xml。如果没有可用的settings.xml,Gradle 将使用默认位置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)。
  • 使用像NexusArtifactory 这样的工件代理。 Maven 和 Gradle 可以配置为使用来自同一代理的依赖项。这种设置在专业环境和我的个人喜好中很常见。

【讨论】:

  • 感谢回复,记住我希望通过 Gradle 获得的新依赖项转到 Maven 本地存储库。检查我的问题中的评论。有其他问题的链接。遗憾的是还没有解决方案。
  • 这个答案和下面的答案都不适合我(gradle 版本 4.8.1)。我在本地仓库中有一个工件,但 gradle 似乎没有看到它,而 maven 本身没有问题。添加apply plugin: 'maven' 没有帮助
  • @Jezor 看起来你有问题 ;-)
  • @thokuest 我正在等待 AUR 中的 4.9 版本,希望我拥有的版本刚刚损坏 (;
  • @Jezor Gradle 4.9 刚刚发布:docs.gradle.org/4.9/release-notes.html
【解决方案2】:

使用

mavenLocal()

例如:

buildscript {
    ext {
        springBootVersion = '2.0.0.M1'
    }
    repositories {
        mavenCentral()
        mavenLocal()
        maven { url "https://repo.spring.io/snapshot" }
        maven { url "https://repo.spring.io/milestone" }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
    mavenLocal()
    maven { url "https://repo.spring.io/snapshot" }
    maven { url "https://repo.spring.io/milestone" }
}


dependencies {
    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('com.oracle:ojdbc6:11.2.0.4')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

我正在使用 Gradle 3.5

【讨论】:

【解决方案3】:

我遇到了这个问题,因为我正在处理一个遗留项目,我需要使用 sudo gradle build 命令运行我的构建。构建涉及复制 XSD 文件,这需要 root 权限。我选择不使用先前答案的解决方案,因为我不想更改构建文件;我不想意外签入我的build.gradle 更改。我发现 Gradle 正在检查 /var/root/.m2 文件夹中的 mavenLocal。我的解决方案是将/Users/me/.m2/settings.xml 复制到/var/root/.m2 并为localRepository 添加一行以指向我的/Users/me/.m2 文件夹。示例行及其添加位置是:

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                        http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <localRepository>/Users/me/.m2/repository</localRepository>
  <profiles>

【讨论】:

  • 有意思,我会在其他电脑上试试看
【解决方案4】:

这促使我喝酒。

如果我为具有1.1.1.SNAPSHOT 版本的项目执行mvn install,它会进入我的本地maven 存储库(~/m2/repository/...)而没有错误。但是,使用 mavenLocal() 的 Gradle 不会尝试在本地 maven 存储库中定位它(已使用 ./gradlew bootRun --debug 并检查日志)。

如果我将版本更改为 1.1.1-SNAPSHOT(注意破折号),Gradle 将尝试并找到存储库。

Maven 认为这是本地使用的有效版本号对我来说没有意义,但 Gradle 完全忽略了它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 2012-02-03
    相关资源
    最近更新 更多