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


Вы уверены, что во время выполнения вместо компиляции? Скомпилируйте файлы (....)
Габриэле Мариотти

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

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

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.


Это 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'

благодарю вас! Понятия не имею, почему, но только это сработало для меня. сделал папку '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, на которые ссылаются, правильно.


6

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

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

5

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

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

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

Очень просто


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.