【问题标题】:FileNotFoundException when making a jar file from the clojure file从 clojure 文件制作 jar 文件时出现 FileNotFoundException
【发布时间】:2010-07-14 14:02:14
【问题描述】:

我正在尝试从一个简单的 clojure 文件创建一个 jar 文件的过程。下面是我的clojure代码:

(ns app.first (:gen-class))  
(refer 'clojure.core)  
(defn -main [& args] (println "this program worked!"))  

我正在使用这些说明来创建 jar 文件:http://en.wikibooks.org/wiki/Clojure_Programming/Tutorials_and_Tips

当我尝试完成 (compile 'app.first) 步骤时,我看到错误“java.io.FileNotFoundException: 无法在类路径上找到 app/hello__init.class 或 app/hello.clj: (NO_SOURCE_FILE:0)”。

我的尝试和链接之间的唯一区别是我的文件名(first.clj 而不是 hello.clj)。

谁能看到我哪里出错了?或者就此而言,我想做的就是学习如何从 clojure 文件创建一个 jar,所以如果有人知道更好/更简单的方法,请告诉我。

【问题讨论】:

  • 请注意,refer 形式是不必要的; ns 已经为你做到了。
  • 啊,谢谢。我得到的代码实际上有一个评论,因为作者也不确定。

标签: clojure compilation


【解决方案1】:

这样的任务最好使用Leiningen - 它允许维护依赖关系,并将所有必要的组件打包到 jar 文件中

【讨论】:

  • 这在 lein uberjar 步骤之前运行良好。我最大的问题是(不是来自 Java)我无法理解抛出的错误和异常。我遵循了本教程github.com/technomancy/leiningen/blob/master/TUTORIAL.md。我得到了这个异常 "java.lang.Exception: Name conflict, can't def first because namespace: user refer to:#'clojure.core/first (project.clj:1)" 。有什么想法吗?
  • 我将此标记为已接受,因为我确实最终使用了 leiningen,但我认为我应该在上面的评论中回答我自己的问题,即我最终是如何让它工作的。项目名称不能与类名称匹配(如链接教程中所示)。我必须首先制作项目(在 project.clj 中),然后在 first/core.clj 文件中调用 ns first.core。如果其他人有同样的问题,希望对您有所帮助......
  • 其实这不是真的,你肯定有其他的项目布局问题...我努力猜测它可能来自哪里。)只要将原始代码放入src/app/first.clj 并在project.clj 中添加:main app.first,无论项目名称如何,一切都应该正常工作。特别是,如果项目本身被称为app.first,它将完全正常工作。
  • Michał 在我之前回答 - 他是对的,您需要有适当的项目布局并指定 uberjar 的入口点
【解决方案2】:

我对此感到生疏,但我听说其他人也有类似问题。

我认为记住您指定的类路径指向类树的根目录会很有帮助,并且包名称最终会在该树中创建子目录。有点尴尬,但我希望你能明白。因此,我认为您需要通过创建目录来匹配“app.first”->“/app/first”层次结构来进行一些类的操作。

抱歉,这与我得出的明智且有用的答案差不多。希望对您有所帮助。


编辑:

计算机科学的最高指导方针:只有当你一切都做对时它才有效!我花了将近 10 分钟的时间摆弄这个,但最终成功了。

这是编译您的程序所需要做的:

  • 使用您的代码创建了一个目录app,并在其中创建了first.clj
  • 通过在 Clojure 中执行 (pr *compile-path) 检查 *compile-path*。它说的是“课程”。
  • 创建了与app平行的第二个目录classes
  • 在shell中,做了export CLASSPATH=.:./classes
  • 在 Clojure 中,做了(compile 'app.first)

...我在classes 中找到了一堆类文件。 JARring 应该是轻而易举的事。

我发现运行(doc compile) 非常有帮助,因为这让我想起了需要有一个目录来满足*compile-path* 的要求。

【讨论】:

  • 我认为你是对的。我根据上面的链接设置了我的目录。 project/app 和 project/classes ,我的文件位于 project/app/first.clj 。我认为问题可能出在我从哪里运行 clojure ?我尝试从项目中运行它...但由于某种原因它看不到 app/first.clj。
  • 答案已编辑以显示操作方法。但是,在完成了这个练习之后,我很想同意@Alex Ott :) 不过,我个人的偏好是使用支持 Clojure 的 IDE。有 Eclipse、NetBeans 和 IntelliJ Idea 的插件。后者也许是“最好的”。
  • 我现在就试试这个。刚刚尝试了 leiningen ......直到最后都工作得很好。 lein uberjar 命令抛出错误 "java.lang.Exception: Name conflict, can't def first because namespace: user refer to:#'clojure.core/first (project.clj:1)" 。 PS:使用此链接获取关于 leiningen 的教程github.com/technomancy/leiningen/blob/master/TUTORIAL.md
  • 太棒了!你现在正式成为亚历克斯的问题! :) 呵呵,祝你好运!希望周围有很多友好的 Clojurians 来帮助解决任何其他问题。
  • 在 leiningen 失败后也尝试过。我再次在编译步骤失败。它在类路径中找不到 app/first.clj。我认为出于同样的原因我失败了所有这些尝试......当然希望我知道它是什么:) 我在哪里创建应用程序有关系吗?例如,当我运行我的 REPL 时,我调用 java -jar path/to/clojure.jar... 应用程序是否必须与 clojure.jar 位于同一目录中?
猜你喜欢
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
  • 1970-01-01
相关资源
最近更新 更多