3

jwrapper 以某种方式操纵应用程序 jar,并导致 jar 无法正常工作:在运行时它会抛出“MyClass cannot be cast to MyClass”类型错误。我相信这是由重新评估创建类加载器的代码引起的,导致加载 MyClass 类的多个实例。

jwrapper 文档没有描述对 jar 所做的更改,除了使用 pack200。我已经单独测试了pack200,它不会导致这个问题。

我还通过将 jwrapper 传递给“java -jar”,在不使用 wrapper 可执行文件的情况下测试了由 jwrapper 构建的 jar。所以这不是 jvm 转换,或者包装器正在做的任何其他事情:jar 本身已损坏。

更新:

jwrapper 允许跳过 pack200,但是安装文件很大。由于 pack200 在独立运行时工作,如果有某种方法可以告诉 jwrapper 文件已经打包,我可以解决这个问题。使用 <Pack200Exceptions> 没有帮助,因为它不知道文件已打包。

4

1 回答 1

3

根本问题是 jwrapper 将 pack200 选项“modification_time”设置为“latest”,这会更改所有类文件的修改时间。在运行时,这会导致 clojure 编译器尝试从源代码重新编译类。

一种解决方法是在打包之前从 jar 中删除 .clj 文件,从而阻止编译器运行。lein ":omit-source" 选项在这里是不够的,因为它会在 .clj 文件中留下任何依赖项。相反,您必须在 :uberjar-exclusions 中使用模式,例如

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

如此处详述:

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

于 2014-12-10T19:52:08.900 回答