0

我正在使用@Grab 注释来获取我可以提供给 XMLSlurper 的 Html 解析器的定义(我认为它是 tagoup 解析器),当我从 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 存储库下载的 Groovy-1.8.6 jar 的路径引用,我收到 NoClassDefFound 错误。我认为这可能是由于在 Antlib 中安装了 Ivy 导致类加载器在两个地方找到它。我只是在写这篇文章的时候想到了一些事情。我可能可以在分叉模式下运行 java 或做一些事情使其看不到/共享 Ant 的类路径。自从我与 Ant 和类加载器问题搏斗已经有几年了。由于该错误,我的项目有点拖欠,我正在寻找快速/简单的修复方法。

我刚刚尝试通过“java”cmd 在 cmd 行上运行我的 groovy,并在类路径中加载 groovy-all jar,我意识到我在那里也收到了 NoClassDefFound 错误。它与 Antlib 下的 Ivy 冲突无关。相反,我完全想念常春藤。我以为它包含在 Groovy-all.jar 中。我只需要一种巧妙的方法将 Ivy 从 AntLib 传递到我的 java 任务中,以使这一切正常运行。

4

1 回答 1

1

听起来您在类路径中缺少一个或多个罐子。我建议挖掘你标记为“groovylib”的类路径引用。

使用groovy ANT 任务从 ANT 内启动 groovy 的不易出错的方法。

这是与您的用例类似的示例:

使用 Ant 脚本解析 HTML

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

于 2012-06-05T17:57:32.217 回答