我检查了这个问题的可能重复项,但我找不到能解决问题的重复项。他们中的大多数都停止命名.jar
文件或maven repo。我需要帮助查看本地仓库及其jar来导入类。 SO回答我发现地址import
没有解决本地回购。
考虑以下project.clj
,注意我添加到我通过lein app sc-tester
创建的新leiningen项目中的两行:
(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}})
我使用以下命令创建了本地jar引用:
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文件包含一堆类;这里有一些摘录,包含一些上下文,包括一对,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}的调用中正确命名类我的设置?
如果是这样,我如何将java类导入Clojure?命名这些野兽的正确语法是什么?
答案 0 :(得分:3)
您应该只使用classname和package从类路径中的任何jar导入类:
(import 'org.apache.commons.scxml2.model.SCXML)
如果这不起作用,那么jar不在你的类路径中,你应该先修复它。