leiningen uberjar - добавить внешний jar во время выполнения

Я пытаюсь увидеть, как я могу добавить каталог и внешний jar -файл в classpath при создании leiningen uberjar.

Причина в том, что мне нужно распространять jar, но некоторые зависимости (например, драйвер jdbc) не могут быть скомпилированы в uberjar из-за лицензионных ограничений.

Я также хотел бы предоставить определенные внешние ресурсы, такие как свойства для ведения журнала и конфигурации, внешние по отношению к банке.

Обычно при загрузке Java или Spring я бы использовал соответствующую опцию командной строки, чтобы изменить путь к классу. Однако -cp не находит банку и т.д.

Есть ли способ сделать это или соответствующий плагин? заранее спасибо

1 ответ

Решение

Вы можете добавить jar как ресурс в профиле:dev. Затем он добавляется в путь к классам. Профиль dev предназначен для локального развития и не упакован в uberjar.

:profiles {
         :uberjar {:aot :all}
         :dev {:resource-paths ["no-redist/commercial-jdbc-driver.jar"]}}

Во время "производства" с Uberjar вам нужно установить classpath, а затем вручную:

java -cp no-redist/commercial-jdbc-driver.jar;your-app-uber-jar.jar main.namespace

Afaik при использовании флага -jar, он использует зависимости в файле jar, что бы ни связывалось и не упоминалось там. Объединение -cp и -jar может не сработать.

Другой способ - обратиться к файлу jar, не подлежащему распространению, в манифесте jar (META-INF/MANIFEST.MF):

Class-Path: no-redist/commercial-jdbc-driver.jar

Java -jar your-app-uber-jar.jar будет искать jar в папке no-redist/commercial-jdbc-driver.jar в локальном каталоге. Добавьте это в leinigen как:

:manifest {"Class-Path" "no-redist/commercial-jdbc-driver.jar"}
Другие вопросы по тегам