maven-assembly-plugin
を使用して実行可能なjar(uberjar)をビルドしようとしています。このプロジェクトでは、依存性注入のプロバイダとしてHK2が使用されています。hk2住人ファイルがuber-jarアセンブリで上書きされています
@Service
は、プロジェクトと一部の依存関係で定義されています。 HK2サービスロケータは、inhabitant files(META-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
を使った私のテストではうまくいかないことです(私はここで何が違うのか分かりません)。
個別の解決方法や進捗状況についてアドバイスがありましたら、お気軽にご連絡ください。
私は#1に行きます。私たちはそのような解決策を常に使用しています。 * 4番目のオプションは、hk2-inhabitant-generatorを最後の終了したjar上で実行することです。この4番目のオプションは、すべてを1つのjarファイルに入れてクラスを選んで選択するのではなく、そのjarファイルの正しいメタデータファイルを保証したい場合に特に便利です – jwells131313