【问题标题】:jar built with jwrapper doesn't work用 jwrapper 构建的 jar 不起作用
【发布时间】:2014-12-06 20:23:03
【问题描述】:

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 文件已经打包,我可以解决这个问题。使用 没有帮助,因为它不知道文件已打包。

【问题讨论】:

  • 为什么不用JWrapper的支持呢?
  • 他们的支持页面将用户引导至 stackoverflow。
  • 好的,“JWrapper 伙计们,你们在哪里?”

标签: java jwrapper


【解决方案1】:

根本问题是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

【讨论】:

    猜你喜欢
    • 2016-09-02
    • 2017-09-10
    • 2017-05-28
    • 2012-11-21
    • 1970-01-01
    • 2018-05-28
    • 2021-08-03
    • 2012-03-06
    • 1970-01-01
    相关资源
    最近更新 更多