2017-02-02 16 views
1

У меня есть проект clojure, который зависит от библиотеки Java, который не работает, когда он входит в uberjar. (Ему нужны разные дескрипторы XML, использующие одно и то же имя файла в разных файлах JAR.)Построение изображения не-uberjar Docker с leiningen

Все, что я нахожу при использовании Docker with leiningen, зависит от сборки и упаковки убержара. Это также то, как я до сих пор создавал все докеры-клоуры.

Есть ли какой-либо плагин leiningen, который понимает, что нужно упаковать изображение Docker, используя несколько файлов jar, таких как io.fabric8/docker-maven-plugin?

+0

Убержар не зависит от языка. Таким образом, вы можете создать его с помощью кода Clojure, используя любой инструмент построения. Как правило, я предпочитаю лейн SBT, но для создания uberjars у меня был больше успеха с плагинами SBT, чем с плагинами lein. Например, в вашем случае https://github.com/marcuslonnberg/sbt-docker может вам помочь. –

+0

@ChrisMurphy Спасибо за ваше предложение. Моя проблема в том, что библиотека, которую я использую, не работает при переупаковке в uber-jar. Я должен упаковать свой контейнер с исходным файлом jar, а затем ссылаться на эту банку в пути к классам при запуске приложения. Когда я делаю это вручную, это работает. Он также работает, когда я упаковываю с помощью docker-maven-plugin, поскольку этот плагин не переупаковывает банки. Проблема с maven заключается в том, что emacs/cider не поддерживает maven. –

ответ

0

Всякий раз, когда упаковка (uberjar, war) создает большой файл, содержит файлы .class и структуру каталогов. Где загружаются эти файлы XML (класс)? Вы можете экспериментировать с упаковкой вручную. В конце концов, это (или uberjar, war or jar) - всего лишь zip-файл.

Когда вы точно знаете макет, который вам нужен, SBT достаточно гибкий, чтобы вы могли упаковать из множества входных файлов jar. К сожалению, плагины lein будут делать такие вещи, как всегда, перезаписывать дубликаты, и вы не можете контролировать поведение упаковки. Я не могу точно помнить о гибкости, но я не мог контролировать, как прошел процесс упаковки, какие решения были приняты.

Для этого я использую Linux как-то под названием Archive Manager, который оказался намного лучше, чем тот, который я использовал в Windows. Выполнение этого вручную может быть всем, что вам нужно. Недостатком SBT, конечно, является то, что вы должны его изучить, в том числе немного Scala.

Он нуждается в разных дескрипторах XML, использующих одно и то же имя файла в разных JAR-файлах.

Просто подумав об этом, вам нужно добавить содержимое каждого файла, находящегося в другой банке, в один файл, который находится в uberjar? Вы можете попробовать. Если это работает, и вам нужно достаточно быстро упаковать пакеты, чтобы вручную создавать и переименовывать zip-файл каждый раз становилось болью, тогда я считаю, что SBT будет вашим лучшим выбором.

Я должен упаковать мой контейнер с исходным файлом банку, а затем ссылаться на эту банку в пути к классам при запуске приложения

загрузчик классов загружает классы, а не банки. Задача контейнера состоит в том, чтобы распаковать все, что вы ему даете, например, файлы .class, uber, jars, wars. Любая программа, которая динамически загружается из пути к классам, загружает либо классы, либо ресурсы (например, файлы .xml). Я предполагаю, что файл .jar может быть ресурсом, и в этом случае вы помещаете файл jar в uberjar. Таким образом, все еще можно упаковать его.