【问题标题】:Importing Java classes into Clojure from local repo?将 Java 类从本地仓库导入 Clojure?
【发布时间】:2016-09-28 11:44:49
【问题描述】:

我检查了这个问题的可能重复项,但没有找到一个可以回答我的问题的问题。他们中的大多数停止命名.jar 文件或maven repo。在查看本地 repo 及其 jar 以导入类时,我需要帮助。我发现地址 import 的 SO 答案没有解决本地存储库。

考虑以下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 文件包含一堆类;下面是一些上下文的摘录,包括一对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)

让我们尝试删除 repo 的名称:

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?命名这些野兽的正确语法是什么?

【问题讨论】:

    标签: clojure leiningen


    【解决方案1】:

    您应该能够仅使用类名和包从类路径中的任何 jar 导入类:

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

    如果这不起作用,则 jar 不在您的类路径中,您应该先修复它。

    【讨论】:

    • 工作。配方是“从前面剪掉 repo 名称,并用点替换所有斜线。”我隔壁的同事也告诉我这是Java“包”的概念,并给我看了一个小例子。灯亮了。
    猜你喜欢
    • 1970-01-01
    • 2011-06-17
    • 2018-08-23
    • 2013-10-03
    • 1970-01-01
    • 2022-01-20
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多