web-dev-qa-db-fra.com

Gradle n'utilise pas le référentiel local Maven pour une nouvelle dépendance

J'ai Maven avec M2_HOME défini à:

  • /Users/manuelj/Apache/maven/3.2.5

J'ai le fichier settings.xml, situé sur:

  • /Users/manuelj/Apache/maven/3.2.5/conf/settings.xml

où j'ai déclaré ce qui suit:

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

Jusque là avec Maven tout fonctionne bien. Toute nouvelle dépendance y va.

J'ai un projet basé sur Gradle, parmi beaucoup de choses dans mon build.gradle, existent les suivantes:

apply plugin: 'Java'
apply plugin: 'maven'
apply plugin: 'Eclipse'
apply plugin: 'application'

version = '1.0.0'
sourceCompatibility = '1.8'

repositories {
   mavenLocal()
   mavenCentral()
}
… more

Jusque là, tout fonctionne bien aussi. Code compiler, s'exécute bien.

Ma confusion est la suivante.

D'après ce que j'ai compris, la fonction mavenLocal() de Gradle doit utiliser le même chemin que <localRepository> défini dans le fichier settings.xml de Maven.

Confirmez maintenant qu'il existe dans le référentiel local Maven des dépendances déjà téléchargées.

Lorsque j’exécute par exemple Gradle Build, j’ai réalisé que

  • Si une dépendance existe déjà à partir du référentiel local Maven, elle est utilisée à partir de là.
  • S'il n'existe pas de dépendance à partir du dégradé de référentiel local Maven, téléchargez la nouvelle dépendance vers: /Users/manuelj/.gradle/caches/modules-2/files-2.1

Je souhaite que la nouvelle dépendance aille directement dans le même référentiel local Maven.

Par conséquent, quelle configuration supplémentaire en a besoin?

21
Manuel Jordan

mavenLocal() est résolu comme ceci:

Gradle recherche dans ~/.m2/settings.xml des informations sur l'emplacement du référentiel Maven local. Si aucune information n'est trouvée, cela suppose que ~/.m2/repository.

Voici une réponse à la question " mavenLocal () - Comment Gradle résout-il le répertoire du référentiel maven local? " donné sur les forums Gradle.

La discussion référencée contient également une solution à votre problème spécifique. Pour utiliser un référentiel Maven local non standard, vous pouvez utiliser la configuration suivante dans votre build.gradle:

repositories {
    maven {
        url '/Users/manuelj/Apache/maven/repository'
    }
}
20
thokuest

Utilisation

mavenLocal()

par exemple:

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')
}

J'utilise Gradle 3.5

5
foobarfuu

Cela m'a conduit à boire.

Si je fais mvn install pour un projet ayant une version de 1.1.1.SNAPSHOT, il ira dans mon référentiel maven local (~/m2/repository/...) sans erreur. Cependant, Gradle utilisant mavenLocal() ne tentera pas de le localiser dans le référentiel maven local (après avoir utilisé ./gradlew bootRun --debug et inspecté les journaux).

Si je change la version en 1.1.1-SNAPSHOT (notez le tiret), Gradle tentera et trouvera le référentiel.

Cela n'a pas de sens pour moi que Maven trouve qu'il s'agit d'un numéro de version valide pour une utilisation locale, mais Gradle l'ignore complètement.

2
Richard Collette

J'ai rencontré ce problème parce que je travaille sur un projet hérité dans lequel je dois exécuter ma construction avec la commande Sudo gradle build. La construction implique la copie de fichiers XSD, qui nécessitent des autorisations root. J'ai choisi de ne pas utiliser les solutions des réponses précédentes parce que je ne voulais pas changer le fichier de construction; Je ne voulais pas archiver accidentellement mes modifications build.gradle. Ce que j’ai trouvé, c’est que Gradle vérifiait mavenLocal dans le dossier /var/root/.m2. Ma solution consistait à copier /Users/me/.m2/settings.xml dans /var/root/.m2 et à ajouter une ligne pour que la variable localRepository renvoie à mon dossier /Users/me/.m2. Un exemple de ligne et où l'ajouter est:

<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>
0
entpnerd