繁体   English   中英

从命令行运行Clojure Jar的不一致

[英]Inconsistency running a clojure jar from command line

我有一个clojure程序,该程序在某个时候执行一个称为db-rebuild-files-table的函数。 该函数将目录文件名作为单个字符串参数,并调用递归函数,该递归函数下降到目录文件树中,从那里的文件中提取某些数据,并将每个文件记录在mysql数据库中。 该命令的最终结果是一个“文件”表,该表由给定目录下树中的所有文件填充。

我需要的是能够从Shell定期运行此命令。

因此,我在包含-main函数的文件中添加了:gen-class指令,该函数实际调用了(db-rebuild-files-table *dirname*) 我运行lein uberjar并生成一个jar,然后可以执行:

java -jar my-project-SNAPSHOT-1.0.0-standalone.jar namespace.containing.main

当然,该函数可以运行,但是在数据库中,目录* dirname *仅存在一个条目。 当我在clojure REPL中执行完全相同的 sexp时,我得到正确的行为:* dirname *下的所有文件树都得到处理。

我究竟做错了什么? 为什么从REPL调用和从命令行执行时,调用(db-rebuild-files-table *dirname*)行为不一致?

[编辑]更奇怪的是,我在任何地方都没有错误。 所有函数调用似乎都能正常工作。 我什至可以在REPL中运行-main函数,它可以正确更新表。

如果这在REPL中有效,但在独立执行时无效,那么我想您可能会被Clojure的懒惰所困扰。

为了获得副作用的好处(例如,写入数据库),您的代码是否可能需要doseq ]?

搞定了。 这是我程序中的一个非常隐蔽的错误。 我被Clojure的懒惰咬了。 我的文件树函数在内部使用map,因此仅生成第一个值,即根目录。 由于某些原因,我仍然不知道,当在REPL中执行时,实际上是强制执行评估并生成了整个树序列。 我只是在函数中添加了一个doall ,它就解决了。

仍然试图弄清楚为什么在REPL上执行某些操作会强制评估。 有什么想法吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM