我已经实施了hyphenation algorithm(在命名空间hyphenator-clj.core
),在defproject将其定义为org.clojars.nikonyrh.hyphenator-clj 0.1.0
并将其推送到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 /示例/ 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中,但资源文件是另一个主题。
答案 0 :(得分:0)
在命名空间hyphenator-clj
中不使用连字符可能会更好。为什么不使用hyphenator
?但是,如果你这样做,我怀疑目录的名称应该有一个下划线而不是一个连字符,所以be: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
。
答案 1 :(得分:0)
Ahaa至少我现在对这个过程有所了解,基本上我的require
必须与所使用的JAR文件的结构相匹配,这可能与项目的名称非常不同。例如,cc.qbits/spandex实际上require
为qbits.spandex
。
通过将其移动到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 \-))))