Bagaimana cara menambahkan ketergantungan file .jar lokal ke file build.gradle?

608

Jadi saya telah mencoba menambahkan ketergantungan file .jar lokal saya ke file build.gradle saya:

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

Dan Anda dapat melihat bahwa saya menambahkan file .jar ke folder direferensikan Library di sini: https://github.com/WalnutiQ/wAlnut/tree/version-2.3.1/referencedLibraries

Tetapi masalahnya adalah ketika saya menjalankan perintah: gradle build pada baris perintah saya mendapatkan kesalahan berikut:

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

Inilah seluruh repo saya: https://github.com/WalnutiQ/wAlnut/tree/version-2.3.1

Wang-Zhao-Liu QM
sumber
Apakah Anda yakin tentang runtime alih-alih kompilasi? kompilasi file (....)
Gabriele Mariotti
3
sepertinya ini kompilasi ketergantungan jika toples tidak dapat dibangun. coba: kompilasi file ('libs / mnist-tools.jar', 'libs / gson-2.2.4.jar') jika Anda masih memiliki masalah, maka cobalah jalur absolut karena mungkin juga menjadi masalah.
patrz jaka franca
1
Ini pertanyaan Stack Overflow akhirnya memberi saya jawaban yang saya butuhkan.
derek

Jawaban:

456

Jika Anda benar-benar perlu mengambil .jar itu dari direktori lokal,

Tambahkan di sebelah gradel modul Anda (Bukan file gradle aplikasi):

repositories {
   flatDir {
       dirs 'libs'
   }
}


dependencies {
   implementation name: 'gson-2.2.4'
}

Namun, sebagai standar .jar dalam repositori maven yang sebenarnya, mengapa Anda tidak mencoba ini?

repositories {
   mavenCentral()
}
dependencies {
   implementation 'com.google.code.gson:gson:2.2.4'
}
Jorge_B
sumber
4
Saya datang mencari persis ini, tetapi saya menemukan bahwa repositori lokal saya tidak menyelesaikan dependensi transitif (Gradle 2.7, contoh POM adalah com.mojang: authlib: 1.5.21 seperti yang diekstrak oleh minecraftforge.net)
Karl the Pagan
1
Jika Anda memiliki file jar lokal di banyak direktori, Anda perlu menambahkan semuanya ke flatDir. Contoh: - flatDir {dirs 'libs1', 'libs2', 'libs3'}
Dhumil Agarwal
9
Saya memiliki gradle.buildfile - Apa ini "file app gradle" dan "module gradle"?
Lealo
2
Adakah kemungkinan seseorang akan memperbarui jawabannya dengan tautan ke bagian dokumentasi Gradle resmi yang menjelaskan fitur-fitur ini?
misanthrope
2
implementation(":gson:2.2.4")tampaknya menjadi cara untuk melakukannya.
Eng.Fouad
697

Menurut dokumentasi , gunakan jalur relatif untuk ketergantungan stoples lokal sebagai berikut:

