Leiningen erreur de compilation avec Java fichiers que les classes de référence générées à partir des fichiers Clojure
-
27-10-2019 - |
Question
J'ai un projet Leiningen qui compile les fichiers Java et Clojure. Les fichiers Java importer certaines des classes qui sont générés à partir des fichiers de Clojure (avec gen classe).
Quand je compilons lein, je reçois des erreurs de compilation sur les importations dans les fichiers Java (en disant qu'il ne peut pas trouver les classes). Si je supprime les fichiers Java du projet, faire lein compilation, ajoutez les fichiers Java en arrière et faire lein recompiler, tout fonctionne très bien.
Alors, il est comme les fichiers Clojure doivent être compilés avant que les fichiers Java.
Par ailleurs, je suis notamment les fichiers Clojure que les classes gen dans la. Liste AOT
Qu'est-ce qui ne va pas ici?
La solution
(Le code de cette réponse est non vérifiée, même si elle devrait, espérons travailler avec 1.x Leiningen (pour les valeurs récentes de x).)
La tâche de compile
de Leiningen exécute la tâche de javac
automatiquement si votre project.clj
spécifie un :java-source-path
. Il le fait avant de compiler des sources Clojure, parce que je suppose que la direction est d'habitude de la dépendance.
Pour contourner ce problème, vous pouvez utiliser un crochet:
;;; 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)
Placez ce quelque part sur votre classpath accumulation du temps et ajouter
:hooks [clj-first-hook]
à votre carte de projet.
Notez que javac
, lorsqu'il est appelé directement, ne seront toujours pas appeler compile
. Vous pouvez aussi faire l'équivalent de compile
par exemple en l'accrochant avec la fonction suivante:
(defn javac-hook [javac-task project]
(if (project ::clj-compiled?)
(javac/javac project)
(leinc/compile project)))
La dernière forme de compile-clj-first-hook
aurait alors besoin d'être
(javac/javac (assoc project ::clj-compiled? true))
(Faire compile
pas appel javac
tout serait probablement briser jar
/ uberjar
.)