Куда ставить внешние банки?

Я использую Eclipse (3.4), и мой класс компилируется без предупреждений или ошибок. В моем проекте используется внешний файл jar.

Куда мне поместить этот внешний файл jar, чтобы не получить java.lang.NoClassDefFoundError при использовании этого класса из другого проекта (не в Eclipse)?

Я мог бы просто извлечь банку в папку проекта, но это кажется неправильным.

Обновлено: этот вопрос касается не импорта банок в Eclipse, а их использования вне Eclipse.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
50
0
98 389
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Не имеет большого значения, куда вы его поместите, но вам необходимо настроить другой проект, не относящийся к Eclipse, так, чтобы он помещал внешние jar-файлы в его путь к классам - или, если необходимо, используйте механизм каталогов расширений. (Это проще, но, возможно, лучше сделать это явным.)

Проект, не относящийся к Eclipse, мной не настраивается и не поддерживается. Фактически, я только что написал несколько классов, и один из этих классов использует другой класс из файла jar.

Burkhard 28.11.2008 17:37

Значит, вы не можете настроить другой проект совсем с точки зрения пути к классам? Рано или поздно это обязательно тебя укусит. Вместо того, чтобы обойти это ограничение, попробуйте исправить его.

Jon Skeet 28.11.2008 20:18

Помещаю в новую папку. Эта папка должна быть включена в путь сборки. Неважно, в Eclipse или за его пределами. У Eclipse есть путь сборки для конкретного проекта, и он передает этот путь в javac. Если вы хотите запустить javac вне Eclipse, вам нужно передать путь сборки вручную.

Вам просто нужно сослаться на него, используя опцию -classpath, в папке, которая не включена в рабочую область eclipse, т.е. которая вообще не зависит от eclipse.

Предупреждение, вы не можете выполнить другой проект с java -jar, если вы ссылаетесь на свой внешний jar-файл с опцией -cp (посмотреть этот вопрос)

положите его в папку jre/lib/ext

все, что сказано о пути к классам, верно, но это последовательное и разумное место для его существования.

вы можете узнать свою папку jre, посмотрев на переменную среды JAVA_HOME в Windows.

Интересно, но у меня на компьютере три JRE и три JDK, я не думаю, что дублирую все нужные мне библиотеки.

PhiLho 28.11.2008 14:36

у вас может быть три (я тоже), но вы всегда используете только один, который определяется вашим JAVA_HOME. Кроме того, ваш сторонний инструмент может иметь разные версии для разных JRE, поэтому у вас будет обратная проблема дублирования, если вы не воспользуетесь этим подходом. Это то, для чего предназначен jre / lib / ext.

Simon 28.11.2008 15:13

Короче достаточно полезно.

asifaftab87 12.01.2016 12:34
Ответ принят как подходящий

Если вы хотите включить файл JAR в свой проект Eclipse, вы обычно создаете папку lib внутри папки проекта и помещаете туда файл. Затем вам нужно указать eclipse, чтобы он включил его в свой путь к классу, чтобы ваш код компилировался и запускался внутри eclipse.

Для этого:
- Зайти в свойства своего проекта
- Выберите "Путь сборки Java" в левом столбце. - Выберите вкладку "Библиотеки" в центральной части окна
. - Нажмите кнопку «Добавить файлы JAR» - это даст вам список ваших проектов в eclipse - разверните проект и перейдите в папку lib - там будет ваш jar. - Выберите JAR, нажмите OK и снова OK в окне свойств.

Теперь ваш код будет скомпилирован и запущен.

Код компилируется внутри eclipse. При запуске вне eclipse (т.е. другой графический интерфейс вызывает функцию внутри банки) я получаю NoClassDefFoundError.

Burkhard 28.11.2008 17:39

Или вы можете просто щелкнуть банку правой кнопкой мыши и выбрать BuildPath-> Добавить в путь сборки.

Dave Ray 28.11.2008 18:11

Когда вы запускаете все, что находится за пределами eclipse, вы должны предоставить свои двоичные файлы проекта eclipse (если они не созданы в банке) в пути к классам того, что вы запускаете.

James Camfield 28.11.2008 19:41

Я совершенно запуталась, куда добавить банки. Внутри созданной папки lib? или внутри war / WEB-INF / lib?

karlihnos 05.04.2017 12:28

Я знаю, что это не совсем то, о чем вы спрашиваете, но рассматривали ли вы возможность использования Maven? Некоторые плагины, такие как сборка, могут быть полезны в подобных ситуациях.

Держите банку внутри Затмения, как написал Джеймс Кэмфилд.

Затем, когда вы создаете (Ant, Maven, вручную) для распространения, убедитесь, что файл jar включен или находится внутри вашего приложения jar, war, ear или любого другого файла, и что любые сценарии запуска включают его в путь к классам с помощью командной строки -classpath вариант для java, как написал VonC.

Не беспокойтесь о том, чтобы вставить банки в папку расширений java, все это заставит вас забыть об этом, когда дело доходит до отправки вашего кода третьей стороне для использования, потому что они не будут настраивать его на своей стороне .

Создайте общий каталог lib и поместите этот jar-файл и любые другие общие файлы jar-файлов, которые могут быть там. Если вы используете Maven, то он у вас уже есть в виде локального репо.

В Eclipse создайте переменную пути к классам для этого каталога, а затем используйте ее для ссылки на файл jar в своих проектах. Если у вас есть несколько проектов, отвечающих этим условиям, это значительно упростит жизнь. Это также упрощает изменение местоположения корневого каталога, если вы переходите с локального диска на сетевой.

Во внешнем приложении вы также включите этот файл jar из его общего расположения в пути к классам приложений.

Ответ Саймона кажется лучшим, но сейчас он немного устарел. Погуглили этот документ Oracle Установленные расширения.

As of Java 6, extension JAR files may also be placed in a location that is independent of any particular JRE, so that extensions can be shared by all JREs that are installed on a system.

В нем говорится, что для Windows вы должны разместить свои расширения здесь% SystemRoot% \ Sun \ Java \ lib \ ext.

Просто чтобы подтвердить, что это хорошо сработало в 2020 году и в Visual Studio Code. Я добавил фреймворк osgi в C: \ Program Files \ Java \ jdk1.8.0_241 \ jre \ lib \ ext, закрыл и открыл код Visual Studio и смог правильно импортировать библиотеку. От себя лично мне нравится этот подход, поскольку он предназначен для существования самого JDK.

Paolo 19.03.2020 10:11

Другие вопросы по теме