Ich stecke schon seit einigen Tagen in einer Sache fest, die ich wissen Ich bin schon einmal zur Arbeit gegangen. Wahrscheinlich übersehe ich etwas Offensichtliches. Für jede Hilfe wäre ich dankbar.
In meinem Clojure-Programm möchte ich auf Methoden von Klassen zugreifen, die ursprünglich in Java geschrieben wurden. Nehmen wir ein konkretes Beispiel: org.infoml.jaxb.ObjectFactory. Diese Klassen befinden sich in einer .jar-Datei ( infoml-classes-1.0.jar
), die eine doppelklickbare Java-Anwendung ist. Wenn Sie die jar-Datei öffnen, sehen Sie den Ordner für das oberste Segment des Pakets der Java-Klassen:
macscooter:infoml-classes-1.0 folder gw$ find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'
.
|____META-INF
| |____MANIFEST.MF
|____org
| |____infoml
| | |____infocardOrganizer <<<<<< Java application's classes
| | | |____AFileFilter.class
| ... many classes omitted here
| | | |____UniqueContentListener.class
| | | |____UniqueContentModel.class
| | |____jaxb
| | | |____AgentContainerLocationType.class
| | | |____AgentType.class
| ... many classes omitted here
| | | |____ObjectFactory.class <<<<<< HERE IT IS
| ... many classes omitted here
| | | |____TableRowType.class
| | | |____TableType.class
macscooter:infoml-classes-1.0 folder gw$
In meinem Clojure-Programm importiere ich es (aus der Datei cardmaker.clj
):
(ns infwb.cardmaker
(:gen-class)
(:import
(javax.xml.bind JAXBContext JAXBException Marshaller
Unmarshaller)
(org.infoml.jaxb ContentAgentContainerLocationType
InfomlFile InfomlType ObjectFactory PType <<<<<< HERE IT IS
RichTextWithExactType
SelectorsType
SimpleRichTextType)
(java.io ByteArrayOutputStream IOException)))
Wenn ich den Klassenpfad ausdrucke, den die REPL sieht, ist es dort (als infoml-classes-1.0.jar
):
infwb.cardmaker> (doseq [p (.getURLs (java.lang.ClassLoader/getSystemClassLoader))] (println (.getPath p)))
/Users/gw/tech/clojurestuff/cljprojects/infwb/src/
/Users/gw/tech/clojurestuff/cljprojects/infwb/test/
/Users/gw/tech/clojurestuff/cljprojects/infwb/classes/
/Users/gw/tech/clojurestuff/cljprojects/infwb/lib/clojure-1.3.0-SNAPSHOT.jar
/Users/gw/tech/clojurestuff/cljprojects/infwb/lib/clojure-contrib-1.2.0.jar
/Users/gw/tech/clojurestuff/cljprojects/infwb/lib/infoml-classes-1.0.jar <<<<<< HERE IT IS
/Users/gw/tech/clojurestuff/cljprojects/infwb/lib/piccolo2dcore-1.3.jar
/Users/gw/tech/clojurestuff/cljprojects/infwb/lib/piccolo2dextras-1.3.jar
/Users/gw/tech/clojurestuff/cljprojects/infwb/lib/sxqj-beta2.jar
/Users/gw/tech/clojurestuff/cljprojects/infwb/lib/dev/clojure-1.2.0.jar
/Users/gw/tech/clojurestuff/cljprojects/infwb/lib/dev/swank-clojure-1.3.0-20110104.084027-21.jar
nil
infwb.cardmaker>
Wenn ich jedoch versuche, die Datei cardmaker.clj zu kompilieren (entweder mit C-c C-k oder (load-file "src/infwb/cardmaker.clj")
erhalte ich die folgende Ausnahme:
Could not initialize class org.infoml.jaxb.ObjectFactory
[Thrown class java.lang.NoClassDefFoundError]
Ich bin sogar so weit gegangen, meinen Rechner neu zu starten, um zu versuchen, versehentliche Verschmutzungen als Ursache des Problems auszuschließen. Ich habe verschiedene Dinge im Internet recherchiert - ohne Erfolg. Ich habe in der Datei MANIFEST.MF nach Hinweisen gesucht und die jar-Datei auf die Klassen reduziert, die ich brauche. Ich habe jetzt zweimal über Nacht darüber geschlafen - immer noch keine Lösung.
Die Verwendung vorhandener Java-Klassen in Clojure ist eine nützliche Sache. Ich wäre dankbar für die Hilfe, die mir jemand geben kann. Danke!
ADDENDUM: Mein Problem wurde durch eine Reihe von Faktoren verursacht, darunter eine fehlende jar-Datei. Die Antwort von @kotarak war genau richtig. Danke.