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


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

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

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

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 .


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

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).


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.


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

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'

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.


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

5

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

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

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.


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


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.


-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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.