Ant下的@Grab注释失败

时间:2012-06-02 01:03:09

标签: ant groovy ivy

我正在使用@Grab注释来获取我可以提供给XMLSlurper的Html解析器的定义(我认为它是tagsoup解析器),当我从cmd行运行脚本时,一切都很好。如果我从Ant调用相同的脚本,我会得到一个Ivy NoClassDefFound错误。我认为这可能与在Antlib中使用Ivy有关。有没有另一种解析Html而无需通过@Grab自定义slurper的方法?

这:

@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 repo下载的Groovy-1.8.6 jar的路径引用,我得到NoClassDefFound错误。我想这可能是因为在Antlib中安装了Ivy导致类加载器在两个地方找到它。我在撰写这篇文章时想到了一些东西。我可能在分叉模式下运行java或做一些事情导致它看不到/共享Ant的类路径。自从我摔跤w / Ant和类加载器问题以来已经有几年了。由于这个bug我的项目有点拖欠,我正在寻找一个快速/简单的解决方案。

我刚尝试通过“java”cmd在cmd行上运行我的groovy并在类路径中加载groovy-all jar,我意识到我也得到了NoClassDefFound错误。它与Antlib下与Ivy的碰撞无关。相反,我完全错过了常春藤。我原以为它包含在Groovy-all.jar中。我只需要一种聪明的方法将Ivy从AntLib传递到我的java任务中,以便全面启动并运行。

1 个答案:

答案 0 :(得分:1)

听起来你错过了类路径中的一个或多个罐子。我建议在classpathref周围挖掘你标记为“groovylib”。

使用groovy ANT task从ANT内启动groovy的一种不易出错的方法。

以下是与您的用例类似的示例:

Parse HTML using with an Ant Script

我的示例直接使用ivy来管理所有构建依赖项。 Grab注释仍然受支持,但显然这些只会管理groovy脚本的依赖关系。