我从像以下文件中编译了一个uberjar:
(defmain HadoopTest (:use 'cascalog.api) (defn bla ("alot of code"))
我在hadoop上运行uberjar,如:
$ hadoop jar myStandalone.jar clojure.main
我得到了一个REPL,但没有执行该文件。我仍然需要手工输入(:使用'cascalog.api)和(defn bla)。为什么会这样,我该如何解决?
非常感谢!
答案 0 :(得分:1)
如果您为hadoop jar <jar file> [<main class>] ...
提供了一个类名,它将调用该类中包含的main
方法。由于您在此处使用clojure.main
,因此将调出REPL(因为这是clojure.main.main()
应该执行的操作。)
所以,要么使用正确的类(我猜是你的AOT编译的Clojure命名空间),要么将这些信息存储在你的Uberjar中(例如通过项目文件中的Leiningen的:main
键),并省略类名,仅调用hadoop jar myStandalone.jar
。