0

@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を渡す賢い方法が必要です。

4

1 に答える 1

1

クラスパスから1つ以上のjarファイルが欠落しているようです。「groovylib」というラベルを付けたclasspathrefを掘り下げることをお勧めします。

groovy ANTタスクを使用してANT内からgroovyを起動する、エラーが発生しにくい方法。

ユースケースに似た例を次に示します。

Antスクリプトを使用してHTMLを解析する

私の例では、ivyを直接使用して、すべてのビルド依存関係を管理しています。Grabアノテーションは引き続きサポートされていますが、明らかにこれらはGroovyスクリプトの依存関係のみを管理します。

于 2012-06-05T17:57:32.217 に答える