Leiningen erreur de compilation avec Java fichiers que les classes de référence générées à partir des fichiers Clojure

StackOverflow https://stackoverflow.com/questions/9336202

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?

Était-ce utile?

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.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top