Intellij IDEA无法识别XJC任务属性

时间:2011-12-01 13:45:43

标签: ant jaxb intellij-idea xjc taskdef

我有一个带有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中编译它时,我得到了很多相关的错误,但是当我运行构建脚本时,一切正常。我想抑制这些错误。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

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

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

如果你看一下XJC2Task的来源,它会暴露出setter,以便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中定义的类上没有setter。 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 /”的包

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

如果使用v2,则会调用XJC2Task。

实际上你不会将它设置为1.0,所以你可以直接调用XJC2Task。