首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过clojars分发一个简单的库

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

Stack Overflow用户
提问于 2017-03-26 17:57:15
回答 2查看 99关注 0票数 0

我实现了一个连字符算法 (在名称空间hyphenator-clj.core上),将它定义为org.clojars.nikonyrh.hyphenator-clj 0.1.0 at 脱脂工程并将其推送到克洛贾尔斯。Uberjar似乎有像core__init.classcore.cljcore.class这样的文件。

但是,当我试图使用它作为对其他项目的依赖时,我会得到以下错误:

代码语言:javascript
复制
$ 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:

代码语言:javascript
复制
(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:

代码语言:javascript
复制
(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中,但是资源文件是另一个主题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-26 22:11:41

至少我现在更好地理解了这个过程,基本上我的require必须与用过的JAR文件的结构相匹配,这可能与项目的名称有很大不同。例如,Cc.qbit/氨纶实际上是required作为qbits.spandex

english.txt依赖关系通过将其移动到resources文件夹、将新版本部署到Clojars并导入JAR中存在的依赖项来修复:

代码语言:javascript
复制
(ns example.core
  (:require [hyphenator-clj.core :as h])
  (:gen-class))

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

Stack Overflow用户

发布于 2017-03-26 18:44:12

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

如果解决这个问题没有帮助,那么另一件我无法从您的问题中看到的事情就是core.clj在目录结构中的确切位置,project.clj是否反映了这一点?例如,项目根目录下的名称空间hyphenator-clj.core的路径是什么?将项目的根定义为project.clj所在的位置。

在问题中可以看到的另一件事是,您是否可以让程序在本地运行,而不需要将其打包到uberjar中并将其运至clojars。我的猜测是,它确实在当地工作,但这将有助于说明这一点。

好了,现在看看你们的链接。您可能希望阅读一个部署到clojars中的工作项目,该项目的名称中包含有催眠术,例如这里。您可能注意到的第一个不同之处是您使用的项目名称相当长:org.clojars.nikonyrh.hyphenator-clj。应该是hyphenator-clj。此外,我建议使用以"-SNAPSHOT“结尾的标识符,就像该项目一样。

但是从更大的角度来看,你在评论中提出的一个很好的想法是在没有Clojars混合的情况下进行测试。要做到这一点,请在要从另一个lein项目中使用的库上使用lein install

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43032484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档