Jak dodać zależność lokalnego pliku .jar do pliku build.gradle?

605

Próbowałem więc dodać moją lokalną zależność pliku .jar do mojego pliku 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')
} 

I widać, że dodałem pliki .jar do folderu referencedLibraries tutaj: https://github.com/WalnutiQ/wAlnut/tree/version-2.3.1/referencedLibraries

Problem polega jednak na tym, że po uruchomieniu polecenia: gradle build w wierszu polecenia pojawia się następujący błąd:

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

Oto moje całe repozytorium: https://github.com/WalnutiQ/wAlnut/tree/version-2.3.1

Wang-Zhao-Liu QM
źródło
Czy na pewno chcesz uruchomić środowisko zamiast kompilować? skompiluj pliki (....)
Gabriele Mariotti
3
wygląda na to, że jest zależna od kompilacji, jeśli jar nie może zostać zbudowany. spróbuj: skompiluj pliki („libs / mnist-tools.jar”, ​​„libs / gson-2.2.4.jar”), jeśli nadal masz problem, wypróbuj ścieżki bezwzględne, ponieważ może to być również problem.
patrz jaka franca
1
To pytanie dotyczące przepełnienia stosu w końcu dało mi odpowiedź, której potrzebowałem.
wyciągnął

Odpowiedzi:

455

Jeśli naprawdę musisz pobrać plik .jar z katalogu lokalnego,

Dodaj obok oceny modułu (nie pliku oceny aplikacji):

repositories {
   flatDir {
       dirs 'libs'
   }
}


dependencies {
   implementation name: 'gson-2.2.4'
}

Jednak będąc standardowym plikiem .jar w prawdziwym repozytorium maven, dlaczego tego nie spróbujesz?

repositories {
   mavenCentral()
}
dependencies {
   implementation 'com.google.code.gson:gson:2.2.4'
}
Jorge_B
źródło
4
Przyszedłem szukać dokładnie tego, ale okazało się, że moje lokalne repozytorium nie rozwiązuje zależności przechodnie. (Gradle 2.7, przykład POM to com.mojang: authlib: 1.5.21 wyodrębniony przez minecraftforge.net)
Karl the Pagan
1
Jeśli masz lokalne pliki jar w wielu katalogach, musisz dodać je wszystkie do flatDir. Np .: - flatDir {dirs 'libs1', 'libs2', 'libs3'}
Dhumil Agarwal
9
Mam gradle.buildplik - co to jest „plik oceny aplikacji” i „ocena modułu”?
Lealo,
2
Czy jest jakaś szansa, że ​​ktoś zaktualizuje odpowiedź linkiem do oficjalnej sekcji dokumentacji Gradle opisującej te funkcje?
misantrop
2
implementation(":gson:2.2.4")wydaje się być na to sposobem.
Eng.Fouad
697

Zgodnie z dokumentacją użyj ścieżki względnej dla lokalnej zależności jar w następujący sposób:

dependencies {
    implementation files('libs/something_local.jar')
}
leeor
źródło
8
@Gubatron jest teraz udokumentowane: gradle.org/docs/current/userguide/…
David Moles
7
chciałem tylko dodać, że dla tych, którzy używają względnych ścieżek do naszego jar: zależności {kompilacja plików („libs / coś_lokalny.jar”}) (tj. podwójne cudzysłowy, a nie pojedyncze cudzysłowy) są potrzebne Groovy do oceny ścieżki. cytaty są brane dosłownie w Groovy.
specialk1st
Używam tego samego i pojawia się błąd kompilacji (wygląda na to, że nie znajduje tam słoika). Jeśli podam bezwzględną ścieżkę, działa dobrze.
RV_Dev
Wolałbym to rozwiązanie, ale stwierdziłem, że jeśli plik nie istnieje, Gradle nie wyświetla żadnego błędu. Znalazłem to osobiście, zobacz to pytanie SO szczegóły: stackoverflow.com/q/42527631/4851565
entpnerd
Otrzymałem podobny błąd, nawet po użyciu tego rozwiązania. Pomyłka: umieściłem folder libs w aplikacjach na
innym
314

