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