3

jwrapper は何らかの方法でアプリケーション jar を操作し、結果として機能しない jar が発生します。実行時に、「MyClass を MyClass にキャストできません」というタイプのエラーがスローされます。これは、クラス ローダーを作成するコードを再評価した結果、クラス MyClass の複数のインスタンスが読み込まれたことが原因であると考えられます。

jwrapper ドキュメントは、pack200 の使用を除いて、jar に加えられた変更について説明していません。pack200 を単独でテストしましたが、この問題は発生しません。

また、ラッパー実行可能ファイルを使用せずに jwrapper によってビルドされた jar を「java -jar」に渡すことでテストしました。したがって、jvm 変換ではなく、ラッパーが行っていることでもありません。jar 自体が壊れています。

アップデート:

jwrapper では pack200 をスキップできますが、インストール ファイルが巨大になります。pack200 はスタンドアロンで実行すると機能するため、ファイルが既にパックされていることを jwrapper に伝える方法があれば、これを回避できます。<Pack200Exceptions> を使用しても、ファイルがパックされていることがわからないため、役に立ちません。

4

1 に答える 1

3

根本的な問題は、jwrapper が pack200 オプションの "modification_time" を "latest" に設定することです。これにより、すべてのクラス ファイルの変更時刻が変更されます。これにより、実行時に clojure コンパイラーがソースからクラスを再コンパイルしようとします。

回避策は、パッケージ化の前に .clj ファイルを jar から削除して、コンパイラが実行されないようにすることです。lein ":omit-source" オプションは、依存関係から .clj ファイルを残すため、ここでは十分ではありません。代わりに、:uberjar-exclusions でパターンを使用する必要があります。

:uberjar-exclusions [#".(clj|java)"]

詳細はこちら:

https://github.com/technomancy/leiningen/issues/1357

于 2014-12-10T19:52:08.900 に答える