QA@IT

sbtでビルドしたScalaのライブラリを参照するとエラーが報告されてしまいます.

4283 PV

Scales Xmlを試してみたくて、https://github.com/chris-twiner/scalesXml からリポジトリをクローンし、sbtでビルドして.jarを作成しました.しかし以下のようなサンプルプログラムを作ってライブラリを参照するとエラーが報告されてしまいます.

サンプルプログラム

package xmltest
import scales.utils._
import ScalesUtils._
import scales.xml._
import ScalesXml._
import java.io._
import scalaz._
import Scalaz._
import scales.xml.jaxen._
object main {
 def main(args: Array[String]): Unit = {
    val doc =  loadXml(new java.io.FileReader("MusicLibrary.xml"),defaultPathOptimisation)
    val root = top(doc)
    val xpath = ScalesXPath("musicLibrary/cd[string(year) = '1994']/title")
    val titles = xpath.evaluate(root)
    titles.foreach(title => println("The title='" + title.toString() + "'"))
  }
}

エラーメッセージ

error while loading ScalesBaseJaxenXPath, class file 'D:\My_Documents\GitHub\scalesXml\jaxen\target\scala-2.10\scales-jaxen_2.10-0.4.4.jar(scales/xml/jaxen/ScalesBaseJaxenXPath.class)' is broken (class java.lang.NullPointerException/null)

sbtのcompile~packageのログは以下のとおりです.

ビルドログ

> compile
[info] Updating {file:/D:/My_Documents/GitHub/scalesXml/}scales-xml...
[info] Updating {file:/D:/My_Documents/GitHub/scalesXml/}scales-xml-root...
[info] Resolving org.scala-lang#scala-library;2.10.0 ...
  [info] Resolving commons-codec#commons-codec;1.4 ...
  [info] Resolving org.slf4j#slf4j-api;1.6.1 ...
  [info] Resolving org.scalaz#scalaz-core_2.10;6.0.4 ...
[info] Done updating.
[info] Resolving org.scala-lang#scala-library;2.10.0 ...
[info] Updating {file:/D:/My_Documents/GitHub/scalesXml/}scales-jaxen...
[info] Compiling 68 Scala sources and 2 Java sources to D:\My_Documents\GitHub\s
calesXml\core\target\scala-2.10\classes...
[info] Done updating.
[info] Resolving org.scalesxml#scales-xml_2.10;0.4.4 ...
[info] Updating {file:/D:/My_Documents/GitHub/scalesXml/}scales-xml-tests...
[info] Resolving org.scala-lang#scala-library;2.10.0 ...
  [info] Resolving commons-codec#commons-codec;1.4 ...
  [info] Resolving org.slf4j#slf4j-api;1.6.1 ...
  [info] Resolving org.scalaz#scalaz-core_2.10;6.0.4 ...
  [info] Resolving jaxen#jaxen;1.1.3 ...
[info] Done updating.
[info] Resolving org.scalesxml#scales-xml_2.10;0.4.4 ...
  [info] Resolving org.scala-lang#scala-library;2.10.0 ...
  [info] Resolving commons-codec#commons-codec;1.4 ...
  [info] Resolving org.slf4j#slf4j-api;1.6.1 ...
  [info] Resolving org.scalaz#scalaz-core_2.10;6.0.4 ...
  [info] Resolving nu.validator.htmlparser#htmlparser;1.4 ...
  [info] Resolving org.ccil.cowan.tagsoup#tagsoup;1.2.1 ...
  [info] Resolving org.slf4j#slf4j-log4j12;1.6.1 ...
  [info] Resolving log4j#log4j;1.2.16 ...
  [info] Resolving com.novocode#junit-interface;0.8 ...
  [info] Resolving junit#junit;4.8.2 ...
  [info] Resolving org.scala-tools.testing#test-interface;0.5 ...
  [info] Resolving com.google.code.java-allocation-instrumenter#java-allocation-
