Come aggiungere la dipendenza di file .jar locale al file build.gradle?


608

Quindi ho provato ad aggiungere la mia dipendenza di file .jar locale al mio file build.gradle:

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

E puoi vedere che ho aggiunto i file .jar nella cartella ReferencedLibraries qui: https://github.com/WalnutiQ/wAlnut/tree/version-2.3.1/referencedLibraries

Ma il problema è che quando eseguo il comando: gradle build sulla riga di comando ottengo il seguente errore:

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

Ecco il mio intero repository: https://github.com/WalnutiQ/wAlnut/tree/version-2.3.1


Sei sicuro del runtime anziché della compilazione? compile files (....)
Gabriele Mariotti,

3
sembra che sia la compilazione della dipendenza se non è possibile creare jar. prova: compila i file ('libs / mnist-tools.jar', 'libs / gson-2.2.4.jar') se hai ancora problemi, prova i percorsi assoluti perché anche questo potrebbe essere un problema.
patrz jaka franca,

1
Questa domanda Stack Overflow mi ha finalmente dato la risposta di cui avevo bisogno.
Cranato il

Risposte:


456

Se hai davvero bisogno di prendere quel .jar da una directory locale,

Aggiungi accanto al tuo modulo gradle (non il file gradle app):

repositories {
   flatDir {
       dirs 'libs'
   }
}


dependencies {
   implementation name: 'gson-2.2.4'
}

Tuttavia, essendo un file .jar standard in un vero repository maven, perché non provi questo?

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

4
Sono venuto alla ricerca esattamente di questo, ma ho scoperto che il mio repository locale non risolve dipendenze transitive (Gradle 2.7, esempio POM è com.mojang: authlib: 1.5.21 estratto da minecraftforge.net)
Karl the Pagan,

1
Se si hanno file jar locali in più directory, è necessario aggiungerli tutti a flatDir. Es: - flatDir {dirs 'libs1', 'libs2', 'libs3'}
Dhumil Agarwal

9
Sto avendo un gradle.buildfile - Che cos'è questo "file gradle app" e il "modulo gradle"?
Lealo,

2
Qualche possibilità che qualcuno aggiorni la risposta con un link alla sezione ufficiale della documentazione Gradle che descriva queste caratteristiche?
misantropo

2
implementation(":gson:2.2.4")sembra essere il modo di farlo.
Ing

697

Secondo la documentazione , utilizzare un percorso relativo per una dipendenza jar locale come segue:

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

8
@Gubatron è documentato ora: gradle.org/docs/current/userguide/…
David Moles,

