3

我有一个带有 XJC 任务定义的 ant build.xml 文件:

<taskdef name="xjc" classname="com.sun.tools.xjc.XJCTask">
  <classpath>
    <fileset dir="jaxb" includes="*.jar" />
  </classpath>
</taskdef>

jaxb dir cotnains jaxb-xjc.jar 里面有 XJCTask 类。

然后我在某个目标中调用 xjc 任务:

<target name="mytarget">
 <xjc target="src" package="com.p1.Person" header="false">
   <schema dir="src/com/p1" includes="Person.xsd"/>
 </xjc>
</target>

Intellij IDEA 无法识别 xjc 调用的结构/模式,并以红色突出显示所有属性(目标、包、标题)和包含元素(模式)。

如果我选择 Ant 选项并将 jaxb-xjc.jar 添加到其他类路径列表,这将无济于事。我使用捆绑的 Ant 1.8.2

不好的是,当我在 IDEA 中编译它时,会出现很多相关错误,但是当我运行构建脚本时,一切正常。我想抑制这些错误。

有任何想法吗?

4

1 回答 1

3

答案来自 IDEA 问题跟踪器中相关错误中的此评论。 http://youtrack.jetbrains.net/issue/IDEA-11248#comment=27-57354

对于 IDEA 的 XJCTask 问题,只需在 taskdef 中使用 XJC2Task。

如果您查看 XJC2Task 的源代码,它会公开设置器,以便 IDEA 可以解决它们: http ://grepcode.com/file/repo1.maven.org/maven2/com.sun.xml.bind/jaxb-xjc /2.1.13/com/sun/tools/xjc/XJC2Task.java#XJC2Task.setPackage%28java.lang.String%29

但是,XJCTask 只是一个动态委托给 JAXB1 或 JAXB2 的类,因此 IDEA 无法解析这些属性,因为您在 taskdef 中定义的类没有设置器。 http://grepcode.com/file/repo1.maven.org/maven2/com.sun.xml.bind/jaxb-xjc/2.1.13/com/sun/tools/xjc/XJCTask.java#XJCTask.getCoreClassName% 28%29

编辑:基本上在 JAXB2 中,XJCTask 实际上并不包含任务——它委托给实际任务 XJC2Task。

这里有一些更好的源链接:

JAXB 1 中的 XJCTask http://java.net/projects/jaxb/sources/version1/content/trunk/jaxb-ri/xjc/src/com/sun/tools/xjc/XJCTask.java?rev=197

JAXB2 中的 XJCTask http://java.net/projects/jaxb/sources/version2/content/trunk/jaxb-ri/xjc/facade/com/sun/tools/xjc/XJCTask.java?rev=3863

JAXB2 中的 XJC2Task http://java.net/projects/jaxb/sources/version2/content/trunk/jaxb-ri/xjc/src/com/sun/tools/xjc/XJC2Task.java?rev=3863

如果您查看您的 jaxb-xjc-ri-2.x-xx.jar,您会看到它包含一个名为“1/com/sun/tools/xjc/”的包

如果您运行 ant 任务并将版本设置为 1.0,那么这就是从 JAXB2 中的 XJCTask 调用的内容。我希望它能够在当天更轻松地从 v1 过渡到 v2。

如果您使用的是 v2,则调用 XJC2Task。

实际上,您不会将其设置为 1.0,因此您可以直接调用 XJC2Task。

于 2012-01-14T15:50:04.660 回答