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 には、クラスパス シャドーイングのような感覚がありました。

ConcurrencyUtils がどの jar から来ているかを把握するために、repl で次のことを行いました。

(.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]

除外の影響がどのようなものかはわかりません。マトリックスを壊さない古いバージョンの jplasma が clojars にあります。それを project.clj に追加してみてください:

[incanter/jplasma "0.9.4"]

ただし、これらの dep は明らかに、それらを理解している誰かが適切にソートする必要があります。

于 2013-01-02T01:33:03.240 に答える