2016-09-28 5 views
0

Я проверил возможные дубликаты для этого вопроса, и я не нашел ответа на мою проблему. Большинство из них останавливается при названии файла .jar или репозитория maven. Мне нужна помощь в поиске локального репо и его банке для импорта классов. Ответы SO я нашел, что адрес import не адресует локальные репозитории.Импорт классов Java в Clojure из локального репо?

Рассмотрим следующий project.clj, отметив две строки, я добавил к новому 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]]] 

Сосуд файл содержит кучу классов; вот отрывок с несколько для контекста, в том числе пара, SCXML и SCXMLExecutor, я хотел бы импортировать:

$ 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

Вы должны быть в состоянии импортировать классы из любой баночки на вашем пути к классам, используя только имя класса и пакет:

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

Если это не сработает, баночка не на вашем пути к классам и вы должен исправить это в первую очередь.

+1

Работал. Рецепт - это «отрезать имя репо с фронта и заменить все слэши точками». Мой сосед по соседству также научил меня, что это понятие Java-пакета, и показал мне небольшой пример. Горит свет. –

Смежные вопросы