dependencies {
    implementation files('libs/something_local.jar')
}
leeor
sumber
8
@Gatronron itu telah didokumentasikan sekarang: gradle.org/docs/current/userguide/…
David Moles
7
hanya ingin menambahkan bahwa bagi mereka yang menggunakan jalur relatif ke jar kami: dependencies {compile file ("libs / something_local.jar"} (yaitu tanda kutip ganda bukan tanda kutip tunggal) diperlukan oleh Groovy untuk mengevaluasi jalur. Single- kutipan diambil secara harfiah dalam Groovy.
specialk1st
Jadi saya menggunakan hal yang sama dan saya mendapatkan kesalahan kompilasi (sepertinya tidak menemukan toples di sana.) Jika saya memberikan path absolut itu berfungsi dengan baik.
RV_Dev
Saya lebih suka solusi ini, tetapi saya telah menemukan bahwa jika file tidak ada, tidak ada kesalahan yang dihasilkan oleh Gradle. Saya telah menemukan ini secara pribadi, Lihat pertanyaan SO ini untuk detail: stackoverflow.com/q/42527631/4851565
entpnerd
saya mendapatkan kesalahan yang sama bahkan setelah menggunakan solusi ini. Kesalahan saya memang meletakkan folder libs di bawah aplikasi yang tidak setingkat aplikasi
Rishabh Dugar
315

Anda juga bisa melakukan ini yang akan mencakup semua JAR di repositori lokal. Dengan cara ini Anda tidak perlu menentukannya setiap waktu.

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}
Serigala malam
sumber
3
Ini digunakan untuk mengkompilasi semua guci di direktori lib. Ini solusi sempurna (y)
Sheraz Ahmad Khilji
1
... kecuali Anda berencana untuk membagikan direktori libs dengan modul berbeda yang memiliki rangkaian dependensi berbeda, seperti tidak memasukkan kode server dengan kode klien, atau memiliki lebih dari satu versi dependensi pada sub-modul yang berbeda.
Ajax
Ini adalah implementasi yang saya sukai daripada jawaban yang diterima karena secara eksplisit menyatakan lokasi file. Ini berguna ketika Anda merujuk ke repositori seperti mavenCentral untuk beberapa perpustakaan dan salinan lokal untuk yang lain. Dalam hal ini mungkin ada kelambatan saat gradle mencari perpustakaan lokal di repositori lain.
satbot
1
Perhatikan bahwa dir dapat menjadi jalur absolut juga. Juga alih-alih 'termasuk' saya harus menggunakan 'termasuk'.
eriel marimon
53

Berikut ini berfungsi untuk saya:

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

Lihat Dokumentasi Gradle .

Misha
sumber
6
jawaban cemerlang, satu-satunya solusi yang bekerja untuk saya setelah mencari berhari
Stardust
Penting untuk diingat bahwa ini adalah metode ini jika Anda tidak ingin perpustakaan khusus untuk dikompilasi dengan proyek Anda, Anda harus ingat untuk menghapusnya dari folder libs ... saya tidak suka metode ini karena saya tidak melihat perpustakaan mana yang saya ditambahkan kecuali saya masuk ke perpustakaan
Jesus Dimrix
1
Bagaimana ini berbeda dari jawaban @ Nightwolf?
Trenton
2
Tidak dapat menemukan metode kompilasi () untuk argumen [direktori 'libs'] pada objek bertipe org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler
ieXcept
33

Anda dapat mencoba menggunakan repositori Maven lokal Anda untuk Gradle:

  • Pasang toples ke dalam repositori Maven lokal Anda:

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

  • Periksa apakah Anda telah memasang toples ke ~/.m2/repositori Maven lokal Anda

  • Aktifkan repositori Maven lokal Anda di build.gradlefile Anda :

    repositories {
      mavenCentral()  
      mavenLocal()  
    }
    
    dependencies {  
      implementation ("com.company:utility:0.0.1")  
    }
    • Sekarang Anda harus mengaktifkan toples untuk implementasi dalam proyek Anda
Daniel Mora
sumber
Yang ini membantu saya ketika semuanya gagal!
Pengguna3
Walaupun ini bekerja, ini adalah pekerjaan di sekitar dan tidak boleh digunakan dalam lingkungan tahap produksi / otomatis karena ini menambah ketergantungan tambahan memiliki folder .m2 (instalasi maven) dalam sistem build.
saurav.varma
29

Jawaban yang diterima baik, namun, saya akan memerlukan berbagai konfigurasi perpustakaan dalam membangun multi-proyek Gradle saya untuk menggunakan perpustakaan Java pihak ketiga yang sama.

Menambahkan ' $ rootProject.projectDir ' ke elemen path ' dir ' di dalam penutupan ' allprojects ' saya berarti setiap sub-proyek mereferensikan direktori ' libs ' yang sama , dan bukan versi lokal ke sub-proyek itu:

//gradle.build snippet
allprojects {
    ...

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

    ...
}

