Scala で書かれた私のライブラリで、クラスを定義しました
class RouterRule(val rule: String) {}
(同じライブラリ内または別の scala プロジェクトから) scala から呼び出すと正常に動作しますが、別のプロジェクトで Java から呼び出すと NoSuchMethodError が発生しました。
aa$ java -classpath '*' org.jinou.http.SimpleHttpJava
Exception in thread "main" java.lang.NoSuchMethodError: org.jinou.http.RouterRule.<init>(Ljava/lang/String;)V
at org.jinou.http.MySimpleHandler$$anonfun$org$jinou$http$MySimpleHandler$$getHttpHandlerMethods$3.apply(SimpleHttpServer.scala:98)
at org.jinou.http.MySimpleHandler$$anonfun$org$jinou$http$MySimpleHandler$$getHttpHandlerMethods$3.apply(SimpleHttpServer.scala:96)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:194)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:194)
javap を介してクラスを確認したところ、メソッドが生成されていることがわかります。
javap -classpath simple-http-1.0.jar org.jinou.http.RouterRule
Compiled from "RouterRule.scala"
public class org.jinou.http.RouterRule extends java.lang.Object implements scala.ScalaObject{
public static final scala.collection.Seq convert(scala.collection.Seq);
public static final scala.Option check(scala.collection.Seq, java.lang.String);
public static final scala.util.matching.Regex dynamic();
public java.lang.String rule();
public scala.Option checkUrl(java.lang.String);
public org.jinou.http.RouterRule(java.lang.String);
}
どちらのプロジェクトも maven によってビルドされています。Scala バージョン 2.9.1、Java: 1.6.0_51
これはコンパイラのバグですか?
[更新]: 問題が見つかりました: コンストラクターが異なる別のライブラリに同じクラスの RouterRule があります。Java ランタイムが間違ったクラスを使用していました。そのクラスを削除した後、機能しました。