Как добавить локальную зависимость файла .jar в файл build.gradle?

608

Поэтому я попытался добавить свою локальную зависимость файла .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

Ван-Чжао-Лю QM
источник
Вы уверены, что во время выполнения вместо компиляции? Скомпилируйте файлы (....)
Габриэле Мариотти
3
похоже, это зависимость компиляции, если jar не может быть собран. попробуйте: скомпилируйте файлы ('libs / mnist-tools.jar', 'libs / gson-2.2.4.jar'), если у вас все еще есть проблема, тогда попробуйте использовать абсолютные пути, потому что это также может быть проблемой.
Patrz Jaka Franca
1
Этот вопрос переполнения стека, наконец, дал мне нужный мне ответ.
вытолкнул

Ответы:

456

Если вам действительно нужно взять этот .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'
}
Jorge_B
источник
4
Я искал именно это, но обнаружил, что мой локальный репозиторий не разрешает транзитивные зависимости (Gradle 2.7, пример POM - com.mojang: authlib: 1.5.21, извлеченный minecraftforge.net)
Карл Паган
1
Если у вас есть локальные файлы JAR в нескольких каталогах, вам нужно добавить их все в flatDir. Пример: - flatDir {dirs 'libs1', 'libs2', 'libs3'}
Думил Агарвал
9
У меня есть gradle.buildфайл. Что это за файл "файл приложения" и "модуль"?
Лео
2
Есть ли шанс, что кто-нибудь обновит ответ ссылкой на официальный раздел документации Gradle, описывающий эти функции?
Мизантроп
2
implementation(":gson:2.2.4")кажется, способ сделать это.
Eng.Fouad
697

Согласно документации , используйте относительный путь для локальной зависимости jar следующим образом:

dependencies {
    implementation files('libs/something_local.jar')
}
leeor
источник
8
@Gubatron теперь задокументировано: gradle.org/docs/current/userguide/…
Дэвид
7
Я просто хотел добавить, что для тех, кто использует относительные пути к нашему jar: Groovy нужны для оценки пути зависимые {файлы компиляции ("libs / something_local.jar"} (т.е. двойные кавычки, а не одинарные). цитаты взяты буквально в Groovy.
specialk1st
Так что я использую то же самое, и я получаю ошибку компиляции (похоже, он не находит там банку.) Если я даю абсолютный путь, он работает нормально.
RV_Dev
Я бы предпочел это решение, но я обнаружил, что если файл не существует, Gradle не выводит никаких ошибок. Я нашел это лично, см. Этот SO вопрос для деталей: stackoverflow.com/q/42527631/4851565
entpnerd
я получал похожую ошибку даже после использования этого решения. Ошибка я облеклись LIBS папку под приложения не в том же уровне , как приложения
Rishabh Дугара
315

Вы также можете сделать это, что будет включать все файлы JAR в локальном хранилище. Таким образом, вам не нужно будет указывать это каждый раз.

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}
Ночной волк
источник
3
Это используется для компиляции всех jar-файлов в директории lib. Это идеальное решение (у)
Шераз Ахмад Хилджи
1
... если вы не планируете совместно использовать этот каталог libs с разными модулями, имеющими разные наборы зависимостей, например, не помещать серверный код в код клиента или иметь более одной версии зависимости в другом субмодуле.
Ajax
Это - моя предпочтительная реализация по сравнению с принятым ответом, потому что это явно заявляет местоположение файлов. Это полезно, когда вы ссылаетесь на хранилище, такое как mavenCentral для некоторых библиотек и локальные копии для других. В этом случае может возникнуть задержка при поиске локальных библиотек в других хранилищах.
суббота
1
Обратите внимание, что dir также может быть абсолютным путем. Также вместо «включить» мне пришлось использовать «включает».
Эриэль Маримон
53

Следующие работы для меня:

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

Обратитесь к документации Gradle .

Миша
источник
6
блестящий ответ, единственное решение, которое сработало для меня после нескольких дней поиска
Stardust
важно помнить, что это тот метод, если вы не хотите, чтобы определенная библиотека компилировалась с вашим проектом, вам придется помнить, чтобы удалить его из папки libs ... мне не нравится этот метод, потому что я не вижу, какую библиотеку я добавлено, если я не
войду
1
Чем это отличается от ответа @ Nightwolf?
Трентон
2
Не удалось найти метод compile () для аргументов [каталог 'libs'] для объекта типа org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler
ieXcept
33

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

  • Установите банку в ваш локальный репозиторий Maven:

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

  • Убедитесь, что у вас установлен jar в ~/.m2/локальный репозиторий Maven

  • Включите ваш локальный репозиторий Maven в вашем build.gradleфайле:

    repositories {
      mavenCentral()  
      mavenLocal()  
    }
    
    dependencies {  
      implementation ("com.company:utility:0.0.1")  
    }
    • Теперь у вас должен быть включен jar для реализации в вашем проекте
Даниэль Мора
источник
Этот помог мне, когда все остальное не удалось!
Пользователь3
Хотя это работает, это обходной путь, и его не следует использовать в автоматизированной рабочей среде / рабочей среде, поскольку это добавляет дополнительную зависимость наличия папки .m2 (установка 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()
    }

    ...
}

РЕДАКТИРОВАНИЕ от Quizzie: изменено «$ {rootProject.projectDir}» на «$ rootProject.projectDir» (работает в последней версии Gradle).

