在 Clojure 中需要命名空间时出现 FileNotFoundException

Posted

技术标签:

【中文标题】在 Clojure 中需要命名空间时出现 FileNotFoundException【英文标题】:FileNotFoundException when requiring namespaces in Clojure 【发布时间】:2022-01-16 06:56:51 【问题描述】:

我想在我的应用中使用clojure.java.ioclojure.data.csv

这就是我需要这些命名空间的方式:

(ns my-app.core
  (:gen-class)
  (:require [clojure.java.io :as io]
            [clojure.data.csv :as csv]))

当我在 REPL 中评估 ns 函数时,我收到此错误:

; Execution error (FileNotFoundException) at my-app.core/eval8295$loading (form-init1647489175359256060.clj:1).
; Could not locate clojure/data/csv__init.class, clojure/data/csv.clj or clojure/data/csv.cljc on classpath.

VS 代码 v1.62.3 / 卡尔瓦。 v2.0.229 / Leiningen v2.9.8 on Java v15.0.1 / macOS v11.6.1

这是我的 Java 类路径,在同一个 REPL 会话中通过调用 (java.lang.System/getProperty "java.class.path") 生成:

"/Users/my-username/Code/my-app/test:/Users/my-username/Code/my-app/src:/Users/my-username/Code/my-app/dev-resources:/Users/my-username/Code/my-app/resources:/Users/my-username/Code/my-app/target/default/classes:/Users/my-username/.m2/repository/cider/cider-nrepl/0.22.4/cider-nrepl-0.22.4.jar:/Users/my-username/.m2/repository/nrepl/nrepl/0.8.3/nrepl-0.8.3.jar:/Users/my-username/.m2/repository/org/clojure/clojure/1.10.3/clojure-1.10.3.jar:/Users/my-username/.m2/repository/org/clojure/spec.alpha/0.2.194/spec.alpha-0.2.194.jar:/Users/my-username/.m2/repository/org/clojure/core.specs.alpha/0.2.56/core.specs.alpha-0.2.56.jar:/Users/my-username/.m2/repository/org/nrepl/incomplete/0.1.0/incomplete-0.1.0.jar"

这是我的应用程序目录结构(脚手架用lein new app my-app):

.
├── CHANGELOG.md
├── LICENSE
├── README.md
├── doc
│   └── intro.md
├── project.clj
├── resources
│   ├── my-data-1.csv
│   └── my-data-2.csv
├── src
│   └── my_app
│       └── core.clj
├── target
│   └── default
│       ├── classes
│       │   └── META-INF
│       │       └── maven
│       │           └── my-app
│       │               └── my-app
│       │                   └── pom.properties
│       ├── repl-port
│       └── stale
│           └── leiningen.core.classpath.extract-native-dependencies
└── test
    └── my_app
        └── core_test.clj

我的 Java 环境或我的 Clojure 安装似乎有问题。我似乎无法弄清楚问题出在哪里,以及如何解决它。

任何建议将不胜感激。

【问题讨论】:

您是否已将 clojure.data.csv 添加到 project.clj 文件的 :dependencies 部分? Clojure 默认不包含该库,因此您需要引用它。 确实!我没有将clojure.data.csv添加到我的project.clj文件中。这就是问题所在。我是这样添加的:[org.clojure/data.csv "1.0.0"]——现在它工作正常,我觉得自己很笨。如果您将评论添加为答案,我会接受。另外,我偶然发现了this page,它解决了完全相同的问题。 如果您正在处理 CSV 数据,您可能对这些功能感兴趣:cljdoc.org/d/tupelo/tupelo/21.11.06a/api/tupelo.csv 感谢您的提示,@AlanThompson!我看到有几个不同的 CVS 库可用。 【参考方案1】:

我忘记将clojure.data.csv 添加到我的project.clj 文件中。

这里是project.clj,更改应用于:dependencies

(defproject my-app "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license :name "EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0"
            :url "https://www.eclipse.org/legal/epl-2.0/"
  :dependencies [[org.clojure/clojure "1.10.3"]
                 [org.clojure/data.csv "1.0.0"]]
  :main ^:skip-aot my-app.core
  :target-path "target/%s"
  :profiles :uberjar :aot :all
                       :jvm-opts ["-Dclojure.compiler.direct-linking=true"])

相关部分:

:dependencies [[org.clojure/clojure "1.10.3"]
               [org.clojure/data.csv "1.0.0"]]

现在可以正常使用了。

【讨论】:

以上是关于在 Clojure 中需要命名空间时出现 FileNotFoundException的主要内容,如果未能解决你的问题,请参考以下文章

映射 hbm 文件时出现错误“命名空间中的元素 'class' 具有无效的子元素 'set'”

将 Clojure 命名空间拆分为多个文件

创建类图时出现“名称空间中已存在”消息

反序列化自定义 XML 时出现 InvalidOperationException(缺少命名空间)

Clojure 中的命名空间之间共享函数

将 C# 函数发布到 AWS lambda 时出现“类型或命名空间不存在”错误