Библиотека не находит свою собственную «библиотеку» - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь создать список адресов в Java, который сохраняет его содержимое в базе данных Sqlite.

Поэтому (и для других будущих применений) я пытался создать свою собственную библиотеку для всех видов соединений с базой данных ("PentagonsDatabaseConnector-1.0.jar"). В настоящее время он поддерживает Sqlite и MySql.

. Он ссылается на другие библиотеки для них, чтобы предоставить драйверы JDB C ("mysql -connector- java -8.0.16.jar" и " sqlite-jdb c -3.30.1.jar ").

Проблема: Моя библиотека работает нормально, если я обращаюсь к ней из собственной папки проекта, но как только я ее скомпилирую и добавлю для проекта "Adressliste" он больше не может найти драйверы JDB C (хотя я могу без проблем получить доступ к остальной части своей самостоятельно написанной библиотеки). Также, как показано на скриншоте, «PentagonsDatabaseConnector-1.0.jar» объединяет библиотеки JDB C с собой в папке «lib».

ССЫЛКА НА СКРИНШОТ

У вас, ребята, есть идея, что случилось?

Спасибо за вашу помощь!

Ps: Извините за плохого английского sh, я немец :)

1 Ответ

0 голосов
/ 04 апреля 2020

Java не может читать jars-in-jars.

Зависимости бывают нескольких видов. В этом случае PentagonsD C является нормальной зависимостью; он должен быть там во время выполнения, а также во время компиляции.

Библиотеки JDB C немного особенные; они только для времени выполнения. Вам не нужно, чтобы они были во время компиляции. Вы хотите этого, потому что библиотеки JDB C, по сути, являются подключаемыми.

Хорошо, что мне делать?

Использование системы сборки для управления вашими зависимостями - ответ 90 % + из java программистов go до, и то, что я рекомендую вам сделать здесь. Особенно для тех, кто только начинает, советую Maven . Здесь вы просто поместите в текстовый файл имена ваших зависимостей, и maven просто позаботится об этом, по крайней мере, во время компиляции.

Для аспекта времени выполнения у вас есть несколько вариантов. Это зависит от того, как работает ваше приложение java.

Некоторые примеры:

Путь к классам на основе манифеста

Вы запускаете ваше приложение java в автономном режиме, как в , вы написали метод psv main(String[]), который запускает приложение, и вы распространяете его везде, где нужно запустить. В этом случае обычной стратегией является наличие установщика (вам нужна JVM на клиенте для запуска вашего приложения, и ни oracle, ни какой-либо поставщик ОС больше не поддерживают поддержание работающей JVM в системах конечного пользователя; теперь это ваша работа - это, к сожалению, нетривиально), и, учитывая, что у вас есть это, вы должны развернуть ваши банки так, чтобы они содержались в манифесте (банки - это почтовые индексы, манифест заканчивается в META-INF / MANIFEST.MF):

Main-Class: com.of.yourproj.Main
Class-Path: lib/sqlite-jdbc.jar lib/mysql-jdbc.jar lib/guava.jar

А затем создайте структуру каталогов следующим образом:

C:\Program Files\yourapp\yourapp.jar
C:\Program Files\yourapp\lib\sqlite-jdbc.jar
C:\Program Files\yourapp\lib\mysql-jdbc.jar

Или эквивалент в любой другой ОС. Записи пути к классам в манифесте разделены пробелами и разрешены относительно каталога, в котором находится 'yourapp.jar'. Сделано так, что вы можете запустить yourapp.jar из любого места, и он вместе со всеми записями, перечисленными в Class-Path, теперь доступен

Инструменты сборки могут сделать это для вас очевидным.

Затенение / Uberjars

Затенение - это понятие упаковки всего в одну гигантскую банку; не jars-in-jars, но распакуйте содержимое ваших jar-зависимостей в основной jar-файл приложения. Это может быть довольно медленным в сборке (если у вас есть deps стоимостью в несколько сотен МБ, они должны быть упакованы, и все файлы классов должны быть проанализированы для перезаписи оттенка, это много битов для обработки, поэтому всегда требуется некоторое время). Общая идея затенения заключается в том, что развертывание «так же просто, как передача одного файла JAR», но на самом деле это не практично, поскольку вы больше не можете предполагать, что у конечных пользователей установлена ​​JVM, и даже если они это сделают, вы не можете полагаться на это быть должным образом в курсе. Я упоминаю об этом здесь, потому что вы можете услышать это от других, но я бы не рекомендовал это.

Если вы действительно хотите go для этого, единственный вариант - это системы сборки: у них есть плагин для сделай это; не существует инструмента командной строки, который поставляется с java, который мог бы сделать это. Существуют также предупреждения о так называемых «подписанных банках», которые нельзя просто распаковать в один uberjar.

Контейнер приложений

Не все приложения java автономны, если вы предоставляете основную. Например, если вы пишете веб-сервис, у вас вообще нет main; рамки делает. Вместо единственной точки входа («главная» - место, где ваш код изначально начинает выполнение), веб-сервисы имеют тонны точек входа: по одной на каждый URL, на который вы хотите ответить. Фреймворк заботится о их вызове, и обычно эти фреймворки имеют собственную документацию и спецификации для загрузки зависимостей. Обычно это вопрос размещения jar-файла в одном месте и его зависимостей в поддиректории с именем 'lib', или вы создаете так называемый war-файл, но на самом деле очень много веб-фреймворков и так много вариантов того, как они это делают. , Хорошая новость, как правило, проста, и руководство по этой платформе расскажет об этом.

Этот совет относится к любой системе «контейнер приложений»; обычно это веб-фреймворки, но есть не связанные с веб-фреймворками, которые заботятся о запуске вашего приложения.

Не делайте этого

Не заставляйте пользователей вручную вводить * Опция 1044 * или беспорядок с переменной окружения CLASSPATH.

Не пытайтесь написать собственный загрузчик классов, который загружает jars-in-jars.

Примечание: Sqlite2 довольно сложен для Java ; он не дает вам многих преимуществ, которые должен принести «lite», поскольку это нативная зависимость. Простое решение, работающее везде, в сфере java - это «h2», которое записано во всех java, таким образом, возможна поставка всего движка h2 как части приложения java с нулевыми собственными компонентами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...