2017-09-18 1 views
2

sbtアセンブリプラグインを使用して、sparジョブをuber-jarパッケージにしました。sbtアセンブリからuber jarを実行すると、エラーが発生します。メインクラスが見つかりませんでした。

Error: Could not find or load main class com.foo.Bar

java -jar assembly.jar 

結果: build.sbtが意図コマンドを実行し、正しく作成された組立後、得られたユーバージャー

mainClass in assembly := Some("com.foo.Bar") 

の対象となる実行可能メインを指定します

java -cp assembly.jar com.foo.Barのような別の方法を使用すると、同じエラーメッセージが表示されます。

次に、新しいディレクトリでuber-jarの内容を抽出しました。私はcom/foo/ディレクトリとBar.classファイルを見ることができます。私が試した抽出されたディレクトリのルートから :

java -cp . com.foo.Bar 

と私は正しい結果を得ることができます。

はまた、エラーの理由を見つけようと、私が試した:

java -verbose -jar assembly.jar 

私はJavaのコアクラスがロードされて見ることができますが、私は私のパッケージのクラスのいずれかがロードされて表示されません。

ここで間違いがありますか?

答えて

3

広範な調査(髪の毛を引っ張って読む)の結果、この現象は、得られた宇宙瓶のMETA-INFディレクトリにある平坦化されたjarファイルの1つからの不正なINDEX.LISTの結果であることが判明しました。

JAR file specに続いて、INDEX.LIST(存在する場合)は、Jarファイルからどのパッケージをロードするかを指定します。これを避けるために

、我々は結果META-INFディレクトリの任意の汚染を避けるために、ルールにmergeStrategyを更新:

case PathList("META-INF", xs @ _*) => MergeStrategy.discard 

これは、問題を修正し、私の正気を返されました。


更新:いくつかの余分な検索後

、それはdefault merge strategyINDEX.LISTの適切なケアを要することが判明しました。この回答は、カスタマイズされたマージストラテジーで、このような問題を処理するケースが含まれている場合に適用されます。META-INFpathSpec

関連する問題