2017-02-02 11 views
1

私は、Javaライブラリに依存するclojureプロジェクトを持っていますが、これはuberjarに含まれていると動作しません。 (別のJARファイルで同じファイル名を使用する別のXML記述子が必要です)leiningenを使用した非uberjar Dockerイメージの構築

leiningenでDockerを使用すると、uberjarのビルドとパッケージ化が異なります。それは私が今までにすべてのクロージャードッカー画像をどのように構築したかです。

io.fabric8/docker-maven-pluginのようないくつかのjarファイルを使ってDockerイメージをパッケージ化することを理解しているleiningenプラグインはありますか?

+0

uberjarは言語に依存しません。したがって、ビルドツールを使用してClojureコードでビルドすることができます。一般的には私はSBTのほうが好きですが、uberjarsを作成するにはSBTプラグインでもっとうまくいっています。例えば、あなたの場合、https://github.com/marcuslonnberg/sbt-dockerがあなたを助けるかもしれません。 –

+0

@ChrisMurphyあなたの提案をありがとう。私の問題は、私が使用しているライブラリは、ウーバージャーに再パッケージ化しても機能しないということです。元のjarファイルにコンテナをパッケージ化してから、アプリケーションを起動するときにクラスパスでこのjarを参照する必要があります。これを手動で実行しているときに動作します。このプラグインはjarファイルを再パッケージ化しないので、docker-maven-pluginでパッケージ化すると動作します。 mavenの問題は、emacs/ciderがmavenをサポートしていないことです。 –

答えて

0

パッケージ化(uberjar、war)すると、作成される大きなファイルには、.classファイルとディレクトリ構造が含まれます。これらのXMLファイルはどこから(クラス)読み込まれるはずですか?手動で梱包を試すことができます。結局のところ、(uberjar、war、jarのいずれの場合でも)それは単なるzipファイルです。

あなたが必要とするレイアウトを正確に知っている場合、SBTは多数の入力jarファイルからパッケージ化できるほど柔軟な柔軟性を備えています。残念ながら、leinプラグインは常に重複を上書きするようなことを行い、パッケージの動作を制御することはできません。柔軟性はまったく覚えていませんが、パッケージングプロセスの進め方や、何が決定されたかを制御することはできませんでした。

手動で行うには、Archive ManagerというLinuxのものを使用します。これはWindows上で使用したものよりもはるかに優れています。それを手動で行うことは、必要なだけのものかもしれません。もちろんSBTの欠点は、あなたがそれを学ばなければならないということです。これにはScalaのビットが含まれています。

異なるJARファイルで同じファイル名を使用するXML記述子が異なる必要があります。

ちょっと考えてみましょう。別のjarにある各ファイルの内容を、uberjarにある1つのファイルに追加する必要がありますか?あなたはそれを試すことができます。それが機能し、あなたが手作業でZipファイルを作成し名前を変更することが苦になることが多いほど頻繁にパッケージ化する必要がある場合は、SBTが最善の策になると私は信じています。

私は、元のjarファイルと私のコンテナをパッケージ化し、アプリケーション

クラスローダーをロードしたクラスではなく、jarファイルを起動するときにクラスパスにこのjarファイルを参照する必要があります。 .classファイル、(uber)ジャー、戦争など、あなたが与えるすべてのものをアンパッケージするのはコンテナーの仕事です。クラスパスから動的にロードするプログラムは、クラスやリソース(.xmlファイルなど)のいずれかをロードしています。 .jarファイルがリソースである可能性があります。その場合は、jarファイルをuberjarに入れます。だからそれをパッケージ化することはまだ可能です。

関連する問題