Clojure项目启动报错:无法找到clojure/java/jdbc/ddl类路径,求解决
问题:Clojure项目中找不到clojure/java/jdbc/ddl类的错误修复
我刚开始学习Clojure,项目包含两个文件:project.clj和src/test-clojure-project/core.clj,运行时出现如下错误,求修复方法:
项目文件代码
project.clj
(defproject test-clojure-project "0.1.0-SNAPSHOT" :description "A simple Clojure web project" :dependencies [[org.clojure/clojure "1.10.0"] [ring "1.10.0"] [ring/ring-jetty-adapter "1.10.0"] [ring/ring-json "0.5.0"] [cheshire "5.10.0"] [org.postgresql/postgresql "42.3.1"] [org.clojure/java.jdbc "0.7.11"] ;; [ring/ring-reload "0.3.1"] ] :main ^:skip-aot test-clojure-project.core :target-path "target/%s" :profiles {:uberjar {:aot :all}})
src/test-clojure-project/core.clj
(ns test-clojure-project.core (:require [ring.adapter.jetty :as jetty] [ring.util.response :as response] [ring.middleware.reload :refer [wrap-reload]] [cheshire.core :as json] [clojure.java.jdbc :as jdbc] [clojure.java.jdbc.ddl :as ddl])) (def db-spec {:subprotocol "postgresql" :subname "//localhost/test_db" :user "postgres" :password "secret"}) (def posts-table [:posts [:id :serial "PRIMARY KEY"] [:content :text]]) (defn create-post [post] (jdbc/with-connection db-spec (jdbc/insert! :posts {:content (:content post)}))) (defn get-data [] (jdbc/with-connection db-spec (jdbc/query "SELECT * FROM posts"))) (defn handler [request] (let [uri (:uri request)] (cond (= uri "/posts-list") (let [response-data (get-data)] (response/response (str response-data))) (= uri "/create-post") (if (= (:request-method request) :post) (let [json-data (-> request :body slurp) parsed-data (json/parse-string json-data true) created-post (create-post parsed-data)] (response/response (json/generate-string created-post))) (response/response "Invalid request method")) :else (response/response "Route not found")))) (defn -main [] (do (println "Server started successfully on port 3000") ;; Create the 'posts' table if it doesn't exist (jdbc/with-connection db-spec (ddl/create-table-ddl posts-table :if-not-exists)) (jetty/run-jetty (wrap-reload handler) {:port 3000})))
运行错误信息
2023-08-05 17:41:30.332:INFO::main: Logging initialized @1359ms to org.eclipse.jetty.util.log.StdErrLog Exception in thread "main" Syntax error compiling at (test_clojure_project/core.clj:1:1). Caused by: java.io.FileNotFoundException: Could not locate clojure/java/jdbc/ddl__init.class, clojure/java/jdbc/ddl.clj or clojure/java/jdbc/ddl.cljc on classpath.
修复步骤
移除无效的命名空间依赖
你使用的org.clojure/java.jdbc "0.7.11"版本中,没有单独的clojure.java.jdbc.ddl命名空间,DDL相关函数已经合并到clojure.java.jdbc主命名空间。修改core.clj的require语句,删掉[clojure.java.jdbc.ddl :as ddl],最终ns声明如下:(ns test-clojure-project.core (:require [ring.adapter.jetty :as jetty] [ring.util.response :as response] [ring.middleware.reload :refer [wrap-reload]] [cheshire.core :as json] [clojure.java.jdbc :as jdbc]))替换DDL函数调用
将代码中ddl/create-table-ddl改为jdbc/create-table-ddl,对应-main函数中的代码修改为:(jdbc/with-db-connection [conn db-spec] (jdbc/create-table-ddl posts-table :if-not-exists))修复废弃的数据库连接函数
注意jdbc/with-connection在该版本已被废弃,需改用jdbc/with-db-connection,且后续JDBC操作需要传入连接对象:- 修改
create-post函数:(defn create-post [post] (jdbc/with-db-connection [conn db-spec] (jdbc/insert! conn :posts {:content (:content post)}))) - 修改
get-data函数:(defn get-data [] (jdbc/with-db-connection [conn db-spec] (jdbc/query conn "SELECT * FROM posts")))
- 修改
完成以上修改后,重新运行项目即可解决该错误。
内容的提问来源于stack exchange,提问作者Bo-Peep
相关产品推荐
相关产品推荐

