Ошибка компиляции Leiningen с файлами Java, которые ссылаются на классы, созданные из файлов Clojure
-
27-10-2019 - |
Вопрос
У меня есть проект Leiningen, который компилирует файлы Java и Clojure.Файлы Java импортируют некоторые классы, созданные из файлов Clojure (с помощью gen-class).
Когда я выполняю компиляцию lein, я получаю ошибки компиляции при импорте в файлы Java (говоря, что он не может найти классы).Если я удалю файлы Java из проекта, скомпилирую lein, снова добавлю файлы Java и снова скомпилирую lein, все будет работать нормально.
Это похоже на то, что файлы Clojure нужно скомпилировать до файлов Java.
Кстати, я включаю файлы Clojure, которые генерируют классы, в список: aot.
Что здесь не так?
Решение
(Код в этом ответе не протестирован, хотя, надеюсь, он должен работать с Leiningen 1.x (для последних значений x).)
Задача compile
Leiningen автоматически запускает задачу javac
, если в вашем project.clj
указан код :java-source-path
. Это происходит до компиляции исходных кодов Clojure, потому что я полагаю, что это обычное направление зависимости.
Чтобы обойти это, вы можете использовать ловушку:
родовое словоПоместите это где-нибудь в путь к классам времени сборки и добавьте
родовое словона карту вашего проекта.
Обратите внимание, что javac
при прямом вызове по-прежнему не вызывает compile
. Вы также можете сделать его эквивалентом compile
, например. подключив его следующей функцией:
Последней формой генерирующего кода тега тогда должен быть
родовое слово (Если вы заставите compile-clj-first-hook
не вызывать compile
вообще, это может привести к поломке javac
/ jar
.)