通过 clojars 分发一个简单的库
Distributing a simple library via clojars
我已经实现了 hyphenation algorithm (at namespace hyphenator-clj.core
), defined it as org.clojars.nikonyrh.hyphenator-clj 0.1.0
at defproject and pushed it to Clojars。 Uberjar 似乎有像 core__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_clj__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 中,但资源文件是另一个主题。
您最好不要在命名空间 hyphenator-clj
中使用连字符。为什么不直接使用 hyphenator
?但是如果你这样做,我怀疑目录的名称应该有一个下划线而不是一个连字符,所以是:hyphenator_clj
。
如果解决这个问题没有帮助,那么我从你的问题中看不到的另一件事是目录结构中 core.clj
的确切位置,并且 project.clj
反映出来了吗?例如,名称空间 hyphenator-clj.core
的路径是否位于项目根目录之外的 src
目录中?项目的根定义为 project.clj
所在的位置。
问题中还有其他值得一看的地方是,您是否可以让程序在本地运行,而无需将其打包到 uberjar 中并将其发送到 clojars。我的猜测是它确实在本地工作,但它有助于说明这一点。
好的,现在查看您的链接。您可能想阅读一个部署到 clojars 的工作项目,它的名称中包含连字符,例如 here。您可能会注意到的第一个区别是您使用的项目名称相当长:org.clojars.nikonyrh.hyphenator-clj
。它应该只是 hyphenator-clj
。此外,我建议像该项目一样使用以“-SNAPSHOT”结尾的标识符。
但是从更大的角度来看,您在评论中提出的一个好主意是在完全不使用 Clojars 的情况下进行测试。为此,请在您要从另一个 lein 项目使用的库上使用 lein install
。
啊哈,至少我现在对这个过程理解得更好了,基本上我的 require
必须与使用的 JAR 文件的结构相匹配,这可能与项目名称有很大不同。例如 cc.qbits/spandex 实际上是 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 \-))))
我已经实现了 hyphenation algorithm (at namespace hyphenator-clj.core
), defined it as org.clojars.nikonyrh.hyphenator-clj 0.1.0
at defproject and pushed it to Clojars。 Uberjar 似乎有像 core__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_clj__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 中,但资源文件是另一个主题。
您最好不要在命名空间 hyphenator-clj
中使用连字符。为什么不直接使用 hyphenator
?但是如果你这样做,我怀疑目录的名称应该有一个下划线而不是一个连字符,所以是:hyphenator_clj
。
如果解决这个问题没有帮助,那么我从你的问题中看不到的另一件事是目录结构中 core.clj
的确切位置,并且 project.clj
反映出来了吗?例如,名称空间 hyphenator-clj.core
的路径是否位于项目根目录之外的 src
目录中?项目的根定义为 project.clj
所在的位置。
问题中还有其他值得一看的地方是,您是否可以让程序在本地运行,而无需将其打包到 uberjar 中并将其发送到 clojars。我的猜测是它确实在本地工作,但它有助于说明这一点。
好的,现在查看您的链接。您可能想阅读一个部署到 clojars 的工作项目,它的名称中包含连字符,例如 here。您可能会注意到的第一个区别是您使用的项目名称相当长:org.clojars.nikonyrh.hyphenator-clj
。它应该只是 hyphenator-clj
。此外,我建议像该项目一样使用以“-SNAPSHOT”结尾的标识符。
但是从更大的角度来看,您在评论中提出的一个好主意是在完全不使用 Clojars 的情况下进行测试。为此,请在您要从另一个 lein 项目使用的库上使用 lein install
。
啊哈,至少我现在对这个过程理解得更好了,基本上我的 require
必须与使用的 JAR 文件的结构相匹配,这可能与项目名称有很大不同。例如 cc.qbits/spandex 实际上是 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 \-))))