我们在项目中使用-Xlint:all
和-Werror
。我们有一个基于ANTLR2的解析器,从ANTLR2生成的代码不太好,会引发很多lint警告。因此,我们需要对生成的源禁用lint检查。
问题是,生成的源依赖于我们的源(例如,ANTRL允许使用自定义AST节点(,而我们的源当然依赖于ANTLR源(即,我们使用生成的解析器(。
是否可以从lint检查中排除源代码,但仍然将其编译在一起?
(请参阅稍微相关的Maven 3:如何从Xlint检查中排除生成的源?(
好的,我找到了一个解决方案。
target name="compile" depends="antlr">
<mkdir dir="build/classes"/>
<!-- compile antlr generated sources -->
<!-- compiles also necessary sources from sourcepath -->
<javac srcdir="build/antlr" destdir="build/classes" sourcepath="src" classpath="ext/antlr.jar>
</javac>
<!-- compile sources -->
<!-- already prebuilt antlr classes are present -->
<javac srcdir="src" destdir="build/classes" classpath="ext/antlr.jar">
<compilerarg value="-Xlint:all"/>
<compilerarg value="-Werror"/>
<!-- needed to recompile already compiled sources with lint enabled -->
<compilerarg value="-Xprefer:source"/>
</javac>
</target>
第一个javac
只编译antlr生成的源和antlr产生的代码所依赖的所有必要的源。第二个javac
使用-Xlint:all
和-Werror
编译所有未生成的源,并重用antlr生成代码中的预构建类。注意-Xprefer:source
,它强制javac
重新编译所有未生成的源,即使第一步中已经有相应的.class
文件。