7
volevo solo aggiungere che per coloro che stanno usando percorsi relativi al nostro vaso: dipendenze {compilare file ("libs / something_local.jar"} (cioè virgolette non virgolette singole) sono necessari per Groovy per valutare il percorso. le citazioni sono prese letteralmente in Groovy.
specialk1st

Quindi sto usando la stessa cosa e ottengo un errore di compilazione (sembra che non trovi il vaso lì.) Se do il percorso assoluto, funziona bene.
RV_Dev,

Preferirei questa soluzione, ma ho scoperto che se il file non esiste, Gradle non genera alcun errore. Ho trovato questo personalmente, Vai a questa domanda SO per i dettagli: stackoverflow.com/q/42527631/4851565
entpnerd

stavo ottenendo un errore simile anche dopo aver usato questa soluzione. Errore ho inserito la cartella libs nelle app non allo stesso livello delle app
Rishabh Dugar,

315

Si potrebbe anche fare questo che includerebbe tutti i JAR nel repository locale. In questo modo non dovresti specificarlo ogni volta.

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

3
Questo è usato per compilare tutti i barattoli nella directory lib. È la soluzione perfetta (y)
Sheraz Ahmad Khilji il

1
... a meno che non si preveda di condividere quella directory libs con moduli diversi con set di dipendenze diversi, come non inserire il codice del server con il codice client o avere più di una versione di una dipendenza in un sottomodulo diverso.
Ajax,

Questa è la mia implementazione preferita rispetto alla risposta accettata perché indica esplicitamente la posizione dei file. È utile quando si fa riferimento a un repository come mavenCentral per alcune librerie e copie locali per altri. In tal caso potrebbe esserci un ritardo mentre il gradle cerca le librerie locali negli altri repository.
sabato

1
Nota che dir può essere anche un percorso assoluto. Inoltre invece di 'include' ho dovuto usare 'include'.
eriel marimon,

53

Per me funziona quanto segue:

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

Fare riferimento alla documentazione del grado .


6
risposta brillante, l'unica soluzione che ha funzionato per me dopo aver cercato per giorni
Stardust il

importante ricordare che è questo metodo se non vuoi compilare una libreria specifica con il tuo progetto, dovrai ricordarti di eliminarlo dalla cartella libs ... non mi piace questo metodo perché non vedo quale libreria ho aggiunto se non
entro

1
In che modo differisce dalla risposta di @ Nightwolf?
Trenton,

2
Impossibile trovare il metodo compile () per argomenti [directory 'libs'] sull'oggetto di tipo org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler
ieXcept,

33

Puoi provare a riutilizzare il tuo repository Maven locale per Gradle:

  • Installa il vaso nel tuo repository Maven locale:

    mvn install:install-file -Dfile=utility.jar -DgroupId=com.company -DartifactId=utility -Dversion=0.0.1 -Dpackaging=jar

  • Verifica di avere il jar installato nel tuo ~/.m2/repository Maven locale

  • Abilita il tuo repository Maven locale nel tuo build.gradlefile:

    repositories {
      mavenCentral()  
      mavenLocal()  
    }
    
    dependencies {  
      implementation ("com.company:utility:0.0.1")  
    }
    • Ora dovresti avere il vaso abilitato per l'implementazione nel tuo progetto

Questo mi ha aiutato quando tutto il resto ha fallito!
Utente3

Mentre funziona, si tratta di una soluzione e non dovrebbe essere utilizzato nell'ambiente di produzione / fase automatizzato poiché ciò aggiunge un'ulteriore dipendenza dall'avere una cartella .m2 (installazione di Maven) nel sistema di compilazione.
saurav.varma,

29

La risposta accettata è buona, tuttavia, avrei bisogno di varie configurazioni di libreria all'interno della mia build Gradle multi-progetto per utilizzare la stessa libreria Java di terze parti.

Aggiunta di ' $ rootProject.projectDir ' all'elemento percorso ' dir ' all'interno di my ' chiusura allprojects ' significava che ogni sottoprogetto faceva riferimento alla stessa directory ' libs ' e non una versione locale per quel sottoprogetto:

//gradle.build snippet
allprojects {
    ...

    repositories {
        //All sub-projects will now refer to the same 'libs' directory
        flatDir {
            dirs "$rootProject.projectDir/libs"
        }
        mavenCentral()
    }

    ...
}

EDIT di Quizzie: modificato "$ {rootProject.projectDir}" in "$ rootProject.projectDir" (funziona nella versione Gradle più recente).


2
ma come fare riferimento a questa cartella libs nel file build.gradle della libreria? Qualsiasi aiuto su questo.
giovedì

1
Basta cambiare "$ {rootProject.projectDir}" in "$ rootProject.projectDir" per farlo funzionare di nuovo.
Quizzie,

4
Assicurati di usare le virgolette doppie anziché le virgolette singole poiché quest'ultima non verrà interpolata.
FP liberamente il

1
Questo approccio mi ha aiutato.
Shreyash,

1
Tutte le risposte qui mi hanno aiutato molto. Questo modello è quello che stiamo usando e rende facile per le persone che lavorano in team semplicemente rilasciare i JAR in quella directory quando lavorano sui rami.
Lucy,

13

Una soluzione per chi utilizza Kotlin DSL

Le soluzioni aggiunte finora sono ottime per l'OP, ma non possono essere utilizzate con Kotlin DSL senza prima tradurle. Ecco un esempio di come ho aggiunto un .JAR locale alla mia build usando Kotlin DSL:

dependencies {
    compile(files("/path/to/file.jar"))
    testCompile(files("/path/to/file.jar"))
    testCompile("junit", "junit", "4.12")
}

Ricorda che se stai usando Windows, le barre rovesciate dovranno essere sfuggite:

...
compile(files("C:\\path\\to\\file.jar"))
...

E ricorda anche che le virgolette devono essere virgolette doppie, non virgolette singole.


Modifica per il 2020:

Gli aggiornamenti di Gradle sono deprecati compilee testCompilein favore di implementatione testImplementation. Quindi il blocco delle dipendenze sopra sarebbe simile a questo per le versioni Gradle attuali:

dependencies {
    implementation(files("/path/to/file.jar"))
    testImplementation(files("/path/to/file.jar"))
    testImplementation("junit", "junit", "4.12")
}

1
+1 ha funzionato per me! Sai come fare lo stesso senza dover produrre il file jar (nel caso in cui mi sia capitato di produrre il vaso)?
Kareem Jeiroudi,

2
@KareemJeiroudi Potrei fraintendere la tua domanda, ma se stai parlando di rendere un modulo una dipendenza del progetto, faresti qualcosa del genere compile(project(":MyProject")):, dove "MyProject" è definito nel tuo settings.gradlefile con qualcosa del genere include("MyProject").
Jonathan Landrum,

12

Un modo semplice per farlo è

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

compilerà tutti i file .jar nella directory libs in App.


FileTree funziona con tutte le sottodirectory nella cartella libs? Esempio alcuni barattoli all'interno di libs / sping / spring.jar, in questo caso include anche il spring .jar?
mons.

No, non lo fa. Tecnicamente non dovrebbe andare bene, dato che stiamo dando 'dir: libs' non sottodirectory di libs.
Zygote

In questo caso come ottenere tutte le librerie dalle sottodirectory con compiti minimi (perché il nostro progetto contiene così tante sottodirectory.
Mons.

Ehi @mallikgm scusa per la risposta tardiva, hai provato ad aggiungere caratteri jolly nel percorso dir come compilare fileTree (include: [' .jar'], dir: 'libs ')
ZygoteInit

2
In che modo differisce dalla risposta di @ Nightwolf?
Trenton,

8

Non ho potuto ottenere il suggerimento sopra su https://stackoverflow.com/a/20956456/1019307 per funzionare. Questo ha funzionato per me però. Per un file secondstring-20030401.jarche ho archiviato in una libs/directory nella radice del progetto:

repositories {
    mavenCentral()
    // Not everything is available in a Maven/Gradle repository.  Use a local 'libs/' directory for these.
    flatDir {
       dirs 'libs'
   }
}

...

compile name: 'secondstring-20030401'

grazie! non ho idea del perché, ma solo questo ha funzionato per me. ho creato una cartella "libs" nella radice del mio progetto, ho inserito il file .jar e ho copiato la voce "compile name". Ovviamente è stata eliminata anche l'estensione .jar.
anon58192932

No, questo non mi funziona. Impossibile trovare: miglayout-core :. Ricerca nelle seguenti posizioni: file: /user/path/to/miglayout-core.jar
Well Smith

questo lavoro se si desidera aggiungere una directory di file come repository: docs.gradle.org/current/userguide/…
Grubhart

7

Alla domanda è già stata data una risposta dettagliata. Voglio ancora aggiungere qualcosa che mi sembra molto sorprendente:

L'attività "Dipendenze graduali" non elenca dipendenze di file. Anche se potresti pensarlo, dato che dopo tutto sono stati specificati nel blocco "dipendenze".

Quindi non fare affidamento sull'output di questo per verificare se i file lib locali referenziati funzionano correttamente.


6

La soluzione che ha funzionato per me è l'uso di fileTree nel file build.gradle. Mantenere il file .jar che deve essere aggiunto come dipendenza nella cartella libs. Dare il seguente codice nel blocco dependenices in build.gradle:

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

5

Il modo migliore per farlo è aggiungerlo nel file build.gradle e premere l'opzione di sincronizzazione

dependency{
    compile files('path.jar')
}

3

Puoi aggiungere jar facendo:

Per il gradle basta inserire il seguente codice build.gradle:

dependencies {
...
compile fileTree(dir: 'lib', includes: ['suitetalk-*0.jar'])
...
}

e per Maven basta seguire i passaggi:

Per Intellij: File-> struttura del progetto-> moduli-> scheda dipendenza-> fai clic su + segno-> vaso e dipendenza-> seleziona i vasetti che vuoi importare-> ok-> applica (se visibile) -> ok

Ricorda che se hai java.lang.NoClassDefFoundError: Could not initialize classun'eccezione in fase di runtime ciò significa che le dipendenze nel vaso non sono installate per questo devi aggiungere tutte le dipendenze nel progetto padre.


0

Vai a File -> Struttura del progetto -> Moduli -> app -> Scheda Dipendenze -> Fai clic su + (pulsante) -> Seleziona dipendenza file -> Seleziona file jar nella cartella lib

Questo passaggio aggiungerà automaticamente la tua dipendenza a gralde

Molto semplice


3
È un percorso attraverso alcuni menu IDE Java? Probabilmente Idea?
Utgarda,

1
Sì, sembra qualcosa per IntelliJ IDEA e non penso che funzionerà. In alternativa, sembrerà che funzioni fino a quando non viene apportata una modifica alla configurazione di Gradle che si traduce in una "sincronizzazione" e la sincronizzazione è a senso unico da Gradle alle impostazioni IntelliJ. Non si sincronizza in altro modo - almeno non la penso così.
RenniePet,

1
Se è stata selezionata l'importazione automatica, il .JAR importato manualmente verrà rimosso alla successiva modifica in build.gradle.
Jonathan Landrum,

-1

Fai attenzione se stai utilizzando l'integrazione continua, devi aggiungere le tue librerie nello stesso percorso sul tuo server di compilazione.

Per questo motivo, preferirei aggiungere jar al repository locale e, naturalmente, fare lo stesso sul server di compilazione.


-3

Un altro modo:

Aggiungi libreria nella vista ad albero. Fai clic destro su questo. Seleziona il menu "Aggiungi come libreria". Viene visualizzata una finestra di dialogo che consente di selezionare il modulo. OK ed è fatto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.