Я проверил возможные дубликаты для этого вопроса, и я не нашел ответа на мою проблему. Большинство из них останавливается при названии файла .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)
и т.д. и т.д. и т.п. (перепробовал много перестановок и догадок).
Вопросы:
ли я настроить локальный репозиторий правильно, другими словами, это даже возможно правильно назвать классы в вызове
import
с моей настройки?Если да, то как я могу импортировать классы java в Clojure? Какой правильный синтаксис для обозначения этих зверей?
Работал. Рецепт - это «отрезать имя репо с фронта и заменить все слэши точками». Мой сосед по соседству также научил меня, что это понятие Java-пакета, и показал мне небольшой пример. Горит свет. –