Як додати локальну залежність .jar до файлу build.gradle?


605

Тому я спробував додати свою локальну залежність від .jar до мого файлу 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')
} 

І ви бачите, що я додав тут файли .jar у папку referencedLibraries: https://github.com/WalnutiQ/wAlnut/tree/version-2.3.1/referencedLibraries

Але проблема полягає в тому, що при запуску команди: gradle build в командному рядку я отримую таку помилку:

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

Ось моя вся репо: https://github.com/WalnutiQ/wAlnut/tree/version-2.3.1


Ви впевнені у виконанні замість компіляції? збирати файли (....)
Габріеле Маріоти

3
схоже, це залежність від компіляції, якщо банку неможливо побудувати. спробуйте: компілюйте файли ('libs / mnist-tools.jar', 'libs / gson-2.2.4.jar'), якщо у вас все ще є проблема, то спробуйте абсолютні шляхи, оскільки це також може бути проблемою.
patrz jaka franca

1
Це запитання про переповнення стека нарешті дало мені потрібну відповідь.
викрадено

Відповіді:


455

Якщо вам дійсно потрібно взяти цей .jar з локального каталогу,

Додайте поруч зі своїм модулем gradle (Не файл gradle програми):

repositories {
   flatDir {
       dirs 'libs'
   }
}


dependencies {
   implementation name: 'gson-2.2.4'
}

Однак, будучи стандартним .jar у фактичному сховищі Maven, чому б вам не спробувати це?

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

4
Я прийшов шукати саме це, але виявив, що мій локальний сховище не вирішує перехідних залежностей (Gradle 2.7, наприклад, POM є com.mojang: authlib: 1.5.21 як витягнуто minecraftforge.net)
Карл

1
Якщо у вас є локальні файли jar в декількох каталогах, вам потрібно додати їх до flatDir. Наприклад: - flatDir {dirs 'libs1', 'libs2', 'libs3'}
Dhumil Agarwal

9
У мене є gradle.buildфайл - що це за "файл Gradle програми" та "модуль gradle"?
Леало

2
Будь-який шанс хтось оновить відповідь за допомогою посилання на офіційний розділ документації Gradle, що описує ці функції?
мізантроп

2
implementation(":gson:2.2.4")мабуть, це спосіб зробити це.
Eng.Fouad

697

Згідно з документацією , використовуйте відносний шлях для локальної залежності jar таким чином:

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

8
@Gubatron це документально підтверджено зараз: gradle.org/docs/current/userguide/…
Девід

7
просто хотів би додати, що для тих, хто використовує відносні шляхи до нашої баночки: Groovy потрібні залежності {компілювати файли ("libs / something_local.jar"} (тобто подвійні лапки, а не одноцитати)) для оцінки шляху. цитати взяті буквально в Groovy.
specialk1st

Тож я використовую те саме, і я отримую помилку компіляції (схоже, що там не знайдено банку.) Якщо я даю абсолютний шлях, це працює добре.
RV_Dev

Я вважаю за краще це рішення, але я виявив, що якщо файл не існує, Gradle не видає помилок. Я знайшов , що це особисто Дивіться це питання SO Подробиці: stackoverflow.com/q/42527631/4851565
entpnerd

я отримував подібну помилку навіть після використання цього рішення. Помилка я поставив папку libs під додатки не на тому ж рівні, як програми
Rishabh Dugar

314

Ви також можете зробити це, що включатиме всі JAR в локальному сховищі. Таким чином, вам не доведеться вказувати це кожен раз.

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

3
Це використовується для складання всіх банок у каталозі lib. Його ідеальне рішення (у)
Шераз Ахмад Хілджі

1
... якщо ви не плануєте ділитися цим каталогом libs з різними модулями, що мають різні набори залежностей, наприклад, не вводити код сервера з кодом клієнта або мати більше однієї версії залежності в іншому підмодулі.
Аякс

Це моя краща реалізація над прийнятою відповіддю, оскільки в ній прямо вказано розташування файлів. Це корисно, коли ви посилаєтесь на сховище, наприклад, mavenCentral для деяких бібліотек та локальні копії для інших. У цьому випадку може виникнути відставання, коли gradle здійснює пошук локальних бібліотек в інших сховищах.
сит

1
Зауважте, що реж може бути і абсолютним шляхом. Також замість "включати" я повинен був використовувати "включає".
Еріель Марімон

