@Grabアノテーションを使用して、XMLSlurperに指定できるHtmlパーサーの定義を取得しています(これはtagsoupパーサーだと思います)。コマンド行からスクリプトを実行すると、すべて問題ありません。Antから同じスクリプトを呼び出すと、IvyNoClassDefFoundエラーが発生します。AntlibにIvyがあることに関係しているのではないかと思います。@Grabを介してスラーパーをカスタマイズせずにHTMLを解析する別の方法はありますか?
これ:
@Grab(group='org.ccil.cowan.tagsoup', module='tagsoup', version='1.2' )
doc = new XmlSlurper(new org.ccil.cowan.tagsoup.Parser()).parse(confluenceWebPageInputStream)
コマンドラインからは問題なく動作しますが、Antビルドターゲットから実行すると次のようになります。
<target name="update-wiki-chart">
<echo message="Will update chart for version ${version}"/>
<java dir="${basedir}" classname="groovy.lang.GroovyShell">
<arg value="ParseWikiPage.groovy"/>
<classpath refid="groovylib"/>
</java>
</target>
groovyLibは、内部NexusリポジトリからダウンロードされたGroovy-1.8.6 jarを指すパス参照です。ここで、NoClassDefFoundエラーが発生します。これはおそらく、IvyがAntlibにインストールされていて、クラスローダーが2か所でIvyを検出したことが原因だと思います。この記事を書いている間、私はちょうど何かを考えました。おそらく、Javaをフォークモードで実行するか、Antのクラスパスを表示/共有しないようにするために何かを行うことができます。Antとクラスローダーの問題に取り組んでから数年が経ちました。私のプロジェクトはバグのために少し滞納しており、迅速で簡単な修正を探しています。
「java」cmdを介してcmd行でgroovyを実行し、クラスパスにgroovy-all jarをロードしようとしましたが、そこでもNoClassDefFoundエラーが発生することに気付きました。Antlibの下でのIvyとの衝突とは何の関係もありません。むしろ、私はアイビーを完全に失っています。私はそれがGroovy-all.jarに含まれていると思っていました。これをすべて稼働させるには、AntLibからJavaタスクにIvyを渡す賢い方法が必要です。