Możesz to również zrobić, co obejmowałoby wszystkie pliki JAR w lokalnym repozytorium. W ten sposób nie będziesz musiał tego określać za każdym razem.

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}
Nocny Wilk
źródło
3
Służy do kompilacji wszystkich słoików w katalogu lib. Jest to idealne rozwiązanie (y)
Sheraz Ahmad Khilji
1
... chyba że planujesz współużytkować ten katalog libs z różnymi modułami o różnych zestawach zależności, takich jak niewprowadzanie kodu serwera do kodu klienta lub posiadanie więcej niż jednej wersji zależności w innym podmodule.
Ajax
To jest moja preferowana implementacja w stosunku do zaakceptowanej odpowiedzi, ponieważ wyraźnie określa lokalizację plików. Jest to przydatne, gdy odwołujesz się do repozytorium, takiego jak mavenCentral dla niektórych bibliotek i lokalnych kopii dla innych. W takim przypadku może wystąpić opóźnienie podczas wyszukiwania przez biblioteki lokalne w innych repozytoriach.
satbot
1
Pamiętaj, że katalog może być również ścieżką absolutną. Również zamiast „dołącz” musiałem użyć „obejmuje”.
eriel marimon
53

Poniższe działa dla mnie:

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

Zobacz dokumentację Gradle .

Misza
źródło
6
genialna odpowiedź, jedyne rozwiązanie, które zadziałało dla mnie po wielu dniach
Stardust
ważne jest, aby pamiętać, że jest to ta metoda, jeśli nie chcesz, aby konkretna biblioteka kompilowała się z twoim projektem, musisz pamiętać o usunięciu jej z folderu libs ... nie podoba mi się ta metoda, ponieważ nie widzę, która biblioteka dodane, chyba że
wejdę
1
Czym różni się to od odpowiedzi @ Nightwolf?
Trenton
2
Nie można znaleźć metody compile () dla argumentów [katalog 'libs'] na obiekcie typu org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler
tj
33

Możesz spróbować ponownie użyć lokalnego repozytorium Maven dla Gradle:

  • Zainstaluj słoik w lokalnym repozytorium Maven:

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

  • Sprawdź, czy słoik jest zainstalowany w ~/.m2/lokalnym repozytorium Maven

  • Włącz lokalne repozytorium Maven w swoim build.gradlepliku:

    repositories {
      mavenCentral()  
      mavenLocal()  
    }
    
    dependencies {  
      implementation ("com.company:utility:0.0.1")  
    }
    • Teraz powinieneś mieć włączony jar do implementacji w swoim projekcie
Daniel Mora
źródło
Ten pomógł mi, gdy wszystko inne zawiodło!
Użytkownik3
Chociaż to działa, jest to obejście i nie powinno być używane w zautomatyzowanym środowisku produkcyjnym / scenicznym, ponieważ powoduje to dodatkową zależność posiadania folderu .m2 (instalacja maven) w systemie kompilacji.
saurav.varma
29

Przyjęta odpowiedź jest dobra, jednak potrzebowałbym różnych konfiguracji bibliotek w mojej wieloprojektowej wersji Gradle, aby korzystać z tej samej biblioteki Java innej firmy.

Dodanie „ $ rootProject.projectDir ” do elementu ścieżki „ dir ” w moim zamknięciu „ allprojects ” oznaczało, że każdy podprojekt odwoływał się do tego samego katalogu „ libs ”, a nie wersji lokalnej dla tego podprojektu:

//gradle.build snippet
allprojects {
    ...

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

    ...
}

EDIT by Quizzie: zmieniono „$ {rootProject.projectDir}” na „$ rootProject.projectDir” (działa w najnowszej wersji Gradle).

