我继承了一个最初用NetBeans编写的项目,使用Ant来构建.我是
Eclipse用户,并且使用过Ant但没有完全理解NetBeans使用Ant的特定方式.我知道它使用了build-impl.xml文件(导入到build.xml中),但是对于IDE如何生成/更新该文件感到茫然.
我对几个类做了一些小改动,想要构建一个jar.我尝试从build.xml和build-impl.xml运行Eclipse中的“clean”和“jar”目标但是得到以下错误:
BUILD Failed C:\Devel\Projects\MyProject\nbproject\build-impl.xml:661: The following error occurred while executing this line: C:\Devel\Projects\MyProject\nbproject\build-impl.xml:337: Compile Failed; see the compiler error output for details.
第661行是此目标中的j2seproject3元素:
<target depends="init,deps-jar,-pre-pre-compile,-pre-compile,-copy-persistence-xml,-compile-depend" if="have.sources" name="-do-compile"> <j2seproject3:javac gensrcdir="${build.generated.sources.dir}"/> <copy todir="${build.classes.dir}"> <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/> </copy> </target>
第337行是此目标的javac行:
<target depends="-init-ap-cmdline-properties" name="-init-macrodef-javac-without-processors" unless="ap.supported.internal"> <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3"> <attribute default="${src.dir}" name="srcdir"/> <attribute default="${build.classes.dir}" name="destdir"/> <attribute default="${javac.classpath}" name="classpath"/> <attribute default="${javac.processorpath}" name="processorpath"/> <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/> <attribute default="${includes}" name="includes"/> <attribute default="${excludes}" name="excludes"/> <attribute default="${javac.debug}" name="debug"/> <attribute default="${empty.dir}" name="sourcepath"/> <attribute default="${empty.dir}" name="gensrcdir"/> <element name="customize" optional="true"/> <sequential> <property location="${build.dir}/empty" name="empty.dir"/> <mkdir dir="${empty.dir}"/> <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" executable="${platform.javac}" fork="yes" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}"> <src> <dirset dir="@{gensrcdir}" erroronmissingdir="false"> <include name="*"/> </dirset> </src> <classpath> <path path="@{classpath}"/> </classpath> <compilerarg line="${endorsed.classpath.cmd.line.arg}"/> <compilerarg line="${javac.compilerargs}"/> <customize/> </javac> </sequential> </macrodef> </target>
我不知道这两个目标是什么以及它们为什么会失败.我下载了NetBeans7,希望在那里构建它会成功,但会得到相同的错误.
我可以安全地从构建中删除这些目标吗?我是否需要更新project.properties文件?
任何有助于建立这个的帮助表示赞赏.
解决方法
还有其他错误吗?之后出现了什么信息?是一堆Java编译错误,还是< javac>任务本身没有执行?
< macrodef>正在定义名为< javac>的新宏将执行而不是原始的< javac>. “等一下!”,你说,是不是已经有< javac>任务?
是的,看起来它正在重新定义它.我通常会认为这是一件坏事 – 特别是因为它没有采用< javac>的相同参数.为什么不叫它< netbeansc>或者其他的东西?
@符号有点像属性.它们是您传递给宏的参数.
你有以下几点:
<j2seproject3:javac gensrcdir="${build.generated.sources.dir}"/>
这称为几乎运行ORIGINAL< javac>的宏.任务做编译.我会确保定义下面显示的所有属性.
<javac debug="${javac.debug}" deprecation="${javac.deprecation}" destdir="${build.classes.dir}" encoding="${source.encoding}" excludes="${excludes}" executable="${platform.javac}" fork="yes" includeantruntime="false" includes="${includes}" source="${javac.source}" sourcepath="${empty.dir}" srcdir="${srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}"> <src> <dirset dir="${empty.dir}" erroronmissingdir="false"> <include name="*"/> </dirset> </src> <classpath> <path path="${javac.classpath"/> </classpath> <compilerarg line="${endorsed.classpath.cmd.line.arg}"/> <compilerarg line="${javac.compilerargs}"/> <customize/>