3

我在学习 clojure 时正在玩 incanter,当我尝试在 lein 下的 REPL 中创建矩阵时,我不断收到错误消息:

user=> (use 'incanter.io)
nil
user=> (use 'incanter.core)
nil
user=> (def A (matrix [[1 2 3] [4 5 6] [7 8 9]])) 
NoSuchMethodError edu.emory.mathcs.utils.ConcurrencyUtils.getThreads
BeginN_2D()Icern.colt.matrix.tdouble.impl.DenseColumnDoubleMatrix2D.assign (DenseColumnDoubleMatrix2D.java:661)

它看起来像一个依赖问题,但不知道如何解决这个问题。

4

1 回答 1

1

使用 [org.clojure/clojure "1.4.0"] 和 [incanter "1.4.1"] 遇到同样的问题。Def 有一种类路径阴影的感觉。

在 repl 中执行以下操作来确定 ConcurrencyUtils 来自哪个 jar:

(.getResource edu.emory.mathcs.utils.ConcurrencyUtils
    "/edu/emory/mathcs/utils/ConcurrencyUtils.class")

这指向 jplasma。果然,jplasma 有它自己的那个类的副本,其中有各种方法,包括缺少 getThreadsBeginN_2D。

查看 deps(“lein pom”后跟“mvn dependency:tree”)表明这是由 incanter 1.4.1 引入的依赖项:

[INFO] |  +- incanter:incanter-core:jar:1.4.1:compile
[INFO] |  |  +- org.clojure:math.combinatorics:jar:0.0.3:compile
[INFO] |  |  \- net.sourceforge.parallelcolt:parallelcolt:jar:0.10.0:compile
[INFO] |  |     +- net.sourceforge.jplasma:jplasma:jar:1.2.0:compile

将 project.clj 中的 incanter 条目更改为排除 jplasma:

[incanter "1.4.1"
    :exclusions [net.sourceforge.jplasma/jplasma]]

这从 jtransforms 获取 ConcurrencyUtils(因此仍然不是从 parallelcolt),但至少解决了矩阵问题:

=> (matrix [[1 2 3] [4 5 6] [7 8 9]])
[1.0000 2.0000 3.0000
4.0000 5.0000 6.0000
7.0000 8.0000 9.0000]

不知道排除的影响是什么。clojars 上有一个旧版本的 jplasma 不会破坏矩阵,您可以尝试将其添加到您的 project.clj:

[incanter/jplasma "0.9.4"]

不过,这些部门显然需要由了解它们的人正确分类。

于 2013-01-02T01:33:03.240 回答