2016-07-06 11 views
0

maven-assembly-pluginを使用して実行可能なjar(uberjar)をビルドしようとしています。このプロジェクトでは、依存性注入のプロバイダとしてHK2が使用されています。hk2住人ファイルがuber-jarアセンブリで上書きされています

@Serviceは、プロジェクトと一部の依存関係で定義されています。 HK2サービスロケータは、inhabitant filesMETA-INF/hk2-locator/default)から、コンパイル/ビルド時に生成されます。私はhk2-metadata-generatorを使用しています。

私の問題は、デフォルトのアセンブリ方法jar-with-dependenciesは、jarをビルドする前にすべてをアンパックすることです。これにより、最後に解凍されたものがMETA-INF/hk2-locator/defaultに上書きされます。その結果、サービスロケータはすべてのサービスを見つけることができません。

私はさまざまな解決策を模索しており、いずれかが最高の指針を探しています。アセンブリ

1.集計異なる住人のファイルは、私が一つにすべての住民のファイルを組み合わせたアセンブリ・ディスクリプタを作成しました:アセンブリのプラグインで愚かなバグは別に

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd"> <id>uberjar</id> <formats> <format>jar</format> </formats> <includeBaseDirectory>false</includeBaseDirectory> <containerDescriptorHandlers> <!-- remove this element and the following file-aggregator generates an empty file --> <!-- see https://issues.apache.org/jira/browse/MASSEMBLY-815 --> <containerDescriptorHandler> <handlerName>metaInf-services</handlerName> </containerDescriptorHandler> <containerDescriptorHandler> <handlerName>file-aggregator</handlerName> <configuration> <filePattern>META-INF/hk2-locator/default</filePattern> <outputPath>META-INF/hk2-locator/default</outputPath> </configuration> </containerDescriptorHandler> </containerDescriptorHandlers> <dependencySets> <dependencySet> <unpack>true</unpack> <scope>runtime</scope> <useProjectArtifact>true</useProjectArtifact> </dependencySet> </dependencySets> </assembly> 

、これは、見た目がよく合っている住民のファイルをもたらします。しかし、Service Locatorに記述子をダンプするように依頼すると、プロジェクトのサービスが何度か検出されます。私はそれが問題であるかどうか、特にシングルトンサービスについては分かりません。

2.この背後にある考え方は、彼らのMETA-INF -filesに触れていない、自分自身のjar-ファイルに依存性を残していた依存関係に

を開梱しないでください。私はthis postに続いてjarをビルドしましたが、私はクラスローディングの問題がありました。MANIFEST.MFクラスパスにjarを指定しても、依存関係をロードできませんでした。

クラスローディングを修正できるのであれば、これは最もクリーンなソリューションのようです。代わりに、住民のファイルの

3.ランタイム発見

This solutionも有望です。問題は、hk2-testngを使った私のテストではうまくいかないことです(私はここで何が違うのか分かりません)。


個別の解決方法や進捗状況についてアドバイスがありましたら、お気軽にご連絡ください。

+0

私は#1に行きます。私たちはそのような解決策を常に使用しています。 * 4番目のオプションは、hk2-inhabitant-generatorを最後の終了したjar上で実行することです。この4番目のオプションは、すべてを1つのjarファイルに入れてクラスを選んで選択するのではなく、そのjarファイルの正しいメタデータファイルを保証したい場合に特に便利です – jwells131313

答えて

1

HK2の住人ファイルは、一緒に連結したときに正しく動作するように設計されているため、上記のオプション1が機能します。あなたがHabitatGeneratorを実行すると

java org.jvnet.hk2.generator.HabitatGenerator --file *my-uber.jar* 

1

をフルモジュールを一緒に入れたときに私たちは、そのオプションを使用また、最後のステップとして、完成瓶の上にhk2-inhabitant-generatorを実行することである4つ目のオプションでのような何かを行くことができますそのようにすると、jarファイル内のすべてのファイルをスキャンし、すべてのhk2サービスと共にjarファイルにMETA-INF/hk2-locator/defaultファイルを追加します。

uber jarがより正確であることが保証されているため、uber jarが全体ではなく他のjarファイルの一部である場合は、これがより良いオプションです(uber jarにないサービスは含まれません)

関連する問題