我有一个clojure脚本,我已经运行了好几年了。
最近我不得不重新安装leiningen和java 8.
当我运行代码时,我现在在第三方库上获得了多个StackOverflowErrors。
E.g。 StackOverflowError org.apache.commons.math3.util.FastMath.cosQ(FastMath.java:1850)
和
StackOverflowError clojure.lang.Numbers $ DoubleOps.combine(Numbers.java:571)
我会发布代码,但它现在发生在我的代码和第三方库的多个点上?
答案 0 :(得分:2)
没有堆栈跟踪和一些代码,很难找到特定的anser,所以这里有一些通用的方法:
通过挖掘日志,还原为备份等来重新创建旧环境,然后运行:
lein deps :tree 2>&1 > old-lein-dependencies
2>&1
部分确保版本范围和冲突警告
包括在输出中。
记下leiningen版本和java版本:
lein version
重复这些步骤并记录与以前相同的信息:
lein deps :tree 2>&1 > new-lein-dependencies
lein version
java -version
挑选所有差异
diff -u old-lein-dependencies new-lein-dependencies
在顶部会有一大块差异,莱因打印出所有重要的警告。最后的线索几乎总是在这里,虽然通常不容易立即识别。
完成每个版本更改,从初始配置开始,通过固定project.clj中的版本,直到找到破坏事物的更改。固定这些的便捷方法是使用project.clj文件中的:managed-dependencies
块。它看起来像这样:
:managed-dependencies [[http-kit "2.3.0-alpha4"]]
并重复切换版本的过程,直到您掌握引入更改的位置。对我来说,这几乎总是在依赖项而不是特定版本中使用版本范围的结果。我对版本范围不再太热心了: - /
答案 1 :(得分:0)
所以我无法比较以前的设置,因为它是在擦干净的机器上。
我发现错误已经悄悄进入该工具执行的一个数学公式,它基本上反复调用自身,导致堆栈溢出错误。