instrumenter;2.0 ...
  [info] Resolving asm#asm;3.3.1 ...
  [info] Resolving asm#asm-analysis;3.3.1 ...
  [info] Resolving asm#asm-tree;3.3.1 ...
  [info] Resolving asm#asm-commons;3.3.1 ...
  [info] Resolving asm#asm-util;3.3.1 ...
  [info] Resolving asm#asm-xml;3.3.1 ...
  [info] Resolving com.google.guava#guava;r08 ...
  [info] Resolving com.google.code.gson#gson;1.7.2 ...
  [info] Resolving com.google.caliper#caliper;0.5-rc1 ...
  [info] Resolving com.google.code.findbugs#jsr305;1.3.9 ...
  [info] Resolving com.google.guava#guava;11.0.1 ...
[info] Done updating.
[info] Updating {file:/D:/My_Documents/GitHub/scalesXml/}jaxen-tests...
[info] Updating {file:/D:/My_Documents/GitHub/scalesXml/}saxon-tests...
[info] Resolving org.scalesxml#scales-jaxen_2.10;0.4.4 ...
  [info] Resolving org.scalesxml#scales-xml_2.10;0.4.4 ...
  [info] Resolving org.scala-lang#scala-library;2.10.0 ...
  [info] Resolving commons-codec#commons-codec;1.4 ...
  [info] Resolving org.slf4j#slf4j-api;1.6.1 ...
  [info] Resolving org.scalaz#scalaz-core_2.10;6.0.4 ...
  [info] Resolving jaxen#jaxen;1.1.3 ...
  [info] Resolving org.scalesxml.delme#scales-xml-tests_2.10;0.4.4 ...
  [info] Resolving nu.validator.htmlparser#htmlparser;1.4 ...
  [info] Resolving org.ccil.cowan.tagsoup#tagsoup;1.2.1 ...
  [info] Resolving org.slf4j#slf4j-log4j12;1.6.1 ...
  [info] Resolving log4j#log4j;1.2.16 ...
  [info] Resolving com.novocode#junit-interface;0.8 ...
  [info] Resolving junit#junit;4.8.2 ...
  [info] Resolving org.scala-tools.testing#test-interface;0.5 ...
  [info] Resolving com.google.code.java-allocation-instrumenter#java-allocation-
instrumenter;2.0 ...
  [info] Resolving asm#asm;3.3.1 ...
  [info] Resolving asm#asm-analysis;3.3.1 ...
  [info] Resolving asm#asm-tree;3.3.1 ...
  [info] Resolving asm#asm-commons;3.3.1 ...
  [info] Resolving asm#asm-util;3.3.1 ...
  [info] Resolving asm#asm-xml;3.3.1 ...
  [info] Resolving com.google.guava#guava;r08 ...
  [info] Resolving com.google.code.gson#gson;1.7.2 ...
  [info] Resolving com.google.caliper#caliper;0.5-rc1 ...
  [info] Resolving com.google.code.findbugs#jsr305;1.3.9 ...
  [info] Resolving com.google.guava#guava;11.0.1 ...
[info] Done updating.
[info] Resolving org.scala-lang#scala-library;2.10.0 ...
  [info] Resolving org.scalesxml.delme#scales-xml-tests_2.10;0.4.4 ...
  [info] Resolving org.scalesxml#scales-xml_2.10;0.4.4 ...
  [info] Resolving commons-codec#commons-codec;1.4 ...
  [info] Resolving org.slf4j#slf4j-api;1.6.1 ...
  [info] Resolving org.scalaz#scalaz-core_2.10;6.0.4 ...
  [info] Resolving nu.validator.htmlparser#htmlparser;1.4 ...
  [info] Resolving org.ccil.cowan.tagsoup#tagsoup;1.2.1 ...
  [info] Resolving org.slf4j#slf4j-log4j12;1.6.1 ...
  [info] Resolving log4j#log4j;1.2.16 ...
  [info] Resolving com.novocode#junit-interface;0.8 ...
  [info] Resolving junit#junit;4.8.2 ...
  [info] Resolving org.scala-tools.testing#test-interface;0.5 ...
  [info] Resolving com.google.code.java-allocation-instrumenter#java-allocation-
