使用 jwrapper 构建的 jar 不起作用

2024-03-06

jwrapper 以某种方式操作应用程序 jar,并导致 jar 不起作用:在运行时它会抛出“MyClass 无法转换为 MyClass”类型错误。我相信这是由于重新评估创建类加载器的代码造成的,导致加载类 MyClass 的多个实例。

jwrapper 文档没有描述对 jar 所做的更改,除了 pack200 的使用之外。我单独测试过pack200,并没有出现这个问题。

我还通过将 jwrapper 传递给“java -jar”来测试 jwrapper 构建的 jar,而不使用包装器可执行文件。因此,这不是 jvm 转换,也不是包装器正在执行的任何其他操作:jar 本身已损坏。

UPDATE:

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


根本问题是 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 https://github.com/technomancy/leiningen/issues/1357

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 jwrapper 构建的 jar 不起作用 的相关文章

随机推荐