EDIT oleh Quizzie: diubah "$ {rootProject.projectDir}" menjadi "$ rootProject.projectDir" (berfungsi dalam versi Gradle terbaru).

Kaya Besar
sumber
2
tetapi bagaimana merujuk folder libs ini di file build.gradle library? Ada bantuan untuk itu.
ampun
1
Cukup ubah "$ {rootProject.projectDir}" menjadi "$ rootProject.projectDir" untuk membuatnya berfungsi kembali.
Quizzie
4
Pastikan untuk menggunakan tanda kutip ganda daripada tanda kutip tunggal karena yang terakhir tidak akan diinterpolasi.
FP Secara Bebas
1
Pendekatan ini membantu saya.
Shreyash
1
Semua jawaban di sini banyak membantu saya. Pola ini adalah salah satu yang kami gunakan dan memudahkan orang yang bekerja dalam tim untuk memasukkan JAR ke direktori itu saat bekerja di cabang.
Lucy
13

Solusi bagi mereka yang menggunakan Kotlin DSL

Solusi yang ditambahkan sejauh ini sangat bagus untuk OP, tetapi tidak dapat digunakan dengan Kotlin DSL tanpa terlebih dahulu menerjemahkannya. Berikut ini contoh bagaimana saya menambahkan .JAR lokal ke bangunan saya menggunakan Kotlin DSL:

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

Ingat bahwa jika Anda menggunakan Windows, garis miring terbalik Anda harus diloloskan:

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

Dan juga ingat bahwa tanda kutip harus berupa tanda kutip ganda, bukan tanda kutip tunggal.


Edit untuk 2020:

Pembaruan gradle telah usang compiledan testCompilemendukung implementationdan testImplementation. Jadi blok ketergantungan di atas akan terlihat seperti ini untuk versi Gradle saat ini:

dependencies {
    implementation(files("/path/to/file.jar"))
    testImplementation(files("/path/to/file.jar"))
    testImplementation("junit", "junit", "4.12")
}
Jonathan Landrum
sumber
1
+1 bekerja untuk saya! Apakah Anda tahu cara melakukan hal yang sama tanpa harus menghasilkan file jar (kalau-kalau saya yang memproduksi jar)?
Kareem Jeiroudi
2
@KareemJeiroudi Saya mungkin salah mengerti pertanyaan Anda, tetapi jika Anda berbicara tentang membuat modul sebagai ketergantungan proyek, Anda akan melakukan sesuatu seperti ini compile(project(":MyProject")):, di mana "MyProject" didefinisikan dalam settings.gradlefile Anda dengan sesuatu seperti include("MyProject").
Jonathan Landrum
12

Cara sederhana untuk melakukan ini adalah

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

itu akan mengkompilasi semua file .jar di direktori libs Anda di App.