instrumenter;2.0 ...
  [info] Resolving asm#asm;3.3.1 ...
  [info] Resolving asm#asm-analysis;3.3.1 ...
  [info] Resolving asm#asm-tree;3.3.1 ...
  [info] Resolving asm#asm-commons;3.3.1 ...
  [info] Resolving asm#asm-util;3.3.1 ...
  [info] Resolving asm#asm-xml;3.3.1 ...
  [info] Resolving com.google.guava#guava;r08 ...
  [info] Resolving com.google.code.gson#gson;1.7.2 ...
  [info] Resolving com.google.caliper#caliper;0.5-rc1 ...
  [info] Resolving com.google.code.findbugs#jsr305;1.3.9 ...
  [info] Resolving com.google.guava#guava;11.0.1 ...
[info] Done updating.
[warn] there were 43 deprecation warnings; re-run with -deprecation for details
[warn] there were 156 feature warnings; re-run with -feature for details
[warn] two warnings found
[info] Compiling 3 Scala sources and 4 Java sources to D:\My_Documents\GitHub\sc
alesXml\jaxen\target\scala-2.10\classes...
[warn] there were 4 deprecation warnings; re-run with -deprecation for details
[warn] there were 2 feature warnings; re-run with -feature for details
[warn] two warnings found
[warn] 注:一部の入力ファイルは推奨されない API を使用またはオーバーライドしてい
ます。
[warn] 注:詳細については、-Xlint:deprecation オプションを指定して再コンパイルし
てください。
[warn] 注:D:\My_Documents\GitHub\scalesXml\jaxen\src\main\java\scales\xml\jaxen\
DefaultLocationPath.java の操作は、未チェックまたは安全ではありません。
[warn] 注:詳細については、-Xlint:unchecked オプションを指定して再コンパイルして
ください。
[success] Total time: 210 s, completed 2013/09/15 16:23:20
> package
[info] Packaging D:\My_Documents\GitHub\scalesXml\target\scala-2.10\scales-xml-r
oot_2.10-0.4.4.jar ...
[info] Packaging D:\My_Documents\GitHub\scalesXml\saxon-tests\target\scala-2.10\
saxon-tests_2.10-0.4.4.jar ...
[info] Done packaging.
[info] Done packaging.
[info] Packaging D:\My_Documents\GitHub\scalesXml\core-tests\target\scala-2.10\s
cales-xml-tests_2.10-0.4.4.jar ...
[info] Done packaging.
[info] Packaging D:\My_Documents\GitHub\scalesXml\jaxen\target\scala-2.10\scales
-jaxen_2.10-0.4.4.jar ...
[info] Packaging D:\My_Documents\GitHub\scalesXml\jaxen-tests\target\scala-2.10\
jaxen-tests_2.10-0.4.4.jar ...
[info] Done packaging.
[info] Done packaging.
[info] Packaging D:\My_Documents\GitHub\scalesXml\core\target\scala-2.10\scales-
xml_2.10-0.4.4.jar ...
[info] Done packaging.
[success] Total time: 5 s, completed 2013/09/15 16:25:35

聞きたいこと

Scalaやsbtの初心者のため、

  1. ログのどこを見て問題点を判断すべきないのか?
  2. どのようにしたらライブラリ参照のエラーをなくせるのか?

がわかりません.解決方法がありましたら教えてください.

実行環境

  • Scala 2.10.0.400
  • sbt 0.13.0.1
  • Eclipse Juno SR2
  • Scala IDE for Eclipse 3.0.1v-2_10-201307101641-...
  • Windows 7 Home Premium 64bit

