Другое

Как добавить JAR в Gradle и исправить ошибки пакетов

Узнайте, как добавить локальные JAR-файлы в Gradle, настроить зависимости и устранить ошибки «package does not exist» при компиляции для вашего проекта.

Как добавить локальный файл .jar в зависимости build.gradle и устранить ошибку «package does not exist»?

Я пытаюсь подключить локальные файлы .jar как зависимости в проекте Gradle. Вот моя текущая конфигурация build.gradle:

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

При выполнении gradle build я получаю следующую ошибку:

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

Файлы .jar находятся в каталоге libs, и я убедился, что gson-2.2.4.jar действительно присутствует. Как правильно настроить build.gradle, чтобы включить эти локальные зависимости и устранить ошибку импорта пакета?

Основная проблема заключается в том, что вы используете конфигурацию runtime для ваших зависимостей, что делает их доступными только во время выполнения, но не во время компиляции.


Содержание

Понимание проблемы

Ошибка «package does not exist» возникает, потому что конфигурация runtime Gradle включает зависимости только в classpath во время выполнения, но не во время компиляции. При попытке импортировать классы из локальных JAR‑файлов компилятору Java необходимо иметь доступ к этим JAR‑файлам во время компиляции.

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

  • compile (или implementation в новых версиях Gradle): доступны как во время компиляции, так и во время выполнения
  • runtime: доступны только во время выполнения, не во время компиляции

Правильная конфигурация зависимостей

Чтобы решить текущую проблему, замените runtime на implementation в блоке зависимостей:

gradle
dependencies {
    implementation files('libs/mnist-tools.jar', 'libs/gson-2.2.4.jar')
    implementation fileTree(dir: 'libs', include: '*.jar')
}

Как объясняет Baeldung, конфигурация implementation гарантирует, что зависимости доступны как во время компиляции, так и во время выполнения. Это стандартная конфигурация для большинства библиотечных зависимостей.

Использование репозитория flatDir

Для более удобного управления зависимостями, особенно при работе с несколькими локальными JAR‑файлами, следует объявить репозиторий flatDir в блоке репозиториев:

gradle
repositories {
    flatDir {
        dirs 'libs'
    }
}

dependencies {
    implementation 'gson-2.2.4'
    implementation 'mnist-tools'
}

Этот подход, описанный в документации Gradle, указывает Gradle искать зависимости в локальной папке libs. Преимущество состоит в том, что можно ссылаться на JAR‑файлы по имени без указания полного пути.

Согласно обсуждениям на Stack Overflow, если у вас локальные JAR‑файлы находятся в нескольких каталогах, необходимо добавить все их в конфигурацию flatDir.

Альтернативные подходы

Метод 1: Прямая ссылка на файл

gradle
dependencies {
    implementation files('libs/gson-2.2.4.jar')
    implementation files('libs/mnist-tools.jar')
}

Метод 2: Дерево файлов с шаблоном сопоставления

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

Метод 3: Использование flatDir с несколькими каталогами

gradle
repositories {
    flatDir {
        dirs 'libs', 'external-libs'
    }
}

Шаги устранения неполадок

Если проблема сохраняется, попробуйте следующие шаги по устранению неполадок:

  1. Обновите проект Gradle: в IntelliJ IDEA или Android Studio щёлкните правой кнопкой мыши по проекту и выберите «Reload Gradle Project».
  2. Очистите и пересоберите: выполните gradle clean build, чтобы очистить кэшированные сборки.
  3. Проверьте содержимое JAR: убедитесь, что JAR‑файлы действительно содержат пакеты, которые вы пытаетесь импортировать. Вы можете использовать инструменты, такие как jar tf filename.jar, чтобы просмотреть содержимое.
  4. Проверьте версию Gradle: разные версии Gradle обрабатывают конфигурации зависимостей по‑разному. Обсуждения на Gradle Forums отмечают, что имена конфигураций изменились с compile на implementation в Gradle 3.x+.
  5. Принудительно обновите зависимости: добавьте --refresh-dependencies к вашей команде Gradle: gradle build --refresh-dependencies.

Полный рабочий пример

Ниже приведена полностью рабочая конфигурация build.gradle:

gradle
apply plugin: 'java'

sourceSets {
    main {
        java {
            srcDir 'src/model'
        }
    }
}

repositories {
    flatDir {
        dirs 'libs'
    }
    mavenCentral() // Для любых удалённых зависимостей
}

dependencies {
    // Локальные JAR‑файлы
    implementation 'gson-2.2.4'
    implementation 'mnist-tools'
    
    // Или используя подход с fileTree
    implementation fileTree(dir: 'libs', include: '*.jar')
    
    // Удалённые зависимости при необходимости
    implementation 'org.apache.commons:commons-math3:3.6.1'
}

// Опционально: включить JAR‑файлы в итоговую сборку
jar {
    from {
        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

Эта конфигурация должна устранить ошибку «package does not exist» и обеспечить гибкость как для локальных, так и для удалённых зависимостей.


Источники

  1. Локальные JAR‑файлы как зависимости Gradle | Baeldung
  2. Как добавить локальный .jar файл как зависимость в build.gradle | Stack Overflow
  3. Объявление зависимостей - Документация Gradle
  4. Объявление репозиториев - Документация Gradle
  5. Gradle Forums - Использование локальных зависимостей
  6. Gradle Forums - Как включить локальный jar файл как зависимость

Заключение

Чтобы успешно добавить локальные JAR‑файлы как зависимости и устранить ошибки «package does not exist» в Gradle:

  1. Используйте implementation вместо runtime для зависимостей, требующихся во время компиляции.
  2. Рассмотрите возможность использования репозитория flatDir для более чистого управления зависимостями.
  3. Убедитесь, что содержимое JAR‑файлов и пути указаны правильно.
  4. Очистите и пересоберите проект после внесения изменений.
  5. Используйте --refresh-dependencies, если Gradle не обнаруживает новые JAR‑файлы.

Ключевое — обеспечить доступность локальных JAR‑зависимостей как во время компиляции, так и во время выполнения процесса сборки.

Авторы
Проверено модерацией
Модерация