ZygoteInit
sumber
Apakah fileTree berfungsi untuk semua subdirektori dalam folder libs. Contoh beberapa toples di dalam libs / sping / spring.jar, dalam hal ini apakah termasuk spring .jar juga?
mgr
Tidak, tidak. Secara teknis tidak seharusnya, karena kita memberikan 'dir: libs' bukan subdirektori dari libs.
ZygoteInit
Dalam hal ini cara mendapatkan semua perpustakaan dari subdirektori dengan tugas minimum (karena proyek kami berisi banyak subdirektori.
mgr
Hey @mallikgm maaf atas keterlambatan balasan, apakah Anda mencoba menambahkan wildcard di path dir seperti kompilasi fileTree (termasuk: [' .jar'], dir: 'libs ')
ZygoteInit
2
Bagaimana ini berbeda dari jawaban @ Nightwolf?
Trenton
8

Saya tidak bisa mendapatkan saran di atas di https://stackoverflow.com/a/20956456/1019307 agar berfungsi. Ini berhasil bagi saya. Untuk file secondstring-20030401.jaryang saya simpan di libs/direktori di root proyek:

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
sumber
Terima kasih! tidak tahu mengapa tetapi hanya ini yang berhasil untuk saya. membuat folder 'libs' di root proyek saya, mendorong .jar di sana, dan menyalin entri 'compile name' Anda. Menjatuhkan ekstensi .jar juga tentunya.
anon58192932
Nah, ini tidak berhasil saya Tidak dapat menemukan: miglayout-core :. Dicari di lokasi berikut: file: /user/path/to/miglayout-core.jar
Well Smith
ini berfungsi jika Anda ingin menambahkan direktori file sebagai repositori: docs.gradle.org/current/userguide/…
Grubhart
7

Pertanyaan sudah dijawab secara terperinci. Saya masih ingin menambahkan sesuatu yang tampaknya sangat mengejutkan bagi saya:

Tugas "dependensi gradle" tidak mencantumkan dependensi file apa pun. Meskipun Anda mungkin berpikir begitu, karena mereka telah ditentukan di blok "dependensi" setelah semua ..

Jadi jangan mengandalkan output ini untuk memeriksa apakah file lib lokal yang Anda referensikan berfungsi dengan benar.

icyerasor
sumber
6

Solusi yang berhasil bagi saya adalah penggunaan fileTree di file build.gradle. Simpan .jar yang perlu ditambahkan sebagai dependensi di folder libs. Berikan kode di bawah ini di blok dependen di build.gradle:

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

Cara terbaik untuk melakukannya adalah menambahkan ini di file build.gradle Anda dan tekan opsi sinkronisasi

dependency{
    compile files('path.jar')
}
sauna
sumber
3

Anda dapat menambahkan toples:

Untuk gradle cukup masukkan kode berikut build.gradle:

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

dan untuk pakar saja ikuti langkah-langkah:

Untuk Intellij: File-> struktur proyek-> modul-> dependensi tab-> klik + tanda-> jar dan dependensi-> pilih guci yang ingin Anda impor-> ok-> terapkan (jika terlihat) -> ok

Ingatlah bahwa jika Anda mendapatkan java.lang.NoClassDefFoundError: Could not initialize classpengecualian pada saat runtime, ini berarti bahwa dependensi dalam jar tidak diinstal untuk itu Anda harus menambahkan semua dependecies di proyek induk.

ankit
sumber
0

File Goto -> Struktur Proyek -> Modul -> aplikasi -> Tab Dependensi -> Klik + (tombol) -> Pilih Ketergantungan File -> Pilih file jar di folder lib

Langkah-langkah ini secara otomatis akan menambah ketergantungan Anda ke gralde

Sangat sederhana

Jaya
sumber
3
Apakah itu jalan melalui beberapa menu IDE Java? Mungkin ide?
Utgarda
1
Ya, itu terlihat seperti sesuatu untuk IntelliJ IDEA, dan saya pikir itu tidak akan berhasil. Atau, ini akan terlihat berfungsi sampai perubahan dibuat pada pengaturan Gradle yang menghasilkan "sinkronisasi" yang dilakukan, dan sinkronisasi satu arah dari Gradle ke pengaturan IntelliJ. Itu tidak menyinkronkan dengan cara lain - setidaknya saya tidak berpikir begitu.
RenniePet
1
Jika Anda memiliki impor otomatis yang dipilih, .JAR yang diimpor secara manual akan dihapus pada perubahan selanjutnya ke build.gradle.
Jonathan Landrum
-1

Hati-hati jika Anda menggunakan integrasi berkelanjutan, Anda harus menambahkan perpustakaan di jalur yang sama di server build Anda.

Untuk alasan ini, saya lebih suka menambahkan toples ke repositori lokal dan, tentu saja, melakukan hal yang sama pada server build.

Akostha
sumber
-3

Cara lain:

Tambahkan perpustakaan di tampilan bagan. Klik kanan yang ini. Pilih menu "Tambah Sebagai Perpustakaan". Sebuah dialog muncul, biarkan Anda memilih modul. OK dan sudah selesai.

YannXplorer
sumber