# Ant Compiler Problem



## theforce (10. Dez 2006)

Hi,

ich hab ein sehr nerviges Problem mit meinem Ant-Tool. Ich hab ein recht umfangreiches Projekt programmiert, mit mehreren Packages, JSP, Spring, Hibernate... usw.

Das Problem ist folgendes:
Wenn ich Ant mit dem Befehl "ant all" aufrufen, löscht er mir ja erstmal mein Build-Verzeichnis, kompiliert danach die Klassen neu und deployt die dann wieder ins Verzeichnis.

Allerdings haut er mir beim compilieren immer diverse Exceptions raus, die sich immer auf Methoden beziehen, die es zwar noch gibt, die allerdings mittlerweile andere Übergabeparameter besitzen.

Also z.B. im Interface "blubbDAO" gab es mal die Methode:


```
create(Connection conn, BlubbObj blubb) throws Exception
```

mittlerweile hab ich aber die Methode geändert, also heißt sie jetzt z.B.:


```
create(BlubbObj blubb) throws Exception
```


beim kompilieren wirft er dann plötzlich ne NoSuchMethodException, und sagt mir dass die Klasse, die das DAO-Interface implementiert nicht die Methode "create(Connection conn, BlubbObj blubb)" besitzt.
Is ja klar... warum sollte sie auch, die is ja veraltet, d.h. die gibts nicht mehr!?!?
Aber der Compiler scheint die trotzdem noch zu kennen... woher frag ich mich?!? Gibts da irgendwo ein temporäres Verzeichnis, wo Ant alle seine kompilierten Klassen ablegt oder sowas ähnliches??

Ich hab schon mehrmals gesucht und noch nichts dazu gefunden und es treibt mich echt in den Wahnsinn.
Damit ich die Compiler-Probleme umgehen kann muss ich nämlich jedesmal alle die Klassen, die er mir ausspuckt, durchgehen und irgendwo einfach ein Leerzeichen einfügen, damit er sie neu abspeichert und anscheinend komplett neu kompiliert.

Aber sobald ich dann endlich eine lauffähige Web-Application hab und irgendwelche größeren Änderungen vornehme, und dann natürlcih das "ant all" wieder aufrufen muss, fängt er mit den Fehlermeldungen wieder von vorne an!!

Hab auch schon im Eclipse mehrmals auf "Project -> Build all" geklickt, damit die ganzen Klassen kompiliert werden - hilft aber auch nicht weiter.


Hoffe mir kann irgendjemand helfen!?

Danke und Gruß,
theforce


----------



## Roar (10. Dez 2006)

ne NoSuchMethodException wird garantiert nicht beim kompilieren geworfen, sondern beim ausführen :autsch: ???:L


----------



## Guest (10. Dez 2006)

also das folgende ist eine der Ausgaben. Der Fehler tritt schon beim compilieren auf... da steht ja auch "compiling 11 source files... " und danach erst die Exceptions... ausführen tu ich ja mit Ant noch gar nix, sondern erst wenn ich die entsprechenden Servlets oder JSPs aufm Tomcat aufrufe.



> Buildfile: build.xml
> 
> clean:
> 
> ...


----------



## Roar (10. Dez 2006)

und wo fliegt da jetz ne exception?


----------



## Guest (10. Dez 2006)

ah sorry.. du hast recht.. da fliegt gar keine Exception.. glaub da hatte ich noch etwas anderes im Kopf als ich das geschrieben hab.
Naja.. aber das Problem ist immerhin sichtbar... und auch ohne eine konkrete Exception gibts Fehlermeldungen von Ant. Und zwar genau solche, wie ich bereits beschrieben hab.

Schon bei der ersten Fehlermeldung ist es genau das Problem mit dem Interface... mein Interface hat eine Methode namens "delete(Teacher teacher)".
Ant sagt mir aber, dass die TeacherDAOImpl nicht abstract ist und nicht die abstrakte Methode "delete(Connection conn, Teacher teacher)" überschreibt. Also sehr seltsam.. ich hab bei der delete-Methode halt einfach den ersten Parameter rausgenommen und seitdem möchte er ständig die alte Methode zurück haben?!?
Abstract kann ich's ja schlecht machen, das ist schließlich die Implementierung meines Interfaces.

