Frage

Beim Erstellen eines Clojure Projekt mit Leiningen alle * .clj-Dateien AOT kompiliert werden. Im Normalfall nicht notwendig die AOT Compilation ist und ich würde es minimieren möchten.

Dies ist für mich in einer Java-Umgebung dominiertem Akzeptanz von Clojure als Ergänzung zu erhöhen. Es ist leichter zu „verkaufen“ eine einzige Klasse-Datei, die als Klebstoff zusammen mit einem paar kB CLJ-Dateien gegen die Alternative von 250+ kB Klasse-Dateien mit seltsamen Namen mit und unter ihnen eine wenig CLJ-Datei versteckt (die isn ‚t sogar mehr während der Ausführung lesen).

Im Idealfall ist das Ergebnis von „lein Kompilierung“ würde nur eine einzige kleine Klassendatei, die (zusammen mit den CLJ-Dateien und der Clojure-Bibliothek) implementiert die benötigte Klasse-Instanz sein.

Was ist der einfachste Weg, dies zu erreichen? Ich würde es vorziehen, nicht eine einzige Zeile Java (natürlich).

schreiben

Update nach Feedback von Technomantie

ich nicht vermuten, dass dies ein Leiningen Problem. Lassen Sie mich erklären, was ich mit einem Beispiel bin nach. Bitte entschuldigen Sie die Länge des Beispiels. Ich verwende Leiningen 1.3.1 aber ich denke, 1.4.0-Snapshoot die gleiche Art und Weise verhält.

$ lein new dummy
Created new project in: dummy
$ cd dummy

Jetzt Änderung project.clj bis (added ": main dummy.core"):

(defproject dummy "1.0.0-SNAPSHOT"
  :description "FIXME: write"
  :dependencies [[org.clojure/clojure "1.2.0"]
                 [org.clojure/clojure-contrib "1.2.0"]]
  :main dummy.core)

und src / dummy / core.clj an:

(ns dummy.core
  (:gen-class))
(defn -main [& args]
  (println "This is Clojure code, args=" args))

Sie es jetzt kompilieren:

$ lein compile
Compiling dummy.core

Dies erzeugt die folgenden Dateien in Klassen / Dummy :

core.class
core__init.class
core$loading__4410__auto__.class
core$_main.class

Das ist alles richtig, ich das Ergebnis ausführen kann:

$ java -cp lib/*:classes dummy.core Hello
This is Clojure code, args= (Hello)

Jetzt kommt, was ich stattdessen haben wollen, aber ich mache es manuell: Ich kann Löschen alle Klasse-Dateien mit Ausnahme von core.class und Kopieren die core.clj in Klassen / Dummy die jetzt sieht sehr leer:

$ ls classes/dummy/
core.class
core.clj

Die core.class Code enthält die core.clj zur Laufzeit zu laden und das Ergebnis ist immer noch das gleiche, kann ich noch tun:

$ java -cp lib/*:classes dummy.core Hello
This is Clojure code, args= (Hello)

Ich kann auch core.clj ändern. (Anmerkung: in Klassen / Dummy ) und natürlich Änderungen müssen nicht neu kompiliert werden

Nun kocht meine Frage an dieser nach unten: Gibt es einen einfacheren Weg, gerade diese core.class zu bekommen

War es hilfreich?

Lösung

Leiningen hat jetzt keine AOT standardmäßig schon seit geraumer Zeit getan; vielleicht Sie eine ältere Version? Aber es ist eine neue Funktion (in 1.4.0-SNAPSHOT), die sicherstellt .class-Dateien erstellt aufgrund transitiv AOT get gelöschter vor jar Schöpfung, (siehe Clojure Assembla # 322), die auch Sie interessieren könnten.

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