2016-09-28 35 views
0

我檢查了這個問題的可能重複,我沒有找到一個可以解決我的問題。他們大多停止命名.jar文件或maven回購。我需要尋找一個本地倉庫和它的jar來導入類的幫助。 SO回答我發現地址import沒有解決本地回購問題。從本地回購將Java類導入到Clojure中?

考慮以下project.clj,注意到兩個線I加入到新鮮leiningen項目我經由lein app sc-tester創建:

(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 deploy local local/scxml 2.2.0 ~/Documents/commons-scxml/target/commons-scxml2-2.0-SNAPSHOT.jar 

該命令導致以下內容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) 

嗯。另一種錯誤,但仍然沒有幫助找出正確的答案。讓我們嘗試在隨機的地方,而不是一個斜線點:

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) 

讓我們嘗試刪除回購的名稱:

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

等等,等等等等(嘗試了許多置換和猜測)。

問題:

  1. 難道我設置本地回購正確的,換句話說,就是它甚至可能到的import與我的建立一個呼叫正確命名的類?

  2. 如果是這樣,我該如何將java類導入到Clojure中?命名這些野獸的正確語法是什麼?

回答

3

您應該能夠從只使用類名和包在classpath任何JAR導入類:

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

如果不工作,罐子是不是在classpath和你應該先解決。

+1

工作。配方是「從前面剪下回購商品名稱,並用圓點替換所有的斜線。」我隔壁的同事也教會了我,這是Java「包裝」的概念,並給了我一個小例子。燈正在亮起。 –