2017-02-13 3 views
4

Как добавить внешнюю библиотеку в проект в IntelliJ IDEA, чтобы при создании артефакта он все еще имел доступ к классам в библиотеке?Добавление внешней библиотеки в баннер артефакта в IntelliJ IDEA

Я создал новый артефакт Jar из структуры проекта, затем добавил внешний JAR в библиотеки, затем проверил его в списке модулей и, наконец, добавил его к выходу для артефакта. Ни одна из этих работ не работает. Когда я строю и попробуйте запустить мое приложение, он выдает ошибку:

Exception in thread "main" java.lang.NoClassDefFoundError: <path of the class trying to use>

Что я упускаю, или я делаю это совершенно неправильно?

ответ

6

У вас есть 2 варианта здесь:

  • извлечь зависимость в артефакте банку так, что приложение является единственной исполняемой баночкой со всеми зависимостями
  • ссылки зависимых баночек через Manifest.MF и скопировать их рядом основная баночка приложения

Я подготовил образец проекта, который демонстрирует оба подхода: HelloWithDependencies.zip.

Артефакты изготавливаются в out\single и out\linked каталогах.

Соответствующие конфигурации:

single

linked

+1

Вы только что помогли мне исправить проблему, которую я потратил более 25 часов, возможно, 2 недели, пытаясь расшифровать. Большое спасибо! Кроме того, это работает и все, но какова основа этого? Использует ли IntelliJ Maven или Ant или что-то в этом роде? –

+1

Вы можете использовать проекты на основе Maven, да, но это не связано с вашей ситуацией. Когда вы добавляете новые зависимости к проекту, они не добавляются автоматически к артефактам, которые у вас уже есть, вам нужно снова просмотреть конфигурацию артефакта и добавить все недостающие библиотеки, необходимые для запуска вашего приложения из банки. Другая распространенная ошибка заключается в том, чтобы включить одну банку в другую банку, которая не будет работать, банку нужно либо распаковать внутри основной банки, либо скопировать рядом с ней и связать через манифест (не забудьте добавить какие-либо новые банки в манифест в том дело). – CrazyCoder

+1

В проекте, основанном на Maven, вы можете использовать плагины Maven для создания банок с зависимостями, и вы создадите финальные артефакты, запустив цель Maven вместо использования артефактов IntelliJ IDEA. Таким образом, все новые зависимости вы добавляете к pom.xml' автоматически появится в банке, созданной Maven. В значительной степени то же самое относится к проектам на базе Gradle. – CrazyCoder

1

Если вы используете maven для создания своего приложения, это не правильный способ добавления внешней библиотеки. Вы должны либо

  1. Сделайте установку своей библиотеки, как показано ниже mvn install:install-file -Dfile=myJar.jar -DgroupId=com.yourproject -DartifactId=yourproject -Dversion={version} -Dpackaging=jar.
  2. Используйте системный путь, как описано here.

Вариант 1 предпочтителен, поскольку вам не нужно держать банку в своем проекте.

+0

На самом деле я не знаю, если используется Maven. Я не создал никаких файлов сборки. Не знаю, как это делает IDEA, но мое предположение заключалось в том, что файл сборки не нужен. Все есть файл MANIFEST.MF. –

Смежные вопросы