Ошибка компиляции Leiningen с файлами Java, которые ссылаются на классы, сгенерированные из файлов Clojure - PullRequest
3 голосов
/ 18 февраля 2012

У меня есть проект Leiningen, который компилирует файлы Java и Clojure.Файлы Java импортируют некоторые классы, сгенерированные из файлов Clojure (с gen-class).

Когда я выполняю компиляцию lein, я получаю ошибки компиляции при импорте в файлы Java (говоря, что это может 'найти классы).Если я удаляю файлы Java из проекта, делаю компиляцию lein, добавляю файлы Java обратно и снова компилирую lein, все работает нормально.

Итак, файлы Clojure нужно скомпилировать до того, как Javaфайлы.

Кстати, я включаю файлы Clojure, которые классы gen, в список: aot.

Что здесь не так?

1 Ответ

4 голосов
/ 18 февраля 2012

(Код в этом ответе не проверен, хотя, надеюсь, он должен работать с Leiningen 1.x (для последних значений x).)

Задача Leiningen compile запускает задачу javac автоматически, если ваш project.clj указывает :java-source-path. Это происходит до компиляции исходных кодов Clojure, потому что, я полагаю, это обычное направление зависимости.

Чтобы обойти это, вы можете использовать крючок:

;;; in leiningen.hooks.clj_first.clj

(ns leiningen.hooks.clj-first
  (:require [leiningen.compile :as leinc]
            [leiningen.javac :as javac]))

(defn compile-clj-first-hook [compile-task project & args]
  (apply compile-task
         (dissoc project :java-source-path)
         args))
  (javac/javac project))

(add-hook #'leiningen.compile/compile compile-clj-first-hook)

Поместите это где-нибудь в свой путь к классу во время сборки и добавьте

:hooks [clj-first-hook]

к карте вашего проекта.

Обратите внимание, что javac при прямом вызове все равно не будет вызывать compile. Вы также можете сделать его эквивалентным compile, например. подключив его с помощью следующей функции:

(defn javac-hook [javac-task project]
  (if (project ::clj-compiled?)
    (javac/javac project)
    (leinc/compile project)))

Последняя форма compile-clj-first-hook должна быть

(javac/javac (assoc project ::clj-compiled? true))

(Выполнение compile , а не вызов javac вообще может сломаться jar / uberjar.)

...