Build.gradle dosyasına yerel .jar dosyası bağımlılığı nasıl eklenir?


608

Bu yüzden build.gradle dosyasına yerel .jar dosya bağımlılığımı eklemeyi denedim:

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

Burada .jar dosyalarını başvurulan Kütüphaneler klasörüne eklediğimi görebilirsiniz: https://github.com/WalnutiQ/wAlnut/tree/version-2.3.1/referencedLibraries

Ama sorun şu komutu çalıştırdığınızda: komut satırında gradle build aşağıdaki hatayı alıyorum:

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

İşte tüm repo: https://github.com/WalnutiQ/wAlnut/tree/version-2.3.1


Derleme yerine çalışma zamanından emin misiniz? dosyaları derlemek (....)
Gabriele Mariotti

3
kavanoz inşa edilemezse derleme bağımlılığı gibi görünüyor. deneyin: hala bir sorununuz varsa dosyaları derleyin ('libs / mnist-tools.jar', 'libs / gson-2.2.4.jar') sonra sorun olabilecek mutlak yolları deneyin.
patrz jaka franca

1
Bu Stack Overflow sorusu sonunda bana ihtiyacım olan cevabı verdi.
craned

Yanıtlar:


456

Gerçekten .jar dosyasını yerel bir dizinden almanız gerekiyorsa,

Modül sınıfınızın yanına ekleyin (Uygulama sınıf dosyası değil):

repositories {
   flatDir {
       dirs 'libs'
   }
}


dependencies {
   implementation name: 'gson-2.2.4'
}

Ancak, gerçek bir maven deposunda standart bir .jar olarak, bunu neden denemiyorsunuz?

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

4
. Tam olarak bu seyir için geldi, ama benim yerel depo geçişli bağımlılıkları çözmez bulundu (: authlib: Gradle 2.7, örnek POM com.mojang olan 1.5.21 minecraftforge.net tarafından çıkarılan gibi)
Karl Pagan

1
Birden çok dizinde yerel jar dosyalarınız varsa hepsini flatDir'e eklemeniz gerekir. Örn: - flatDir {dirs 'libs1', 'libs2', 'libs3'}
Dhumil Agarwal

9
Ben bir gradle.builddosya - Bu "app gradle dosyası" ve "modül gradle" nedir?
Lealo

2
Birinin cevabı, bu özellikleri açıklayan resmi Gradle dokümantasyon bölümüne bir bağlantıyla güncelleme şansı var mı?
misanthrope

2
implementation(":gson:2.2.4")bunu yapmanın yolu gibi görünüyor.
Müh.Foad

697

Belgelere göre , yerel bir kavanoz bağımlılığı için aşağıdaki gibi göreli bir yol kullanın:

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

8
@Gubatron şimdi belgelenmiştir: gradle.org/docs/current/userguide/…
David Moles