以上 よろしくお願いします.

  • 元々なにを参考にこのサンプルを作成されたんでしょうか? -
  • ちなみにWin7 32bitですが同様のエラーは確認できました。 -
  • わざわざ確認いただきありがとうございます.ということは私だけの問題ではなく再現性があるということですね.
    > 元々なにを参考にこのサンプルを作成されたんでしょうか?
    jaxen-testsの下のソースコードから、たぶんこうやれば動いてくるだろうと考えて書いたものです.ですので正しいか否かは保障はありません.
    -
  • 了解しました。私の方もとりあえずzip版DLしてCompile打っただけでHow to useにある文は読まずにやっていました。sbtでのビルドに向けての記述だとか、問題のjaxenの1.1.4はMavenに登録されてないとか書いてありますので、そのあたりのオプションが必要なんじゃないですかね(まだチラ見しかしてませんが) -
  • How To Useに jaxenは1.1.3までしか登録されておらずXPathの評価をしたいならリゾルバにgoogleコードのアドレスを追加して最新版を使えと書いてありますので、原因はそれじゃないかと思います。 -
  • ありがとうございます.ご指摘のとおりです.How To Useを見逃していました.Jaxenのサイトをみると最新バージョンは1.1.6に進んでいるようです.こちらの方から調べてみます. -

回答

自己RESです.

プロジェクトルートのREADME.mdにある

Also note that Jaxen 1.1.4 isn't yet present via Maven, so if you use String XPath
evaluation and you'd like to use the latest version you must add the folowing to the
build:
resolvers += "Scales Repo" at "http://scala-scales.googlecode.com/svn/repo"

から推定してjaxen\build.sbtを次のように変えました.

import scales.sbtplugins.Utils._

resolvers += "Scales Repo" at "http://scala-scales.googlecode.com/svn/repo"

libraryDependencies ++= Seq(
  // from our repo
  //"jaxen" % "jaxen" % "1.1.3" intransitive()
  "jaxen" % "jaxen" % "1.1.4" intransitive()
)

sbtでcleanしてcompile⇒packageして正常終了しましたが、Eclipseでの

error while loading ScalesBaseJaxenXPath, class file
'D:\My_Documents\GitHub\scalesXml\jaxen\target\scala-2.10\scales-jaxen_2.10-
0.4.4.jar(scales/xml/jaxen/ScalesBaseJaxenXPath.class)' is broken (class
java.lang.NullPointerException/null)

のエラーは依然消えません.

そこで、http://scala-scales.googlecode.com/svn/repo/jaxen/jaxen/1.1.4/ からjaxen-1.1.4.jarを落として、ビルドパスに加えたらこのエラーはすぐに消えました.

単にクラスファイルからjaxenライブラリの.jarの参照ができないことが原因だったようです.

最終的にscalazのライブラリをビルドで参照していたバージョンに差し替え、なんとかXMLを参照するところまで行きました.

以下のようなプログラムで

package xmltest
import scales.utils._
import ScalesUtils._
import scales.xml._
import ScalesXml._
import java.io._
import scalaz._
import Scalaz._
import scales.xml.jaxen._

object main {
 def main(args: Array[String]): Unit = {
    val doc =  loadXml(new java.io.FileReader("MusicLibrary.xml"),defaultPathOptimisation)
    val root = top(doc)
    val xpath = ScalesXPath("//cd[string(year) = '1994']/title/text()")
    val titles = xpath.evaluate(root)
    titles.foreach(title => println("The title='" + title.toString() + "'"))
  }
}

次のXML(抜粋)に対して

  <cd id="4">
    <title>The Dark Side of the Moon</title>
    <year>1994</year>
    <artist>Pink Floyd</artist>
    <genre>Rock</genre>
  </cd>

以下の結果を出力します.

The title='Right(Path(scales.xml.Elem$QNameOnlyElem@75c566cd,0,Text(The Dark Side of the Moon)))'

とりあえずXPathが動くところまで行きました.お騒がせしました.

以上

編集 履歴 (1)
ウォッチ

この質問への回答やコメントをメールでお知らせします。