Большой Богатый
источник
2
но как ссылаться на эту папку libs в файле библиотеки build.gradle? Любая помощь в этом.
Джевс
1
Просто измените «$ {rootProject.projectDir}» на «$ rootProject.projectDir», чтобы он снова заработал.
Quizzie
4
Обязательно используйте двойные кавычки, а не одинарные, так как последние не будут интерполированы.
FP Свободно
1
Этот подход помог мне.
Шреяш
1
Все ответы здесь очень помогли мне. Мы используем этот шаблон, и людям, работающим в командах, легко добавить JAR-файлы в этот каталог при работе с ветками.
Люси
13

Решение для тех, кто использует Kotlin DSL

Добавленные решения отлично подходят для OP, но не могут использоваться с Kotlin DSL без их предварительного перевода. Вот пример того, как я добавил локальный .JAR в свою сборку, используя Kotlin DSL:

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 работал на меня! Знаете ли вы, как сделать то же самое, не создавая файл фляги (на случай, если мне довелось создать флягу)?
Карим Джейроуди
2
@KareemJeiroudi Возможно, я неправильно понимаю ваш вопрос, но если вы говорите о том, чтобы сделать модуль зависимостью проекта, вы бы сделали что-то вроде этого: compile(project(":MyProject"))где «MyProject» определен в вашем settings.gradleфайле с чем-то вроде include("MyProject").
Джонатан
12

Простой способ сделать это

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

он скомпилирует все файлы .jar в вашем каталоге libs в App.

ZygoteInit
источник
Это fileTree работает для всех подкаталогов в папке libs. Например, несколько jar внутри libs / sping / spring.jar, в этом случае он также включает в себя пружину .jar?
MGR
Нет, это не так. Технически это не должно так хорошо, так как мы даем 'dir: libs', а не подкаталоги libs.
ZygoteInit
В этом случае, как получить все библиотеки из подкаталогов с минимальными задачами (потому что наш проект содержит так много подкаталогов.
mgr
Эй @mallikgm извините за поздний ответ, вы пытались добавить подстановочный знак в путь dir, например, compile fileTree (include: [' .jar'], dir: 'libs ')
ZygoteInit
2
Чем это отличается от ответа @ Nightwolf?
Трентон
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'
HankCa
источник
благодарю вас! Понятия не имею, почему, но только это сработало для меня. сделал папку 'libs' в корне моего проекта, поместил туда .jar и скопировал вашу запись 'compile name'. Конечно, тоже удалил расширение .jar.
anon58192932
Нет, это не работает, мне не удалось найти: miglayout-core :. Поиск производился в следующих местах: file: /user/path/to/miglayout-core.jar
Well Smith,
эта работа, если вы хотите добавить каталог файлов в качестве хранилища: docs.gradle.org/current/userguide/…
Grubhart
7

На вопрос уже был дан подробный ответ. Я все еще хочу добавить кое-что, что кажется мне очень удивительным:

Задача «gradle зависимости» не перечисляет никаких файловых зависимостей. Даже если вы так и думаете, ведь они были указаны в блоке «зависимости».

Так что не полагайтесь на вывод этого, чтобы проверить, работают ли ваши локальные файлы lib, на которые ссылаются, правильно.

icyerasor
источник
6

Решение, которое сработало для меня, это использование fileTree в файле build.gradle. Сохраните .jar, который нужно добавить в качестве зависимости, в папке libs. Ниже приведен код в блоке зависимостей в build.gradle:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}
Джинс Мартин
источник
5

Лучший способ сделать это - добавить это в файл build.gradle и нажать опцию синхронизации.

dependency{
    compile files('path.jar')
}
saunlogan
источник
3

Вы можете добавить jar, выполнив:

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

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

а для мавена просто следуйте шагам:

Для Intellij: Файл-> Структура проекта-> Модули-> вкладка Зависимости-> нажмите + знак-> jar и зависимость-> выберите банки, которые вы хотите импортировать-> ok-> применить (если они видны) -> ok

Помните, что если вы получили какое-либо java.lang.NoClassDefFoundError: Could not initialize classисключение во время выполнения, это означает, что зависимости в jar не установлены, для этого вы должны добавить все зависимости в родительский проект.

Анкит
источник
0

Перейдите в Файл -> Структура проекта -> Модули -> Приложение -> Вкладка Зависимости -> Нажмите + (кнопка) -> Выберите Зависимость файла -> Выберите файл JAR в папке lib

Эти шаги автоматически добавят вашу зависимость к gralde

Очень просто

Jaya
источник
3
Это путь через некоторые меню Java IDE? Возможно, идея?
Утгарда
1
Да, это похоже на IntelliJ IDEA, и я не думаю, что это сработает. Или, похоже, он работает, пока не будет внесено изменение в настройку Gradle, которое приведет к выполнению «синхронизации», и синхронизация будет односторонней от Gradle до настроек IntelliJ. Это не синхронизирует другой путь - по крайней мере, я так не думаю.
RenniePet
1
Если выбран автоматический импорт, импортированный вручную файл .JAR будет удален при следующем изменении build.gradle.
Джонатан
-1

Будьте осторожны, если вы используете непрерывную интеграцию, вы должны добавить свои библиотеки по тому же пути на вашем сервере сборки.

По этой причине я бы предпочел добавить jar в локальный репозиторий и, конечно же, сделать то же самое на сервере сборки.

Akostha
источник
-3

Другой путь:

Добавить библиотеку в виде дерева. Щелкните правой кнопкой мыши на этом. Выберите меню «Добавить в библиотеку». Появится диалоговое окно, позволяющее выбрать модуль. ОК и готово.

YannXplorer
источник