Big Rich
źródło
2
ale jak odwołać się do tego folderu libs w bibliotece build.gradle? Jakakolwiek pomoc w tym zakresie.
jeevs
1
Wystarczy zmienić „$ {rootProject.projectDir}” na „$ rootProject.projectDir”, aby znów działał.
Quizzie
4
Pamiętaj, aby używać podwójnych cudzysłowów zamiast pojedynczych cudzysłowów, ponieważ te ostatnie nie będą interpolowane.
FP Freely
1
To podejście pomogło mi.
Shreyash
1
Wszystkie odpowiedzi tutaj bardzo mi pomogły. Używamy tego wzorca i ułatwia on osobom pracującym w zespołach po prostu upuszczenie plików JAR do tego katalogu podczas pracy nad oddziałami.
Lucy,
12

Prostym sposobem na to jest

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

skompiluje wszystkie pliki .jar w katalogu libs w aplikacji.

ZygoteInit
źródło
Czy fileTree działa dla wszystkich podkatalogów w folderze libs. Przykład kilka słoików w pliku libs / sping / spring.jar, czy w tym przypadku zawiera on również plik .jar?
mgr
Nie, nie ma. Technicznie nie powinno tak dobrze, ponieważ podajemy „dir: libs”, a nie podkatalogi libs.
ZygoteInit
W tym przypadku, jak uzyskać wszystkie biblioteki z podkatalogów przy minimalnych zadaniach (ponieważ nasz projekt zawiera tak wiele podkatalogów.
mgr
Hej @mallikgm przepraszam za spóźnioną odpowiedź, czy próbowałeś dodać symbol wieloznaczny w ścieżce katalogu jak kompilacja fileTree (obejmują: [' .jar'], reż: 'libs ')
ZygoteInit
2
Czym różni się to od odpowiedzi @ Nightwolf?
Trenton
10

Rozwiązanie dla osób korzystających z Kotlin DSL

Rozwiązania dodane do tej pory są świetne dla OP, ale nie można ich używać z DSL Kotlin bez uprzedniej ich tłumaczenia. Oto przykład, w jaki sposób dodałem lokalny plik .JAR do mojej kompilacji za pomocą DSL Kotlin:

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

Pamiętaj, że jeśli używasz systemu Windows, odwrotne ukośniki będą musiały być poprzedzone znakami ucieczki:

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

Pamiętaj też, że cudzysłowy muszą być podwójnymi, a nie pojedynczymi.


Edytuj na 2020 r .:

Aktualizacje stopni były przestarzałe compilei testCompilena rzecz implementationoraz testImplementation. Tak więc powyższy blok zależności wyglądałby tak dla bieżących wersji Gradle:

dependencies {
    implementation(files("/path/to/file.jar"))
    testImplementation(files("/path/to/file.jar"))
    testImplementation("junit", "junit", "4.12")
}
Jonathan Landrum
źródło
1
+1 zadziałało dla mnie! Czy wiesz, jak to zrobić bez konieczności tworzenia pliku jar (na wypadek, gdyby mi się przydarzyło)?
Kareem Jeiroudi
2
@KareemJeiroudi Mogę nie rozumieć twojego pytania, ale jeśli mówisz o uczynieniu modułu zależnym od projektu, zrobiłbyś coś takiego: compile(project(":MyProject"))gdzie „MyProject” jest zdefiniowany w twoim settings.gradlepliku z czymś podobnym include("MyProject").
Jonathan Landrum
8

Nie mogłem uzyskać powyższej sugestii na https://stackoverflow.com/a/20956456/1019307 do pracy. To zadziałało dla mnie. W przypadku pliku secondstring-20030401.jarzapisanego w libs/katalogu w katalogu głównym projektu:

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'
HankCa
źródło
Dziękuję Ci! nie mam pojęcia dlaczego, ale tylko to działało dla mnie. utworzyłem folder „libs” w katalogu głównym mojego projektu, umieściłem tam plik .jar i skopiowałem wpis „nazwa kompilacji”. Oczywiście też upuściłem rozszerzenie .jar.
anon58192932,
Nie, to mi nie działa Nie można znaleźć: miglayout-core :. Szukano w następujących lokalizacjach: plik: /user/path/to/miglayout-core.jar
Well Smith
ta praca, jeśli chcesz dodać katalog plików jako repozytorium: docs.gradle.org/current/userguide/…
Grubhart
7

Odpowiedź na to pytanie została już szczegółowo wyjaśniona. Nadal chcę dodać coś, co wydaje mi się bardzo zaskakujące:

Zadanie „gradle dependencies” nie wyświetla żadnych zależności plików. Nawet jeśli możesz tak myśleć, ponieważ zostały one określone w bloku „zależności”.

Więc nie polegaj na wynikach tego, aby sprawdzić, czy Twoje lokalne pliki lib działają poprawnie.

icyerasor
źródło
6

Rozwiązaniem, które działało dla mnie, jest użycie fileTree w pliku build.gradle. Zachowaj plik .jar, który należy dodać jako zależność w folderze libs. Podaj poniższy kod w bloku zależności w build.gradle:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}
Jince Martin
źródło
5