53

Наступні роботи для мене:

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

Див . Документацію Gradle .


6
блискуча відповідь, єдине рішення, яке працювало на мене після пошуку днів
Stardust

важливо пам’ятати, що це цей метод, якщо ви не хочете, щоб певна бібліотека збиралася зі своїм проектом, вам доведеться пам'ятати, щоб видалити її з папки libs ... Мені не подобається цей метод, тому що я не бачу, в якій бібліотеці я додано, якщо я не ввійду до бібліотеки
Ісус Дімрікс,

1
Чим це відрізняється від відповіді @ Nightwolf?
Трентон

2
Не вдалося знайти метод compile () для аргументів [каталог 'libs'] на об’єкті типу org.gradle.api.internal.artifacts.dsl.dependitions.DefaultDependencyHandler
ieXcept

33

Ви можете спробувати використати локальний сховище Maven для Gradle:

  • Встановіть банку у ваше місцеве сховище Maven:

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

  • Перевірте, чи встановлена ​​у вас ~/.m2/місцева сховище Maven

  • Увімкніть локальний сховище Maven у вашому build.gradleфайлі:

    repositories {
      mavenCentral()  
      mavenLocal()  
    }
    
    dependencies {  
      implementation ("com.company:utility:0.0.1")  
    }
    • Тепер у вас має бути включена банка для впровадження у ваш проект

Цей мені допоміг, коли все інше не вдалося!
User3

Хоча це працює, це обробка і не повинна використовуватися в автоматизованому виробничому / сценічному середовищі, оскільки це додає додаткової залежності від наявності .2 папки (встановлення Maven) в системі збірки.
saurav.varma

29

Прийнята відповідь хороша, проте мені знадобляться різні конфігурації бібліотеки в моїй багатопроектній збірці Gradle, щоб використовувати ту саму сторонній бібліотеку Java.

Додавання " $ rootProject.projectDir " до елемента " dir " в моєму " закриття allprojects " означало, що кожен підпроект посилається на той самий каталог " libs ", а не на версію, локальну для цього підпроекту:

//gradle.build snippet
allprojects {
    ...

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

    ...
}

EDIT від Quizzie: змінив "$ {rootProject.projectDir}" на "$ rootProject.projectDir" (працює в новітній версії Gradle).


2
але як посилатися на цю папку libs у файлі бібліотеки build.gradle? Будь-яка допомога в цьому.
jeevs

1
Просто змініть "$ {rootProject.projectDir}" на "$ rootProject.projectDir", щоб він знову працював.
Вікторина

4
Обов’язково використовуйте подвійні лапки, а не одинарні, оскільки останні не будуть інтерпольовані.
FP Вільно

1
Такий підхід мені допоміг.
Шреяш

1
Усі відповіді тут мені дуже допомогли. Ця модель є тією, яку ми використовуємо, і людям, які працюють в командах, полегшується просто занести JAR до цього каталогу під час роботи на гілках.
Люсі

12

Простий спосіб зробити це

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

він буде збирати всі .jar файли у вашому каталозі libs в додатку.


Чи fileTree працює для всіх підкаталогів у папці libs. Приклад декількох банок всередині libs / sping / spring.jar, чи в цьому випадку вона включає також пружину .jar?
мгр

Ні, це не так. Технічно це не так добре, оскільки ми даємо "dir: libs" не підкаталоги libs.
ZygoteInit

