java - 通过 Maven Shade 插件构建着色 jar 时保留 Clojure .clj 文件的时间戳

标签 java maven jar clojure maven-shade-plugin

当使用 maven-shade-plugin 打包包含一些 Clojure 库和一些 Java 的 jar Artifact 时。我们对 Clojure 代码使用 AOT 编译。当我们加载 jar 时,它的加载时间非常慢。 AOT 编译应该对此有很大帮助,但那不是我们所看到的。 我们注意到在 java jar -verbose 输出中,加载 Clojure 类时发生了很多 JVM__DEFINE_CLASS 调用。

这没有意义,因为我们的更多 Clo​​jure 代码被 AOT 编译为 .class 文件。

事实证明,maven-shade-plugin 创建了所有新文件,并在最终 Artifact 中使用了新的时间戳 Clojure 使用 .clj 文件与 .class 文件的时间戳信息来确定是否该文件需要重新编译。 maven-shade-plugin 导致 .clj 文件及其关联的 .class 文件具有相同时间戳,因此 Clojure 始终选择动态重新编译源。

在这一点上,我们能够找出的唯一解决方法是编写一个脚本来重新打开阴影 jar 并将 .clj 文件时间戳返回到过去的某个时间,以便它们不会等于它们关联的 .class 文件的时间戳。

有人知道更好的方法吗?

最佳答案

不确定这是否更好,但您也可以选择从 jar 中排除 clojure 源。这将防止它们被重新编译。我在用 lein 构建并用 pack200 压缩时遇到了这个问题。此处有更多详细信息:

jar built with jwrapper doesn't work

不确定用于排除文件的 Maven 选项,但是使用 lein 你可以放入一个排除模式,比如 #".(clj|java)"来排除源文件。

关于java - 通过 Maven Shade 插件构建着色 jar 时保留 Clojure .clj 文件的时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19594360/

相关文章:

java - 如何获取用于编写自定义 Lombok 转换的 org.mangosdk.spi.ProviderFor 依赖项?

java - 从代码中调用jar中的java类

java - 指定的初始和最大堆大小不兼容

java - 如何创建一个简单的Python动画

java - 为什么我的测试没有触发我的过滤器?

java - 从 LinkedList 中删除特定元素....?

java - Netbeans IDE - 如何更改 ANT 脚本的默认运行目标?

java - 无法使用 Struts 2.5 运行简单的登录应用程序

java - 我如何知道哪个 Maven 包包含我将要使用的类?

java - 简单的 Swing 应用程序。 jar 文件在我的电脑上运行,但在其他电脑上不运行