2016-09-28 9 views
0

私はこの質問の可能性のある重複をチェックしましたが、私の問題に答えるものは見つかりませんでした。それらのほとんどは.jarファイルまたはmavenリポジトリの名前をつけるのをやめます。私はクラスをインポートするために地元のレポとその瓶の中を見て助けが必要です。私は、アドレスimportはローカルreposには対応していません。JavaクラスをローカルリポジトリからClojureにインポートするには?

lein deploy local local/scxml 2.2.0 ~/Documents/commons-scxml/target/commons-scxml2-2.0-SNAPSHOT.jar 
:私は、次のコマンドを使用して、ローカルのjarファイルの参照を作成し

(defproject sc-tester "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"] 
       [local/scxml "2.2.0"]]  ;;; <<<---=== local jar reference 
    :main ^:skip-aot sc-tester.core 
    :target-path "target/%s" 
    :repositories [["local" "file:local-repo"]] ;;; <<<---=== local repo reference 
    :profiles {:uberjar {:aot :all}}) 

は私がlein app sc-testerを経由して、私が作成した新鮮なLeiningenをプロジェクトに追加した2つのラインに注目し、次project.cljを考えてみましょう

このコマンドの結果、次の内容がとなりました。local_repo

local-repo/ 
`-- local 
    `-- scxml 
     |-- 2.2.0 
     | |-- scxml-2.2.0.jar 
     | |-- scxml-2.2.0.jar.md5 
     | `-- scxml-2.2.0.jar.sha1 
     |-- maven-metadata.xml 
     |-- maven-metadata.xml.md5 
     `-- maven-metadata.xml.sha1 

lein depsの呼び出しは失敗しません(それが続くと同じではありません!):

lein deps :tree 
[clojure-complete "0.2.4" :exclusions [[org.clojure/clojure]]] 
[local/scxml "2.2.0"] 
[org.clojure/clojure "1.8.0"] 
[org.clojure/tools.nrepl "0.2.12" :exclusions [[org.clojure/clojure]]] 

jarファイルをクラスの束が含まれています。ここで夫婦、SCXMLSCXMLExecutor含めて、コンテキストの数との抜粋ですが、私は、インポートしたい:

$ jar tvf local-repo/local/scxml/2.2.0/scxml-2.2.0.jar 
... 
2275 Mon ... 2016 org/apache/commons/scxml2/model/Script.class 
5857 Mon ... 2016 org/apache/commons/scxml2/model/SCXML.class 
8963 Mon ... 2016 org/apache/commons/scxml2/model/Send.class 
... 
12466 Mon ... 2016 org/apache/commons/scxml2/SCXMLExecutionContext.class 
11358 Mon ... 2016 org/apache/commons/scxml2/SCXMLExecutor.class 
    848 Mon ... 2016 org/apache/commons/scxml2/SCXMLExpressionException.class 
... 

は、今私はREPLを起動し、中にこれらのクラスに名前を付ける方法を推測 を開始しますimportの呼び出し:

$ lein repl 
nREPL server started on port 60765 on host 127.0.0.1 - nrepl://127.0.0.1:60765 
REPL-y 0.3.7, nREPL 0.2.12 
Clojure 1.8.0 
Java HotSpot(TM) 64-Bit Server VM 1.8.0_101-b13 
... 

sc-tester.core=> (import 'local/scxml.SCXML) 
ClassNotFoundException scxml.SCXML java.net.URLClassLoader.findClass 
(URLClassLoader.java:381) 
sc-tester.core=> (import 'local/scxml/org/apache/commons/scxml2/model/SCXML) 
ClassNotFoundException scxml/org/apache/commons/scxml2/model/SCXML 
java.lang.Class.forName0 (Class.java:-2) 

Hmmm。別の種類のエラーですが、正しい答えを見つけ出すのに役立ちません。のではなく、スラッシュのランダムな場所にドットを試してみましょう:

sc-tester.core=> (import 'local/scxml.org/apache/commons/scxml2/model/SCXML) 
ClassNotFoundException scxml.org/apache/commons/scxml2/model/SCXML 
java.lang.Class.forName0 (Class.java:-2) 

のはほとんど-すべてのドットを試してみましょう:

sc-tester.core=> (import 'local/scxml.org.apache.commons.scxml2.model.SCXML) 
ClassNotFoundException scxml.org.apache.commons.scxml2.model.SCXML 
java.net.URLClassLoader.findClass (URLClassLoader.java:381) 

ましょうレポ名を切り取ってみてください:

ClassNotFoundException apache/commons/scxml2/model/SCXML 
java.lang.Class.forName0 (Class.java:-2) 

sc-tester.core=> (import 'org/apache/commons/scxml2/model/SCXML) 
等等等(多くの順列及び推測を試みました)。

質問:私は正しく地元のレポを

  1. を設定しました、言い換えれば、それも可能私のセットアップとimportの呼び出しに正しくクラスに名前を付けるのですか?

  2. もしそうなら、どのようにしてClojureにJavaクラスをインポートできますか?これらの獣を命名するための正しい構文は何ですか?

答えて

3

あなただけのクラス名とパッケージを使用して、クラスパス上の任意のjarファイルからクラスをインポートすることができるはずです。

(import 'org.apache.commons.scxml2.model.SCXML) 

問題が解決しない場合は、jarファイルをクラスパスとあなたにではありません最初に修正する必要があります。

+1

Worked。レシピは「レポ名を前面から切り取り、すべてのスラッシュをドットで置き換えます」。隣の私の同僚も、これがJavaのパッケージという概念であり、私に小さな例を教えてくれたことを教えてくれました。ライトが点灯しています。 –

関連する問題