Clojure 通过clojars分发一个简单的库

Clojure 通过clojars分发一个简单的库,clojure,leiningen,clojars,Clojure,Leiningen,Clojars,我已经实现了一个(在名称空间hyphenator clj.core),将其定义为org.clojars.nikonyrh.hyphenator-clj 0.1.0,并将其推到。Uberjar似乎有像core\uuu init.class、core.clj和core.class这样的文件 但是,当我尝试将其用作其他项目的依赖项时,会出现以下错误: $ lein uberjar Retrieving org/clojars/nikonyrh/hyphenator-clj/org.clojars.ni

我已经实现了一个(在名称空间
hyphenator clj.core
),将其定义为
org.clojars.nikonyrh.hyphenator-clj 0.1.0
,并将其推到。Uberjar似乎有像
core\uuu init.class
core.clj
core.class
这样的文件

但是,当我尝试将其用作其他项目的依赖项时,会出现以下错误:

$ lein uberjar
Retrieving org/clojars/nikonyrh/hyphenator-clj/org.clojars.nikonyrh.hyphenator-clj/0.1.0/org.clojars.nikonyrh.hyphenator-clj-0.1.0.pom from clojars
Retrieving org/clojars/nikonyrh/hyphenator-clj/org.clojars.nikonyrh.hyphenator-clj/0.1.0/org.clojars.nikonyrh.hyphenator-clj-0.1.0.jar from clojars
Compiling example.core
java.io.FileNotFoundException: Could not locate org/clojars/nikonyrh/hyphenator_clj__init.class or org/clojars/nikonyrh/hyphenator_clj.clj on classpath. Please check that namespaces with dashes use underscores in the Clojure file name., compiling:(core.clj:1:1)
Exception in thread "main" java.io.FileNotFoundException: Could not locate org/clojars/nikonyrh/hyphenator_clj__init.class or org/clojars/nikonyrh/hyphenator_clj.clj on classpath. Please check that namespaces with dashes use underscores in the Clojure file name., compiling:(core.clj:1:1)
    at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3657)
    at clojure.lang.Compiler.compile1(Compiler.java:7474)
    at clojure.lang.Compiler.compile1(Compiler.java:7464)
    at clojure.lang.Compiler.compile(Compiler.java:7541)
    at clojure.lang.RT.compile(RT.java:406)
    at clojure.lang.RT.load(RT.java:451)
    at clojure.lang.RT.load(RT.java:419)
    at clojure.core$load$fn__5677.invoke(core.clj:5893)
    ...
我必须更改项目的文件夹结构,使其与预期的
org/clojars/nikonyrh/hyphenator\u clj\u_init.class
匹配,还是可以以某种方式覆盖当前行为?如果有一个很好的教程在那里,我会很乐意阅读它

基本上,我想让这个例子项目的工作。project.clj:

(defproject example "0.0.1-SNAPSHOT"
  :description ""
  :dependencies [[org.clojure/clojure "1.8.0"]
                 [org.clojars.nikonyrh.hyphenator-clj "0.1.0"]]
  :javac-options ["-target" "1.6" "-source" "1.6" "-Xlint:-options"]
  :aot [example.core]
  :main example.core)
src/example/core.clj:

(ns example.core
  (:require [org.clojars.nikonyrh.hyphenator-clj :as h])
  (:gen-class))

(defn -main [& argv] (doseq [arg argv] (println (h/hyphenate arg :hyphen \-))))

我怀疑我的english.txt也放错了目录,因为它不包含在uberjar中,但资源文件是另一个主题。

您最好不要在名称空间
连字符器clj
中使用连字符。为什么不直接使用
断字器
?但是如果你这样做了,我怀疑目录名中应该有下划线,而不是连字符,所以应该:
hyphenator\u clj

如果解决这个问题没有帮助,那么另一件事需要注意,我从你的问题中看不到,那就是
core.clj
在目录结构中的确切位置,
project.clj
是否反映了这一点?例如,命名空间
断字器clj.core
src
目录中的路径是否位于项目根目录之外?项目的根目录定义为
project.clj
所在的位置

在这个问题中,还有一点值得注意,那就是您是否可以让程序在本地运行,而不必将其打包到uberjar中并发送到clojars。我的猜测是,它确实在本地起作用,但这将有助于说明这一点

好的,现在看看你的链接。例如,您可能想阅读部署到clojars的工作项目,该项目的名称中有hypens。您可能注意到的第一个区别是您使用的项目名称相当长:
org.clojars.nikonyrh.hyphenator clj
。它应该是
断字器clj
。我还建议像那个项目一样,使用以“-SNAPSHOT”结尾的标识符


但是,从更大的角度来看,您在评论中提出的一个好主意是在不使用clojar的情况下进行测试。要执行此操作,请在要从另一个lein项目使用的库上使用
lein install

Ahaa至少我现在对这个过程有了更好的理解,基本上我的
require
必须匹配所用JAR文件的结构,这可能与项目名称非常不同。例如,实际上是
require
d作为
qbits.spandex

将english.txt依赖项移动到
resources
文件夹,将新版本部署到Clojars并导入JAR中存在的依赖项,从而修复了english.txt依赖项:

(ns example.core
  (:require [hyphenator-clj.core :as h])
  (:gen-class))

(defn -main [& argv] (doseq [arg argv] (println (h/hyphenate arg :hyphen \-))))

文件位于src/hyphenator_clj/core.clj(问题中的第一个链接是Github)。该项目是hyphenatorclj,因为它是我早期项目hyphenatorphp中的一个端口。当然,在Clojar的上下文中,“clj”只是额外的噪音。hyphenator-clj在某种意义上是“本地”工作的,您可以构建它并执行jar,但除了通过Clojar之外,我还没有尝试在其他项目中使用它。