2014-12-06 29 views
2

jwrapper以某種方式操縱應用程序jar,並導致運行不正常的jar:在運行時它拋出「MyClass不能轉換爲MyClass」類型的錯誤。我相信這是由重新評估創建類加載器的代碼導致的,導致加載類MyClass的多個實例。使用jwrapper構建的jar不起作用

jwrapper文檔沒有描述對jar的更改,除了使用pack200。我已經隔離測試了pack200,並沒有導致這個問題。

我也通過傳遞給「java -jar」測試了由jwrapper構建的jar,而不使用包裝器可執行文件。所以它不是jvm轉換,或其他任何包裝正在做的事情:jar本身被破壞了。

UPDATE:

jwrapper允許跳過pack200,但隨後的安裝文件是巨大的。由於pack200在獨立運行時工作,如果有某種方法可以告訴jwrapper文件已經打包,我可以解決這個問題。使用<Pack200Exceptions>並沒有幫助,因爲它不知道文件被打包。

+0

你爲什麼不使用JWrapper的支持? – keuleJ 2014-12-08 19:34:45

+0

他們的支持頁面將用戶引導至計算器。 – user1009908 2014-12-08 19:38:51

+1

好吧,「JWrapper傢伙你在哪裏?」 – keuleJ 2014-12-09 07:38:53

回答

3

潛在的問題是jwrapper將pack200選項「modification_time」設置爲「latest」,這會更改所有類文件的修改時間。在運行時,這會導致clojure編譯器嘗試從源文件重新編譯類。

解決方法是在打包之前從jar中刪除.clj文件,以防止編譯器運行。 lein「:omit-source」選項在這裏是不夠的,因爲它會從任何依賴關係中保留.clj文件。相反,您必須在uberjar-exclusions中使用一種模式,例如

:uberjar-排除[# 「(CLJ | JAVA)。」]

這裏詳述:

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