Gradle不使用Maven Local Repository来创建新的依赖项

时间:2015-08-19 23:23:12

标签: gradle build.gradle

我将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的<localRepository>文件中定义的settings.xml相同的路径。

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

当我执行示例gradle构建时,我确实意识到了

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

我希望新的依赖项直接转到同一个Maven Local Repository。

因此,需要什么额外配置呢?

4 个答案:

答案 0 :(得分:24)

mavenLocal()解决方式如下:

  

Gradle会查看~/.m2/settings.xml以获取本地Maven存储库所在的信息。如果未找到任何信息,则会采用~/.m2/repository

这是对Gradle论坛上提出的问题“mavenLocal() - how does Gradle resolve the directory of the local maven repository?”的回答。

引用的讨论还包含针对您的特定问题的解决方案。为了使用非标准的本地maven存储库,您可以在build.gradle中使用以下配置:

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

答案 1 :(得分:8)

使用

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

答案 2 :(得分:4)

这驱使我喝酒。

如果我对一个版本为mvn install的项目执行1.1.1.SNAPSHOT,则它将毫无错误地进入我的本地Maven存储库(〜/ m2 / repository / ...)。但是,使用mavenLocal()的Gradle不会尝试在本地maven存储库中找到它(已经使用./gradlew bootRun --debug并检查了日志)。

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

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

答案 3 :(得分:0)

我遇到过这个问题,因为我正在处理遗留项目,我需要使用sudo gradle build命令运行我的构建。构建涉及复制XSD文件,这需要root权限。我选择不使用之前答案的解决方案,因为我不想更改构建文件;我不想意外地检查我的build.gradle更改。我发现Gradle正在检查mavenLocal文件夹中的/var/root/.m2。我的解决方案是将/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>