Leiningen-Kompilierungsfehler mit Java-Dateien, die auf Klassen verweisen, die aus Clojure-Dateien generiert wurden

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

Frage

Ich habe ein Leiningen-Projekt, das sowohl Java- als auch Clojure-Dateien kompiliert.Die Java-Dateien importieren einige der Klassen, die aus den Clojure-Dateien (mit Gen-Klasse) generiert werden.

Wenn ich lein kompiliere, erhalte ich Kompilierungsfehler bei den Importen in die Java-Dateien (wenn ich sage, dass die Klassen nicht gefunden werden können).Wenn ich die Java-Dateien aus dem Projekt entferne, lein kompiliere, die Java-Dateien wieder hinzufüge und lein erneut kompiliere, funktioniert alles einwandfrei.

Es ist also so, als müssten die Clojure-Dateien vor den Java-Dateien kompiliert werden.

Übrigens füge ich die Clojure-Dateien, die Klassen generieren, in die: aot-Liste ein.

Was läuft hier falsch?

War es hilfreich?

Lösung

(Der Code in dieser Antwort ist nicht getestet, obwohl er hoffentlich mit Leiningen 1.x funktionieren sollte (für aktuelle Werte von x).)

Leiningens compile-Task führt die javac-Task automatisch aus, wenn Ihr project.clj einen :java-source-path angibt. Dies geschieht vor dem Kompilieren von Clojure-Quellen, da dies vermutlich die übliche Richtung der Abhängigkeit ist.

Um dies zu umgehen, können Sie einen Haken verwenden:

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

Platzieren Sie dies irgendwo in Ihrem Build-Time-Klassenpfad und fügen Sie hinzu

:hooks [clj-first-hook]

zu Ihrer Projektkarte.

Beachten Sie, dass javac beim direkten Aufruf immer noch keinen compile aufruft. Sie können es auch äquivalent zu compile machen, z. indem Sie es mit der folgenden Funktion einhaken:

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

Die letzte Form von compile-clj-first-hook müsste dann sein

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

(Wenn compile nicht javac aufruft, wird wahrscheinlich jar / uberjar beschädigt.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top