748 votes

Comment ajouter une dépendance sur un fichier .jar local dans le fichier build.gradle?

Donc j'ai essayé d'ajouter ma dépendance à mon fichier build.gradle local .jar :

apply plugin: 'java'

sourceSets {
    main {
        java {
            srcDir 'src/model'
        }
    }
}

dependencies {
    runtime files('libs/mnist-tools.jar', 'libs/gson-2.2.4.jar')
    runtime fileTree(dir: 'libs', include: '*.jar')
} 

Et vous pouvez voir que j'ai ajouté les fichiers .jar dans le dossier referencedLibraries ici : https://github.com/WalnutiQ/wAlnut/tree/version-2.3.1/referencedLibraries

Mais le problème est que lorsque je lance la commande : gradle build sur la ligne de commande, j'obtiens l'erreur suivante :

error: package com.google.gson does not exist
import com.google.gson.Gson;

Voici l'ensemble de mon dépôt : https://github.com/WalnutiQ/wAlnut/tree/version-2.3.1

0 votes

Etes-vous sûr du runtime au lieu de la compilation? fichier de compilation (...).

3 votes

Il semble que cela soit une dépendance de compilation si le jar ne peut pas être construit. essayez : compile files('libs/mnist-tools.jar', 'libs/gson-2.2.4.jar') si vous avez toujours un problème, essayez alors des chemins absolus car cela pourrait aussi être un problème.

1 votes

Cette question Stack Overflow m'a enfin donné la réponse dont j'avais besoin.

36voto

Jonathan Landrum Points 208

Une solution pour ceux qui utilisent Kotlin DSL

Les solutions ajoutées jusqu'à présent sont formidables pour l'OP, mais ne peuvent pas être utilisées avec Kotlin DSL sans être d'abord traduites. Voici un exemple de la façon dont j'ai ajouté un fichier .JAR local à ma construction en utilisant Kotlin DSL :

dependencies {
    compile(files("/chemin/vers/fichier.jar"))
    testCompile(files("/chemin/vers/fichier.jar"))
    testCompile("junit", "junit", "4.12")
}

N'oubliez pas que si vous utilisez Windows, vos barres obliques inversées doivent être échappées :

...
compile(files("C:\\chemin\\vers\\fichier.jar"))
...

Et n'oubliez pas non plus que les guillemets doivent être des guillemets doubles, pas des guillemets simples.


Édition pour 2020 :

Les mises à jour de Gradle ont rendu obsolètes compile et testCompile au profit de implementation et testImplementation. Ainsi, le bloc de dépendance ci-dessus ressemblerait à ceci pour les versions actuelles de Gradle :

dependencies {
    implementation(files("/chemin/vers/fichier.jar"))
    testImplementation(files("/chemin/vers/fichier.jar"))
    testImplementation("junit", "junit", "4.12")
}

1 votes

+1 a fonctionné pour moi! Savez-vous comment faire de même sans avoir à produire le fichier jar (au cas où j'aurais produit le jar)?

2 votes

@KareemJeiroudi Je pourrais mal comprendre votre question, mais si vous parlez de faire d'un module une dépendance du projet, vous feriez quelque chose comme ceci : compile(project(":MyProject")), où "MyProject" est défini dans votre fichier settings.gradle avec quelque chose comme include("MyProject").

35voto

Big Rich Points 1833

La réponse acceptée est bonne, cependant, j'aurais eu besoin de diverses configurations de bibliothèques dans ma construction Gradle multi-projets pour utiliser la même bibliothèque Java tierce.

Ajouter '$rootProject.projectDir' à l'élément de chemin 'dir' dans ma fermeture 'allprojects' signifiait que chaque sous-projet référençait le même répertoire 'libs', et non une version locale à ce sous-projet:

// Morceau de code gradle.build
allprojects {
    ...

    repositories {
        // Tous les sous-projets feront désormais référence au même répertoire 'libs'
        flatDir {
            dirs "$rootProject.projectDir/libs"
        }
        mavenCentral()
    }

    ...
}

MODIFICATION par Quizzie: changé "${rootProject.projectDir}" en "$rootProject.projectDir" (fonctionne dans la dernière version de Gradle).

2 votes

Mais comment faire référence à ce dossier libs dans le fichier build.gradle de la bibliothèque ? Toute aide à ce sujet.

1 votes

Il suffit de remplacer "${rootProject.projectDir}" par "$rootProject.projectDir" pour que cela fonctionne à nouveau.

5 votes

Assurez-vous d'utiliser des guillemets doubles plutôt que des guillemets simples car ces derniers ne seront pas interpolés.

18voto

Topera Points 4941

Version raccourcie :

dépendances {
    implémentation fileTree('lib')
}

15voto

icyerasor Points 1335

La question a déjà été répondue en détail. Je veux encore ajouter quelque chose qui me semble très surprenant :

La tâche "gradle dependencies" ne répertorie pas les dépendances de fichiers. Même si vous pourriez le penser, car elles ont été spécifiées dans le bloc "dependencies" après tout.

Ne vous fiez donc pas à la sortie de cela pour vérifier si vos fichiers lib locaux référencés fonctionnent correctement.

3 votes

Waouh! Je souhaite avoir lu ta réponse il y a 3 heures! Merci. C'est un piège de plus que les gens de Gradle ont placé pour nous les développeurs.

14voto

ZygoteInit Points 355

Une façon simple de le faire est

compiler fileTree(include: ['*.jar'], dir: 'libs')

compilera tous les fichiers .jar dans votre répertoire libs de l'application.

0 votes

La structure de fichiers fonctionne-t-elle pour tous les sous-répertoires du dossier libs ? Par exemple, quelques jars à l'intérieur du dossier libs/spring/spring.jar, dans ce cas est-ce que cela inclut également le spring.jar ?

0 votes

Non, cela ne devrait pas. Techniquement, cela ne devrait pas non plus, car nous fournissons le 'dir:libs' et non les sous-répertoires de libs.

0 votes

Dans ce cas, comment obtenir toutes les bibliothèques des sous-répertoires avec un minimum de tâches (car notre projet contient tant de sous-répertoires).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X