Eclipse ajoute des annotations @Override lorsque j'implémente des méthodes d'une interface. Eclipse ne semble avoir aucun problème avec cela. Et notre processus de construction automatisé de Cruise Control ne semble pas avoir de problème avec cela. Mais lorsque je crée à partir de la ligne de commande, avec ant exécutant javac, j'obtiens cette erreur:
[javac] C:\path\project\src\com\us\MyClass.Java:70: method does not override a method from its superclass
[javac] @Override
[javac] ^
[javac] 1 error
Eclipse fonctionne sous Java 1.6. Cruise Control est en cours d'exécution Java 1.5. Ma génération de fourmis échoue quelle que soit la version de Java = J'utilise.
Le @Override
la spécification d'annotation a changé en Java 1.6. Dans Java 1.5, le compilateur n'a pas autorisé le @Override
annotation sur les méthodes d'interface implémentées, mais en 1.6 c'est le cas. Le premier résultat de recherche que j'ai trouvé est un article de blog ici. . Cela n'était pas bien documenté , mais cela a changé.
Eclipse l'ajoute car votre Eclipse est définie pour la conformité 1.6. Vous devez essayer de conserver vos environnements de génération et Eclipse sur la même version de Java. Il n'est pas clair pour moi que vous spécifiez que le régulateur de vitesse fonctionne Java 5 pour savoir s'il compile ou non à l'aide d'un JDK6 distinct.
Séparé de ce qui précède 1,5 vs 1,6 @Override
règles d'annotation, souvenez-vous qu'Eclipse a sa propre implémentation du compilateur (pas javac
) et aura parfois un comportement différent. Chaque fois que quelque chose se compile dans Eclipse, mais pas Ant ou Maven, vous devrez trouver un moyen de rendre les deux compilateurs heureux.
Je ne peux pas vraiment expliquer le problème que vous voyez, mais il semble être lié au fait que JDK 5 ne permettra pas @Override
sur les méthodes implémentées d'une interface, uniquement sur les méthodes surchargées présentes dans une super classe.
JDK 6 permettra @Override
sur l'un d'eux.
Si votre génération de fourmis échoue, il se peut qu'il passe un paramètre source
à javac, demandant la conformité JDK 5.
La réponse directe à la question "Pourquoi" une erreur est soulevée par javac lorsque @Override est utilisé dans le contexte d'une implémentation de méthode se trouve en fait dans les spécifications Java:
"La raison en est qu'une classe concrète qui implémente une interface va forcément remplacer toutes les méthodes de l'interface indépendamment de l'annotation @Override, et il serait donc déroutant d'avoir la sémantique de cette annotation interagir avec les règles d'implémentation des interfaces. "
Voir http://Java.Sun.com/docs/books/jls/third_edition/html/interfaces.html#9.6.1.4
Mais apparemment, quelqu'un a changé d'avis pour Java 1.6 et 1.5 u21 ...
Beaucoup de gens, y compris moi, ont été cassés par cela. Voir ici pour une plus grande SO
Assurez-vous qu'il n'y a qu'une seule définition de cette interface.
Exemple: HttpServletRequest
Il s'agit d'une interface avec des spécifications différentes selon le fournisseur.
Comparez pax-web-jetty et Apache-felix-jetty. Ils ont différentes méthodes.
Eclipse pointerait vers la version 1.6 de Java plutôt que 1.5. voir ici pour configurer Java version dans Eclipse).
J'ai eu le même problème lors de la construction d'un projet avec ANT. La solution au problème était de modifier la propriété suivante dans le fichier build.properties:
javac.compiler=org.Eclipse.jdt.core.JDTCompilerAdapter
à:
javac.compiler=modern
Cela a résolu le problème et le projet a été compilé et déployé avec succès.