Як додати локальну залежність .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.