Najlepszym sposobem na to jest dodanie tego do pliku build.gradle i wybranie opcji synchronizacji

dependency{
    compile files('path.jar')
}
saunlogan
źródło
3

Możesz dodać słoik robiąc:

Dla grad po prostu wstaw następujący kod build.gradle:

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

a dla maven wykonaj następujące kroki:

W przypadku Intellij: Plik-> struktura projektu-> moduły-> karta zależności-> kliknij + znak-> jar i zależność-> wybierz słoiki, które chcesz zaimportować-> ok-> zastosuj (jeśli jest widoczny) -> ok

Pamiętaj, że jeśli masz jakiś java.lang.NoClassDefFoundError: Could not initialize classwyjątek w czasie wykonywania, oznacza to, że zależności w słoiku niezainstalowane, musisz dodać wszystkie zależności w projekcie nadrzędnym.

ankit
źródło
0

Idź do pliku -> Struktura projektu -> Moduły -> aplikacja -> karta Zależności -> Kliknij + (przycisk) -> Wybierz zależność pliku -> Wybierz plik jar w folderze lib

Te kroki automatycznie dodadzą twoją zależność do gralde

Bardzo prosta

Jaya
źródło
3
Czy to ścieżka przez niektóre menu Java IDE? Prawdopodobnie pomysł?
Utgarda
1
Tak, to wygląda na coś dla IntelliJ IDEA i nie sądzę, żeby to zadziałało. Lub będzie wyglądać, jakby działał, dopóki nie zostanie wprowadzona zmiana w konfiguracji Gradle, która spowoduje „synchronizację”, a synchronizacja będzie jednokierunkowa od Gradle do ustawień IntelliJ. Nie synchronizuje się w drugą stronę - przynajmniej tak mi się wydaje.
RenniePet
1
Jeśli masz zaznaczony automatyczny import, ręcznie importowany plik .JAR zostanie usunięty przy następnej zmianie na build.gradle.
Jonathan Landrum
-1

Zachowaj ostrożność, jeśli używasz ciągłej integracji, musisz dodać biblioteki w tej samej ścieżce na serwerze kompilacji.

Z tego powodu wolę dodać jar do lokalnego repozytorium i oczywiście zrobić to samo na serwerze kompilacji.

Akostha
źródło
-3

Inny sposób:

Dodaj bibliotekę w widoku drzewa. Kliknij ten przycisk prawym przyciskiem myszy. Wybierz menu „Dodaj jako bibliotekę”. Pojawi się okno dialogowe pozwalające wybrać moduł. OK i gotowe.

YannXplorer
źródło