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.

882voto

leeor Points 346

Selon la documentation, utilisez un chemin relatif pour une dépendance jar locale comme suit.

Syntaxe Groovy:

dependencies {
    implementation files('libs/something_local.jar')
}

Syntaxe Kotlin:

dependencies {
    implementation(files("libs/something_local.jar"))
}

9 votes

@Gubatron c'est maintenant documenté: gradle.org/docs/current/userguide/…

7 votes

Juste voulu ajouter que pour ceux qui utilisent des chemins relatifs vers notre jar : dépendances { compiler files("libs/something_local.jar" } (c.-à-d. guillemets doubles, pas simples) sont nécessaires pour que Groovy évalue le chemin. Les simples guillemets sont pris littéralement en Groovy.

0 votes

Donc j'utilise la même chose et j'obtiens une erreur de compilation (il semble qu'il ne trouve pas le jar là-bas.) Si je donne le chemin absolu, cela fonctionne correctement.

538voto

Jorge_B Points 2921

Si vous avez vraiment besoin de prendre ce fichier .jar depuis un répertoire local,

Ajoutez ceci à votre module gradle (pas le fichier gradle d'application):

repositories {
   flatDir {
       dirs 'libs'
   }
}

dependencies {
   implementation name: 'gson-2.2.4'
}

Cependant, étant donné qu'il s'agit d'un .jar standard dans un dépôt maven réel, pourquoi ne pas essayer ceci?

repositories {
   mavenCentral()
}
dependencies {
   implementation 'com.google.code.gson:gson:2.2.4'
}

5 votes

Je suis venu chercher exactement cela, mais j'ai trouvé que mon référentiel local ne résolvait pas les dépendances transitives. (Gradle 2.7, l'exemple de POM est com.mojang:authlib:1.5.21 tel qu'extrait par minecraftforge.net)

1 votes

Si vous avez des fichiers jar locaux dans plusieurs répertoires, vous devez les ajouter tous au flatDir. Ex :- flatDir { dirs 'libs1','libs2','libs3'}

0 votes

J'ai vu quelques autres options ci-dessous, elles ne conviennent pas à mon cas d'utilisation. La plupart des constructions sont basées sur Maven, il suffit de référencer une ou deux bibliothèques pratiques. Dans mon cas ... dossiers '/projets/lib/java'. Je préférerais une option pour obtenir Maven ou un outil similaire pour bag de telles créatures jusqu'à ce que les gens les sauvent dans un dépôt ;-)

348voto

Nightwolf Points 313

Vous pourriez également le faire de cette manière, ce qui inclurait tous les JARs dans le dépôt local. Ainsi, vous n'auriez pas à le spécifier à chaque fois.

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

3 votes

Cela est utilisé pour compiler tous les jars dans le répertoire lib. C'est la solution parfaite

1 votes

...à moins que vous ne prévoyiez de partager ce répertoire libs avec différents modules ayant différents ensembles de dépendances, comme ne pas mettre de code serveur avec du code client, ou avoir plus d'une version d'une dépendance dans un sous-module différent.

0 votes

Il s'agit de ma mise en oeuvre préférée par rapport à la réponse acceptée car elle indique explicitement l'emplacement des fichiers. C'est utile lorsque vous faites référence à un référentiel tel que mavenCentral pour certaines bibliothèques et des copies locales pour d'autres. Dans ce cas, il peut y avoir un délai pendant que Gradle recherche les bibliothèques locales dans les autres référentiels.

60voto

Misha Points 773

Le suivant fonctionne pour moi :

compile fileTree(dir: 'libs', include: '*.jar')

Se référer à la Documentation Gradle.

0 votes

Il est important de se rappeler que si vous ne voulez pas qu'une bibliothèque spécifique soit compilée avec votre projet, vous devrez vous rappeler de la supprimer du dossier des bibliothèques... Je n'aime pas cette méthode car je ne vois pas quelle bibliothèque j'ai ajoutée à moins d'entrer dans la bibliothèque.

2 votes

Comment cela est-il différent de la réponse de @Nightwolf ?

2 votes

Impossible de trouver la méthode compile() pour les arguments [répertoire 'libs'] sur un objet de type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler

45voto

Daniel Mora Points 1771

Vous pouvez essayer de réutiliser votre référentiel Maven local pour Gradle :

  • Installer le jar dans votre référentiel Maven local :

    mvn install:install-file -Dfile=utilitaire.jar -DgroupId=com.société -DartifactId=utilitaire -Dversion=0.0.1 -Dpackaging=jar

  • Vérifiez que le jar est installé dans votre référentiel Maven local ~/.m2/

  • Activez votre référentiel Maven local dans votre fichier build.gradle :

    repositories {
      mavenCentral()  
      mavenLocal()  
    }
    
    dependencies {  
      implementation ("com.société:utilitaire:0.0.1")  
    }
    • Maintenant, le jar devrait être activé pour l'implémentation dans votre projet

0 votes

Celui-ci m'a aidé lorsque tout le reste a échoué!

1 votes

Bien que ceci fonctionne, il s'agit d'une solution de contournement et ne devrait pas être utilisé dans un environnement de production/scène automatisé, car cela ajoute une dépendance supplémentaire ayant un dossier .m2 (installation de Maven) dans le système de construction.

0 votes

Lorsque j'ai essayé cela, j'ai reçu une erreur : impossible de parser le POM, déjà vu doctype. C'est lorsque j'essaie d'exécuter une commande gradle.

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