I have Maven with M2_HOME
defined to /Users/manuelj/apache/maven/3.2.5
I have the settings.xml
file, located on /Users/m
Use
mavenLocal()
for example:
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')
}
I am using Gradle 3.5
Gradle is able to resolve artifacts stored in the local Maven repository (usually ~/.m2/repository
) via mavenLocal().
According to the documentation, mavenLocal()
is resolved like this:
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. Thesettings.xml
inUSER_HOME/.m2
takes precedence over thesettings.xml
inM2_HOME/conf
. If nosettings.xml
is available, Gradle uses the default locationUSER_HOME/.m2/repository
.
To resolve artifacts from a non-standard local Maven repository, you can use the following configuration in your build.gradle
:
repositories {
maven {
url '/Users/manuelj/apache/maven/repository'
}
}
(From: How does Gradle resolve the directory of the local maven repository?)
Custom Maven repositories are documented here.
Gradle stores resolved dependencies in its own Dependency Cache. The dependency cache is so much more than just a simple Maven artifact repository:
jcenter()
might be different to the one resolved from mavenCentral()
.Artifacts produced by the build can be easily pushed to the local Maven repository via publishToMavenLocal
task contributed by the Maven Publish Plugin.
But what about resolved dependencies? For the aforementioned reasons, Gradle cannot store dependencies in the local Maven repository. There's currently no built-in functionality to even publish dependencies to the Maven's local repository from the build script. So what are your options:
I came across this issue because I'm working on a legacy project where I need to run my build with the sudo gradle build
command. The build involves copying XSD files, which require root permissions. I opted not to employ the solutions of the previous answers because I didn't want to change the build file; I didn't want to accidentally checkin my build.gradle
changes. What I found was that Gradle was checking for mavenLocal
in the /var/root/.m2
folder. My solution was to copy /Users/me/.m2/settings.xml
to /var/root/.m2
and add a line for the localRepository
to point back to my /Users/me/.m2
folder. A sample line and where to add it is:
<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>
This drove me to drink.
If I do mvn install
for a project having a version of 1.1.1.SNAPSHOT
it goes into my local maven repository (~/m2/repository/...) with no errors. However, Gradle using mavenLocal()
will not attempt to locate it in the local maven repository (having used ./gradlew bootRun --debug
and inspecting the logs).
If I change the version to 1.1.1-SNAPSHOT
(note the dash), then Gradle will attempt, and will find the repository.
It doesn't make sense to me that Maven finds this to be a valid version number for local use, but Gradle completely ignores it.