У цьому випадку як отримати всі бібліотеки з підкаталогів з мінімальними завданнями (адже наш проект містить так багато підкаталогів.
mgr

Привіт @mallikgm вибачте за несвоєчасну відповідь, чи намагалися ви додати wildcard в режимі dir, як збирати fileTree (включати: [' .jar'], dir: 'libs ')
ZygoteInit

2
Чим це відрізняється від відповіді @ Nightwolf?
Трентон

10

Рішення для тих, хто використовує Kotlin DSL

Додані до цього часу рішення чудово підходять для роботи в ОП, але їх не можна використовувати з Kotlin DSL без попереднього перекладу. Ось приклад того, як я додав локальний .JAR до своєї збірки за допомогою DSL Kotlin:

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

Пам’ятайте, що якщо ви використовуєте Windows, вам слід уникнути зворотних нахилів:

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

А також пам’ятайте, що лапки повинні бути подвійними, а не одиничними.


Редагувати до 2020 року:

Оновлення Gradle застаріли compileі testCompileна користь implementationта testImplementation. Отже, наведений вище блок залежності виглядатиме так для поточних версій Gradle:

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

1
+1 працював на мене! Чи знаєте ви, як зробити те ж саме, не створюючи файлу jar (на випадок, якщо мені трапилося створити банку)?
Kareem Jeiroudi

2
@KareemJeiroudi Можливо, я неправильно розумію ваше запитання, але якщо ви говорите про те, щоб зробити модуль залежною від проекту, ви зробите щось подібне:, compile(project(":MyProject"))де "MyProject" визначається у вашому settings.gradleфайлі з чимось подібним include("MyProject").
Джонатан

8

Не вдалося отримати пропозицію вище за адресою https://stackoverflow.com/a/20956456/1019307 . Це працювало для мене, хоча. Для файлу, secondstring-20030401.jarякий я зберігав у libs/каталозі в корені проекту:

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'

Дякую тобі! Поняття не маю чому, але тільки це працювало на мене. зробив папку "libs" у моєму корінці проекту, засунув туди .jar і скопіював вашу запис "ім'я складання". Упав .jar розширення теж звичайно.
anon58192932

Ні, це не працює, я не можу знайти: miglayout-core :. Шукали в таких місцях: файл: /user/path/to/miglayout-core.jar
Ну Сміт

ця робота, якщо ви хочете додати каталог файлів як сховище: docs.gradle.org/current/userguide/…
Грубхарт

7

На питання вже детально відповіли. Я все ще хочу додати щось, що здається мені дуже дивним:

Завдання "gradle залежності" не перераховує жодних залежностей від файлів. Хоча ви можете так подумати, як вони були визначені в блоці "залежності".

Тому не покладайтесь на результат цього, щоб перевірити, чи працюють ваші посилаються локальні файли lib.


6

Для мене працювало рішення - використання fileTree у файлі build.gradle. Зберігайте .jar, який потрібно додати як залежність у папці libs. Наведіть наведений нижче код у блоці залежності в build.gradle:

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

5

Найкращий спосіб зробити це - додати це у файл build.gradle та натиснути параметр синхронізації

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

3

Ви можете додати банку, роблячи:

Для gradle просто поставте наступний код у build.gradle:

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

а для Maven просто виконайте кроки:

Для Intellij: Файл-> структура проекту-> модулі-> вкладка залежності-> натисніть + знак-> jar і залежність-> виберіть банки, які ви хочете імпортувати-> ОК-> застосувати (якщо видимі) -> ОК

Пам’ятайте, що якщо у вас є якісь java.lang.NoClassDefFoundError: Could not initialize classвинятки під час виконання, це означає, що залежності в jar не встановлені для цього, ви повинні додати всі залежності в батьківському проекті.


0

Файл goto -> Структура проекту -> Модулі -> додаток -> Вкладка залежностей -> Клацніть + (кнопка) -> Виберіть залежність файлу -> Виберіть файл jar у папці lib

Ці кроки автоматично додадуть вашу залежність до gralde

Дуже просто


3
Це шлях через деякі меню Java IDE? Напевно, ідея?
Утгарда

1
Так, це виглядає як щось для IntelliJ IDEA, і я не думаю, що це спрацює. Або це буде виглядати так, що він працює, поки не буде внесено зміни в налаштування Gradle, що призведе до "синхронізації", і синхронізація буде односторонній від Gradle до налаштувань IntelliJ. Це не синхронізується з іншого боку - принаймні, я не думаю.
RenniePet

1
Якщо вибрано автоматичний імпорт, імпортований вручну .JAR буде видалений при наступній зміні в build.gradle.
Джонатан

-1

Будьте уважні, якщо ви використовуєте безперервну інтеграцію, ви повинні додати свої бібліотеки таким же шляхом на вашому сервері збірки.

З цієї причини я б краще додати jar до локального сховища і, звичайно, зробити те ж саме на сервері збирання.


-3

Інший спосіб:

Додати бібліотеку у вигляді дерева. Клацніть правою кнопкою миші на цьому. Виберіть меню "Додати як бібліотеку". З'явиться діалогове вікно, що дозволяє вибрати модуль. Гаразд і це зроблено.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.