2010-08-03 2 views
3

EDIT: Я закончил создание всего проекта в Eclipse и смог его построить. Я не знаю, почему эта проблема возникла и, надеюсь, мне никогда не придется это выяснять.Ant build failed без видимых ошибок

У меня возникла проблема, когда моя сборка сообщает «BUILD FAILED», не сообщая никаких ошибок.

Я строю большое применение большого количества старого кода, который у меня теперь есть радость изменения. Большинство других разработчиков установили свои сборки с помощью Eclipse, но я пытаюсь создать его через существующие файлы build.xml.

После того, как мой набор путь к классам, сборка проходит гладко, но вскоре после начала операции компиляции, он возвращает:

Lots of "[javac] file.java" lines. 

BUILD FAILED 
<project path>/build.xml:201: Compile failed; see the compiler error output for details. 

Это меньше, чем полезно. Build.log не имеет никакой дополнительной информации, кроме трассировки стеки:

at org.apache.tools.ant.taskdefs.Javac.compile(Javac.java:1085) 
at org.apache.tools.ant.taskdefs.Javac.execute(Javac.java:885) 
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:585) 
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
at org.apache.tools.ant.Task.perform(Task.java:348) 
at org.apache.tools.ant.Target.execute(Target.java:357) 
at org.apache.tools.ant.Target.performTasks(Target.java:385) 
at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1337) 
at org.apache.tools.ant.Project.executeTarget(Project.java:1306) 
at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) 
at org.apache.tools.ant.Project.executeTargets(Project.java:1189) 
at org.apache.tools.ant.Main.runBuild(Main.java:758) 
at org.apache.tools.ant.Main.startAnt(Main.java:217) 
at org.apache.tools.ant.launch.Launcher.run(Launcher.java:257) 
at org.apache.tools.ant.launch.Launcher.main(Launcher.java:104) 

Добавления -debug флага муравья создает гору информации, и с такими длинным путем к классам (так много банок) это трудно сортировать его.

Вот цель в муравья:

<target name="compile" depends="achmetadata"> 
    <mkdir dir="${path.build.classes}"/> 
    <javac 
     listfiles="yes" 
     destdir="${path.build.classes}" 
     classpathref="project.classpath" 
     debug="on" 
     deprecation="on" 
     fork="yes" 
     nowarn="no" 
     memoryMaximumSize="512M" 
     srcdir="${path.src.java}" 
     source="1.4" 
     target="1.4" 
     > 
    -><src path="${path.build.src}"/> 
     <patternset refid="production-code"/> 
    </javac> 
    </target> 

Путь к папкам устанавливается через этот classpathref и имеет много банок, включенных через и теги.

Любые мысли о том, на что я должен смотреть? Что может заставить муравья терпеть неудачу?

+0

Это больше, чем трассировка стека. Отправьте все это. – duffymo

+0

На самом деле, это все муравьи дает мне. Это выглядит хорошо от меня. У него есть основной метод внизу, а Javac.compile - наверху. – Periodic

+1

Каково значение $ {path.build.src}? Вы можете добавить элемент непосредственно перед элементом , и это будет выгружать значение во время компиляции. Можете ли вы также указать определение шаблона? – mlschechter

ответ

1

CLASSPATH должен быть установлен внутри самого build.xml. Если вы зависете от переменной среды CLASSPATH, вы делаете ошибку.