7
sadece kavanozumuza göreli yollar kullananlara eklemek istedim: Groovy tarafından yolu değerlendirmek için bağımlılıklar {compile files ("libs / something_local.jar"} (yani tek tırnak değil çift tırnak) gereklidir. tırnak tam anlamıyla Groovy alınır.
specialk1st

Bu yüzden aynı şeyi kullanıyorum ve derleme hatası alıyorum (orada kavanoz bulamıyor gibi görünüyor.) Mutlak yol verirseniz iyi çalışır.
RV_Dev

Bu çözümü tercih ederdim, ancak dosya yoksa, Gradle tarafından herhangi bir hata çıktısı olmadığını fark ettim. Bunu şahsen buldum, Ayrıntılar için şu SO sorusuna bakın: stackoverflow.com/q/42527631/4851565
entpnerd

ben bile bu çözümü kullandıktan sonra benzer bir hata alıyordu. Hata ben libs klasörü uygulamalar ile aynı düzeyde olmayan uygulamalar altına koydu
Rishabh Dugar

314

Bunu, yerel depodaki tüm JAR'ları içerecek şekilde de yapabilirsiniz. Bu şekilde her seferinde belirtmek zorunda kalmazsınız.

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

3
Bu, lib dizinindeki tüm kavanozları derlemek için kullanılır. Mükemmel çözüm (y)
Sheraz Ahmad Khilji

1
... bu libs dizinini, sunucu kodunu istemci koduyla koymamak veya farklı alt modüllerde birden fazla bağımlılığa sahip olmak gibi farklı bağımlılık kümelerine sahip farklı modüllerle paylaşmayı planlamıyorsanız.
Ajax

Bu, dosyaların yanıtını açıkça belirttiğinden, kabul edilen yanıt üzerinde tercih ettiğim uygulama. Bazı kütüphaneler için mavenCentral ve diğerleri için yerel kopyalar gibi bir depoya başvurduğunuzda kullanışlıdır. Bu durumda, sınıf öğrencisi diğer havuzlardaki yerel kütüphaneleri ararken bir gecikme olabilir.
satbot

1
Dir komutunun da mutlak bir yol olabileceğini unutmayın. Ayrıca 'dahil' yerine 'içerir' kullanmak zorunda kaldım.
eriel marimon

53

Aşağıdakiler benim için çalışıyor:

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

Gradle Belgelerine başvurun .


6
parlak cevap, günler aradıktan sonra benim için çalışan tek çözüm
Stardust

projenizle derlemek için belirli bir kütüphane istemiyorsanız bu yöntem olduğunu hatırlamak önemlidir Eğer kütüphaneler klasöründen silmek için hatırlamak zorunda kalacak ... ben hangi kütüphane i görmüyorum çünkü bu yöntemi sevmiyorum kütüphaneye girmediğim sürece eklendi
Jesus Dimrix

1
Bunun @ Nightwolf'un cevabından farkı nedir?
Trenton

2
Türü org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler amacına argüman [dizin 'kütüphanelerini'] yöntemi derleme () bulunamadı
ieXcept

33

Gradle için yerel Maven veri havuzunuzu yeniden kullanmayı deneyebilirsiniz:

  • Kavanozu yerel Maven deponuza takın:

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

  • Kavanozu ~/.m2/yerel Maven deponuza yerleştirip yerleştirmediğinizi kontrol edin

  • build.gradleDosyanızda yerel Maven deponuzu etkinleştirin :

    repositories {
      mavenCentral()  
      mavenLocal()  
    }
    
    dependencies {  
      implementation ("com.company:utility:0.0.1")  
    }
    • Şimdi kavanozun projenizde uygulanabilmesi için etkinleştirilmiş olması gerekir

Bu, her şey başarısız olduğunda bana yardımcı oldu!
Kullanıcı3

Bu çalışırken, bu bir çözümdür ve otomatik üretim / sahne ortamında kullanılmamalıdır, çünkü bu, yapı sisteminde .m2 klasörüne (maven yüklemesi) sahip olmak için ek bir bağımlılık ekler.
saurav.varma

29

Kabul edilen cevap iyidir, ancak aynı üçüncü taraf Java kütüphanesini kullanmak için çoklu proje Gradle derlememde çeşitli kütüphane yapılandırmalarına ihtiyacım olurdu.

'Ekleme $ rootProject.projectDir ' için ' dir benim' içinde 'yol elemanı allprojects her alt proje aynı' referanslı 'kapatılması anlamına geliyordu libs ' dizini ve değil bu alt projeye yerel bir versiyonu:

//gradle.build snippet
allprojects {
    ...

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

    ...
}

Quizzie tarafından EDIT: "$ {rootProject.projectDir}", "$ rootProject.projectDir" olarak değiştirildi (en yeni Gradle sürümünde çalışır).


2
ama kütüphane build.gradle dosyasında bu libs klasörüne nasıl başvurulur? Herhangi bir yardım.
jeevs

1
Tekrar çalışmasını sağlamak için "$ {rootProject.projectDir}" öğesini "$ rootProject.projectDir" olarak değiştirmeniz yeterlidir.
Quizzie

4
Tek tırnak işaretleri yerine çift tırnak kullandığınızdan emin olun çünkü ikincisi enterpolasyon yapılmayacaktır.
FP Serbestçe

1
Bu yaklaşım bana yardımcı oldu.
Shreyash

1
Buradaki tüm cevaplar bana çok yardımcı oldu. Bu model kullandığımız modeldir ve ekiplerde çalışan kişilerin dallarda çalışırken JAR'ları bu dizine bırakmasını kolaylaştırır.
Lucy

12

Bunu yapmanın basit bir yolu

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

Uygulamadaki libs dizininizdeki tüm .jar dosyalarını derleyecektir.


FileTree, libs klasöründeki tüm alt dizinler için çalışır. Örnekler libs / sping / spring.jar içindeki birkaç kavanoz, bu durumda bahar .jar da içerir mi?
mgr

Hayır. Teknik olarak iyi olmamalı, çünkü 'dir: libs' libs alt dizinlerini değil.
ZygoteInit

Bu durumda, alt kütüphanelerden tüm kütüphanelerin asgari görevlerle nasıl elde edileceği (çünkü projemiz çok sayıda alt dizin içeriyor.
mgr

Hey @mallikgm geç cevap verdiğim için üzgünüm, derleme dosyaTree gibi dir yoluna joker karakter eklemeyi denediniz mi (include: [' .jar'], dir: 'libs ')
ZygoteInit

2
Bunun @ Nightwolf'un cevabından farkı nedir?
Trenton

12

Kotlin DSL kullananlar için bir çözüm

Şimdiye kadar eklenen çözümler OP için harika, ancak Kotlin DSL ile ilk önce çevrilmeden kullanılamaz. Kotlin DSL kullanarak derleme nasıl yerel bir .JAR eklediğime bir örnek:

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

Windows'u kullanıyorsanız, ters eğik çizgilerinizden kaçılması gerektiğini unutmayın:

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

Ayrıca, tırnak işaretleri tek tırnak değil çift tırnak olmalıdır.


2020 için düzenle:

Gradle güncellemeler kaldırılan gelmiş compileve testCompilelehine implementationve testImplementation. Yukarıdaki bağımlılık bloğu, mevcut Gradle sürümleri için şu şekilde görünecektir:

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

1
+1 benim için çalıştı! Kavanoz dosyasını üretmek zorunda kalmadan aynı şeyi nasıl yapacağınızı biliyor musunuz (kavanozu ürettiğimde)?
Kareem Jeiroudi

2
@KareemJeiroudi Sorunuzu yanlış anlıyor olabilirim, ancak bir modülü projenin bağımlılığı yapmaktan bahsediyorsanız, şöyle bir şey yaparsınız: compile(project(":MyProject"))Burada settings.gradledosyanızda "Projem" gibi bir şey tanımlanır include("MyProject").
Jonathan Landrum

8

Çalışmak için https://stackoverflow.com/a/20956456/1019307 adresinden yukarıdaki öneriyi alamadım . Bu benim için çalıştı. Projenin kök dizininde secondstring-20030401.jarsakladığım bir dosya libs/için:

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'

teşekkür ederim! hiçbir fikrim yok ama sadece bu benim için çalıştı. proje kökümde bir 'libs' klasörü oluşturdu, orada .jar dosyasını itti ve 'derleme adı' girişinizi kopyaladı. Elbette .jar uzantısını da bıraktı.
anon58192932

Hayır, bu işe yaramıyor Miglayout-core :. Aşağıdaki konumlarda arandı: dosya: /user/path/to/miglayout-core.jar
Well Smith

depo olarak bir dosya dizini eklemek istiyorsanız bu çalışma: docs.gradle.org/current/userguide/…
Grubhart

7

Soru zaten ayrıntılı olarak cevaplanmıştır. Hala bana çok şaşırtıcı gelen bir şey eklemek istiyorum:

"Sınıfta bağımlılıklar" görevi dosya bağımlılıklarını listelemez. Öyle olsa da, "bağımlılıklar" bloğunda belirtildiği gibi, sonuçta ..

Bu nedenle, başvurulan yerel lib dosyalarınızın doğru çalışıp çalışmadığını kontrol etmek için bunun çıktısına güvenmeyin.


6

Benim için çalışan çözüm build.gradle dosyasında fileTree kullanımıdır. Libs klasörüne bağımlılık olarak eklenmesi gereken .jar dosyasını saklayın. Build.gradle dosyasındaki blokta aşağıdaki kodu verin:

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

5

Bunu yapmanın en iyi yolu bunu build.gradle dosyanıza eklemek ve senkronizasyon seçeneğine basmaktır

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

3

Kavanoz ekleyerek şunları yapabilirsiniz:

Gradle için sadece aşağıdaki kodu koyun build.gradle:

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

ve maven için sadece adımları izleyin:

Intellij için: Dosya-> proje yapısı-> modüller-> bağımlılık sekmesi-> + işaret-> kavanoz ve bağımlılık-> almak istediğiniz kavanozları seçin-> tamam-> uygula (görünürse) -> tamam

Çalışma java.lang.NoClassDefFoundError: Could not initialize classzamanında herhangi bir istisnanız varsa, bu, kavanozdaki bağımlılıkların yüklenmediği anlamına gelir, üst projedeki tüm bağımlılıkları eklemeniz gerekir.


0

Dosyaya Git -> Proje Yapısı -> Modüller -> app -> Bağımlılıklar Sekmesi -> + (düğme) -> Dosya Bağımlılığını Seç -> lib klasöründeki jar dosyasını seç

Bu adımlar gralde bağımlılığınızı otomatik olarak ekleyecektir

Çok basit


3
Bu bazı Java IDE menülerinde bir yol mu? Muhtemelen Fikir?
Utgarda

1
Evet, IntelliJ IDEA için bir şey gibi görünüyor ve işe yarayacağını sanmıyorum. Veya, Gradle kurulumunda bir "senkronizasyon" yapılmasına neden olan ve senkronizasyon Gradle'dan IntelliJ ayarlarına tek yönlü olana kadar çalıştığı gibi görünecektir. Diğer yolla senkronize değil - en azından ben öyle düşünmüyorum.
RenniePet

1
Otomatik içe aktarmayı seçtiyseniz, manuel olarak içe aktarılan .JAR, bir sonraki değişiklikte kaldırılır build.gradle.
Jonathan Landrum

-1

Sürekli entegrasyon kullanıyorsanız, kitaplıklarınızı derleme sunucunuzda aynı yola eklemeniz gerekir.

Bu nedenle, yerel depoya kavanoz eklemeyi tercih ediyorum ve tabii ki yapı sunucusunda da aynısını yapıyorum.


-3

Diğer yol:

Ağaç görünümünde kütüphane ekleyin. Buna sağ tıklayın. "Kitaplık Olarak Ekle" menüsünü seçin. Bir iletişim kutusu belirir, modülü seçmenize izin verir. Tamam ve bitti.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.