Gleiches ist im Prinzip auch bei den restlichen Fehlermeldungen das Problem!


----------



## Roar (10. Dez 2006)

das interface wird anscheinend nicht mitkompiliert :?:
erweiter mal den src pfad für den javac task um die interfaces
und lösche vor dem kompilieren alle class files


----------



## Guest (10. Dez 2006)

Ne.. das bringt auch nix.. außerdem hab ich ja ne "src" Verzeichnis in dem alle meine Klassen in verschiedenen Packages liegen... die beiden Klassen liegen z.B. im "dao" Package... also da sind sowohl Interfaces als auch normale Klassen drin. 
In der build.xml hab ich denke ich, auch alles korrekt angegeben:


```
...
  <property name="app.name"      value="commendmyprof"/>
  <property name="app.path"      value="/${app.name}"/>
  <property name="app.version"   value="0.1-dev"/>
  <property name="build.home"    value="${basedir}/build"/>
  <property name="catalina.home" value="${catalina.home}"/> 
  <property name="dist.home"     value="${basedir}/dist"/>
  <property name="docs.home"     value="${basedir}/docs"/>
  <property name="src.home"      value="${basedir}/src"/>
  <property name="web.home"      value="${basedir}/web"/>

  <property name="compile.debug"       value="false"/>
  <property name="compile.deprecation" value="true"/>
  <property name="compile.optimize"    value="true"/>

  ...

  <path id="compile.classpath">

    
    
    <fileset dir="${web.home}/WEB-INF/lib">
      <include name="*.jar"/>
    </fileset>
    
    
    <pathelement location="${catalina.home}/common/classes"/>
    <fileset dir="${catalina.home}/common/endorsed">
      <include name="*.jar"/>
    </fileset>
    <fileset dir="${catalina.home}/common/lib">
      <include name="*.jar"/>
    </fileset>
    <pathelement location="${catalina.home}/shared/classes"/>
    <fileset dir="${catalina.home}/shared/lib">
      <include name="*.jar"/>
    </fileset>

  </path>

  ...

  <target name="compile" depends="prepare"
   description="Compile Java sources">

    
    <mkdir    dir="${build.home}/WEB-INF/classes"/>
    <javac srcdir="${src.home}"
          destdir="${build.home}/WEB-INF/classes"
            debug="${compile.debug}"
   	  deprecation="${compile.deprecation}"
      	 optimize="${compile.optimize}">
        <classpath refid="compile.classpath"/>  
    </javac>

    
    <copy  todir="${build.home}/WEB-INF/classes">
      <fileset dir="${src.home}" excludes="**/*.java"/>
    </copy>

  </target>
```


----------



## KSG9|sebastian (11. Dez 2006)

Hm..ich sehe dass du Bibliotheken vom Tomcat in den Classpath aufnimmst. Kann sein dass du unbewusst oder durch deployen der Anwendung eine ältere Version deiner Anwendung in nem Lib-Ordner rumliegen hasst. Dadurch verwendet Ant ein veraltetes Interface aus ner jar-Datei. Schau mal die Jar-Archive in den eingebundenen Verzeichnissen an oder binde explizit die benötigten Jar-Archive ein anstatt alle zu nehmen.


----------



## Guest (11. Dez 2006)

hab ich probiert... aber mein skript deployt ja nach /projektordner/build/   und nicht ins Tomcat Verzeichnis. Also sehr seltsamer bug.
Ich hatte das ganze schonmal vor ner weile... allerdings hat es sich da nur auf eine einzige methode bezogen... und ich habs dann einfach so gelöst, dass ich die Methode anders benannt habe, danach gings plötzlich wieder ohne Probleme. Allerdings hab ich bei so vielen Problemen jetzt nicht unbedingt lust alle betroffenen Methoden umzubennen.


----------



## KSG9|sebastian (11. Dez 2006)

Project->Clean

Ist der Ant-Outputordner derselbe wie der Eclipse-Outputordner? Falls ja stell das mal um. Und wie gesagt, schau mal was in den eingebundenen Ordnern (common, shared / lib, classes) so alles an Jars liegt.
Irgendwo im Classpath fahren bestimmt ein paar veraltete Jars oder Klassen rum.


----------

