2010-07-14 132 views
1

我正在尝试从简单的clojure文件创建jar文件的过程。下面是我的Clojure代码:从clojure文件制作jar文件时发生FileNotFoundException

(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

我看到错误“java.io.FileNotFoundException:找不到应用程序/ hello__init.class或应用程序类路径中的/hello.clj:(NO_SOURCE_FILE:0)“,当我尝试完成(compile 'app.first)步骤时。

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

任何人都可以看到我要去哪里错了吗?或者就此而言,我想要做的就是学习如何从clojure文件创建jar,所以如果有人知道更好/更简单的方法来做到这一点,请告诉我。

+1

注意'refer'形式是不必要的; 'ns'已经为你做了。 – 2010-07-14 16:34:41

+0

啊,谢谢。我得到的代码实际上有一条评论,因为作者也不确定。 – trh178 2010-07-16 12:14:32

回答

2

这是更好地使用Leiningen这样的任务 - 它允许保持相关性,并包所有必要的组件集成到jar文件

+0

这工作良好,直到lein uberjar步骤。我最大的问题是(不是来自Java),我无法理解抛出的错误和异常。我遵循这个教程http://github.com/technomancy/leiningen/blob/master/TUTORIAL.md。我得到这个异常“java.lang.Exception:名称冲突,无法首先确定,因为命名空间:用户引用:#'clojure.core/first(project.clj:1)”。有任何想法吗? – trh178 2010-07-14 15:14:14

+0

我把这个标记为被接受的BC,我最终使用了leiningen,但我想我应该在上面的评论中回答我自己的问题,以了解我如何最终得到它的工作。项目名称不能与类名相匹配(如链接教程中所示)。我必须将项目First(在project.clj中)和ns在first/core.clj文件中调用first.core。如果其他人有同样的问题,希望有帮助... – trh178 2010-07-14 16:18:27

+0

事实上,这不是事实,你必须有其他项目布局的问题......(事实上,我有兴趣知道当你在哪里得到你的异常 - 我很难猜测它可能来自哪里)。只要你把你的原始代码放在src/app/first.clj中,并在你的项目中添加':main app.first'。 clj',无论项目名称如何,一切都应该工作。特别是,如果该项目本身被称为“app.first”,它将工作得很好。 – 2010-07-14 16:40:09

1

我对此很生疏,但是我听说过其他有类似问题的人。

我认为记住您指出的类路径指向您的类树的根目录是有帮助的,并且程序包名称最终会在该树中创建子目录。尴尬地说,但我希望你明白这个主意。因此,我认为你需要做一些类型的体操与创建目录以匹配“app.first” - >“/ app/first”层次结构。

对不起,这就像我接近一个明智而有用的答案一样。希望这可以帮助你。


编辑:

计算机科学的总理指令:它只有当你做一切正常吧!我花了近10分钟摆弄这个,但终于成功了。

这就是我需要做的就是你的程序进行编译:

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

...我发现了一堆类文件的classes。 JARring应该是一个单元。

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

+0

我认为你是对的。我按照上面的链接设置了我的目录。项目/应用程序和项目/类,我的文件位于project/app/first.clj。我认为问题可能是我从哪里运行clojure?我试着从项目中运行它......但由于某种原因它无法看到app/first.clj。 – trh178 2010-07-14 14:18:26

+1

编辑回答以显示操作方法。但是,在这个练习中捣乱了我,我很想同意@Alex Ott :)但是,我个人的偏好是使用支持Clojure的IDE。有Eclipse,NetBeans和IntelliJ Idea的插件。后者可能是“最好的”。 – 2010-07-14 14:53:25

+0

我现在就试试这个。刚刚尝试leiningen ...工作得很好,直到最后。 lein uberjar命令抛出错误“java.lang.Exception:名称冲突,无法首先定义,因为namespace:user引用:#'clojure.core/first(project.clj:1)”。 PS:在leiningen使用此链接进行教程http://github.com/technomancy/leiningen/blob/master/TUTORIAL.md – trh178 2010-07-14 14:58:40