2013-10-25 1 views
4

При использовании плагина maven-shade для упаковки артефакта jar, содержащего несколько библиотек Clojure и некоторую Java. Мы использовали компиляцию AOT для нашего кода Clojure. Когда мы загрузили банку, у нее было очень медленное время загрузки. Предполагается, что сборник AOT поможет в этом совсем немного, но это было не то, что мы видели. Мы заметили в java jar -verbose output, что было много JVM__DEFINE_CLASS звонки, происходящие при загрузке классов Clojure.Сохранение временных меток на файлах Ccljure .clj при построении заштрихованной банки через Maven Shade Plugin

Это не имело смысла, так как больше нашего кода Clojure был AOT, скомпилированный в файлы .class.

Оказывается Maven-тень-плагин создает все новые файлы с новыми временными метками в конечном артефакте Clojure использует информацию о временной метки на .clj файл по сравнению с .class файла, чтобы определить, нуждается ли файл в перекомпилировать. maven-shade-plugin вызывал файл .clj, и связанный с ним файл .class имел тот же самый timestamp, поэтому Clojure всегда выбирал динамически перекомпилировать исходный код.

Единственным обходным решением, которое мы смогли выяснить на данный момент, является создание сценария, который будет повторно открывать затененную банку и удалять временные метки файла .clj в какое-то время в прошлом, так что они не будут равны отметкам времени их ассоциированных файлов .class.

Кто-нибудь знает о лучшем подходе?

ответ

2

Не уверен, что это лучше, но вы также можете исключить источник clojure из банки. Это предотвратит их перекомпиляцию. Я столкнулся с этим, когда строил лейн и сжимал пакет pack200. Более подробная информация здесь:

jar built with jwrapper doesn't work

Не уверен, что из вариантов Maven для исключения файлов, но с Lein вы можете оставить в шаблоне исключения, как # «(CLJ | Java)» исключить исходные файлы.

+0

Да, исключая файлы .clj из банки - это одно решение, которое должно быть реализовано с помощью Maven. Я посмотрел в плагин maven-shade немного глубже, и я не думаю, что есть какие-то конфигурации, которые бы помешали этому изменению временных меток. Построение AOT-банок с leiningen, похоже, тоже сохраняет временные метки - так +1. Спасибо за ваш отзыв! Я думаю, что это лучший ответ для этой проблемы прямо сейчас. – Dereference

Смежные вопросы