Clojure的 :require 和 Instaparse

3

我正在尝试在我的clojure项目中使用instaparse库。我的项目依赖项中使用了leiningen 2.0和clojure 1.5.1。我按照以下方式将instaparse添加到我的项目依赖项中:

(defproject bachelor "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.5.1"]
         [org.clojure/clojure-contrib "1.2.0"]
         [instaparse "1.1.0"]])

这是我尝试要求该库的源代码:

(ns bachelor.data
  (:require [clojure.string :as str])
  (:require [instaparse.core :as insta])
  (:use [clojure.contrib.generic.math-functions])
  )

当我尝试编译时,我得到以下错误信息:
cd c:/bachelor/src/bachelor.data/ 1 compiler notes: Unknown location: error: java.io.FileNotFoundException: Could not locate instaparse/core__init.class or instaparse/core.clj on classpath: company.clj:1:1: error: java.io.FileNotFoundException: Could not locate instaparse/core__init.class or instaparse/core.clj on classpath: (company.clj:1) Compilation failed.
我检查了项目的类路径,我认为instaparse应该被找到。 lein classpath C:\bachelor\test;C:\bachelor\src;C:\bachelor\dev-resources;C:\bachelor\resources;C:\bachelor\target\classes;C:\Users\Maciej.m2\repository\instaparse\instaparse\1.1.0\instaparse-1.1.0.jar;C:\Users\Maciej.m2\repository\org\clojure\clojure-contrib\1.2.0\clojure-contrib-1.2.0.jar;C:\Users\Maciej.m2\repository\org\clojure\clojure\1.5.1\clojure-1.5.1.jar 你有任何想法我做错了什么吗?
更新:
我更新了lein classpath的结果。之前,我粘贴了旧的结果。

很奇怪你在项目中指定了Clojure 1.5.1,但是在你的lein classpath输出中却有clojure 1.4.0。此外,Clojure Contrib已被弃用,你应该导入不同的模块。详情请参见:http://dev.clojure.org/display/doc/Clojure+Contrib+Libraries。 - noahlz
2个回答

2

这里是一个可用的样例项目:

project.clj:

(defproject parse "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.5.1"]
                 [instaparse "1.1.0"]])

你不需要为 contrib 添加这些代码,而且 string 已经内置在 Clojure 中了。

src/parse/core.clj:

(ns parse.core
  (:require [instaparse.core :as insta]
            [clojure.string :as str]))
(def as-and-bs
  (insta/parser
   "S = AB*
     AB = A B
     A = 'a'+
     B = 'b'+"))

repl:

#<Namespace parse.core>
parse.core>  (as-and-bs "aaaaabbbaaaabb")
[:S [:AB [:A "a" "a" "a" "a" "a"] [:B "b" "b" "b"]] [:AB [:A "a" "a" "a" "a"] [:B "b" "b"]]]
parse.core> (str/join "," ["a" "b" "c"])                                                                                                                                  
"a,b,c" 

我的Leiningen常见问题解决清单:

  • 运行lein deps并重启nrepl/emacs
  • 运行lein clean并重启nrepl/emacs
  • 删除本地libs目录(lein v1.x)
  • 删除本地maven仓库并运行lein deps

但我按照您发布的所有内容操作了,但仍然无法正常工作。您确定我不需要使用contrib来进行数学函数计算吗?因为我在我的计算中使用了pow函数。 - dzwonu
2
旧的单体Clojure-contrib从Clojure <= 1.2.x已经完全死亡。它被分成许多部分,这些部分在单独的项目中进行维护。请查看:http://dev.clojure.org/display/community/Where+Did+Clojure.Contrib+Go - Arthur Ulfeldt
我从依赖项中删除了contrib,并从源文件中删除了引用它的:use,但问题仍然存在。 "FileNotFoundException Could not locate instaparse/core__init.class or instaparse/core.clj on classpath: clojure.lang.RT.load (RT.java:443)" - dzwonu

0
我找到了问题所在。我使用Leiningen创建项目,但是使用Clojure-box或Clooj开发源代码。我还尝试使用这些工具编译我的源代码,这是一个错误。当你运行这样的IDE时,它会加载自己的类路径,这就是为什么它找不到我想要使用的库的原因。现在我使用以下命令编译我的源代码:

lein compile

并在以下命令中运行:

lein repl

一切都正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接