2016-06-17 9 views
2

Ich möchte eine statische Methode in einer Java-Klasse aufrufen, die ich von Clojure erstellt habe. Wie würde ich das machen?Wie rufst du eine statische Methode in meiner eigenen Java-Klasse von Clojure?

Was ich bisher versucht habe, ist einfach eine Java-Klasse im selben Ordner wie meine Clojure-Quelle zu erstellen, aber entweder bekomme ich eine ClassNotFoundException oder es wird mir gesagt, dass es keinen solchen Namespace gibt. Ich habe auch versucht, die Klasse auf verschiedene Arten zu importieren, wobei ich die Java-Paketdeklaration mehrmals neu gefolgert habe, ohne weitere Ergebnisse.

Ich benutze Leiningen für den Umgang mit meinem Clojure-Projekt.

+1

Mögliche Duplikat [Java und Clojure mit Leiningen] (http://stackoverflow.com/questions/5432163/java-and- clojure-with-leiningen) – kongeor

Antwort

2

Sie müssen auch Informationen über den Speicherort Ihrer Java-Klasse in der Datei project.clj Ihres Projekts angeben.

Hier ist ein Beispiel.

Die Java-Klasse:

public class BestClass { 
    public static String testThis() { 
     return "Hello"; 
    } 
} 

Diese Klasse in use-java\src\java wo use-java befindet, ist das Projektverzeichnis.

project.clj:

(defproject use-java "0.1.0-SNAPSHOT" 
    :description "FIXME: write description" 
    :url "http://example.com/FIXME" 
    :license {:name "Eclipse Public License" 
      :url "http://www.eclipse.org/legal/epl-v10.html"} 
    :dependencies [[org.clojure/clojure "1.8.0"]] 
    :java-source-paths ["src/java/"] 
    :main ^:skip-aot use-java.core 
    :target-path "target/%s" 
    :profiles {:uberjar {:aot :all}}) 

Der wichtige Teil oben in der Datei ist :java-source-paths ["src/java/"].

Beachten Sie, dass Sie den Speicherort der Klasse ändern können, aber: java-source-paths müssen entsprechend geändert werden.

core.clj:

(ns use-java.core 
    (:import BestClass)) 

(defn try-out-java-method [] 
    (BestClass/testThis)) 

try-out-java-method Aufruf gibt:

use-java.core> (try-out-java-method) 
"Hello" 
+0

Kannst du mehr Details zur Projektstruktur angeben, wo befindet sich 'core.clj', zu welchem ​​Paket' BestClass', etc.? Ich habe versucht, was du gesagt hast und es hat nicht funktioniert – niceman