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 с нулевыми собственными компонентами.