Посмотрите, работает ли этот файл build.xml лучше. Изучите структуру каталогов и сделать ваше совпадение, что прописано в build.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<project name="xslt-converter" basedir="." default="package"> 

    <property name="version" value="1.6"/> 
    <property name="haltonfailure" value="no"/> 

    <property name="out" value="out"/> 

    <property name="production.src" value="src"/> 
    <property name="production.lib" value="lib"/> 
    <property name="production.resources" value="config"/> 
    <property name="production.classes" value="${out}/production/${ant.project.name}"/> 

    <property name="test.src" value="test"/> 
    <property name="test.lib" value="lib"/> 
    <property name="test.resources" value="config"/> 
    <property name="test.classes" value="${out}/test/${ant.project.name}"/> 

    <property name="exploded" value="out/exploded/${ant.project.name}"/> 
    <property name="exploded.classes" value="${exploded}/WEB-INF/classes"/> 
    <property name="exploded.lib" value="${exploded}/WEB-INF/lib"/> 

    <path id="production.class.path"> 
     <pathelement location="${production.classes}"/> 
     <pathelement location="${production.resources}"/> 
     <fileset dir="${production.lib}"> 
      <include name="**/*.jar"/> 
      <exclude name="**/junit*.jar"/> 
      <exclude name="**/*test*.jar"/> 
     </fileset> 
    </path> 

    <path id="test.class.path">        
     <path refid="production.class.path"/> 
     <pathelement location="${test.classes}"/> 
     <pathelement location="${test.resources}"/> 
     <fileset dir="${test.lib}"> 
      <include name="**/junit*.jar"/> 
      <include name="**/*test*.jar"/> 
     </fileset> 
    </path> 

    <path id="testng.class.path"> 
     <fileset dir="${test.lib}"> 
      <include name="**/testng*.jar"/> 
     </fileset> 
    </path> 

    <available file="${out}" property="outputExists"/> 

    <target name="clean" description="remove all generated artifacts" if="outputExists"> 
     <delete dir="${out}" includeEmptyDirs="true"/> 
     <delete dir="${reports.out}" includeEmptyDirs="true"/> 
    </target> 

    <target name="create" description="create the output directories" unless="outputExists"> 
     <mkdir dir="${production.classes}"/> 
     <mkdir dir="${test.classes}"/> 
     <mkdir dir="${reports.out}"/> 
     <mkdir dir="${junit.out}"/> 
     <mkdir dir="${testng.out}"/> 
     <mkdir dir="${exploded.classes}"/> 
     <mkdir dir="${exploded.lib}"/> 
    </target> 

    <target name="compile" description="compile all .java source files" depends="create"> 
     <!-- Debug output 
       <property name="production.class.path" refid="production.class.path"/> 
       <echo message="${production.class.path}"/> 
     --> 
     <javac srcdir="src" destdir="${out}/production/${ant.project.name}" debug="on" source="${version}"> 
      <classpath refid="production.class.path"/> 
      <include name="**/*.java"/> 
      <exclude name="**/*Test.java"/> 
     </javac> 
     <javac srcdir="${test.src}" destdir="${out}/test/${ant.project.name}" debug="on" source="${version}"> 
      <classpath refid="test.class.path"/> 
      <include name="**/*Test.java"/> 
     </javac> 
    </target> 

</project> 
+0

Я использую путь в файле build.xml, не выписывая CLASSPATH. Я имел в виду, что бег муравей с debug выводит CLASSPATH, который передается в javac, в котором есть около 50 банок (большой проект). Я также добавил цель из моего build.xml. – Periodic

+0

Попробуйте мой build.xml и посмотрите, будет ли он лучше. – duffymo

+0

Я попробовал более простой build.xml. Вырезать все, кроме javac (и было много целей и шагов для полной сборки на этом проекте), но, к сожалению, не повезло. Я закончил настройку всего проекта в Eclipse и, похоже, был успешным. – Periodic

1

Вы можете запустить свой муравей построить в режиме отладки, так что вы можете пройти через него? Установите точку останова в файле build.xml. Затем щелкните правой кнопкой мыши на файле build.xml и выберите Debug As -> Ant Build (при условии, что вы используете Eclipse). Это может помочь вам разобраться в вашей проблеме.

HTH.

+0

В то время я не использовал Eclipse. флаг отладки не очень помог. Я закончил настройку всего проекта в eclipse, и затмение смогло его успешно сгенерировать. – Periodic

+0

в порядке, если вы могли бы создать его с помощью eclipse, тогда вы должны убедиться, что ваши пути в файле build.xml идентичны тем, которые затмение задало в свойствах проекта (файл .classpath проекта). – CoolBeans