Modifier: Je viens de découvrir que pas un IOExcpetion
mais un FilerException
est levé. Par conséquent, j'ai changé cela dans la description et le titre.Filer jette toujours FilerException
Je travaille avec Annotation Processing pour générer des fichiers pour mon projet Java. Maintenant, je reçois toujours un FilerException
lorsque le traitement des annotations essaie de générer mes fichiers.
C'est la façon dont je crée les fichiers (GenClass et GenAnnotation sont des classes personnalisées qui résument les classes générées.Ils n'ont pas été changés en environ une demi-année, donc je suis sûr que l'erreur ne se trouve pas là. J'écris les fichiers aussi n'a pas changé l'année dernière).
public static boolean generateJavaSourceFile(final ProcessingEnvironment processingEnv,
final GenClass element, final String fileName, final Class<?> generatorClass) {
boolean succeed = false;
Writer fw = null;
Filer f = processingEnv.getFiler();
// Mark the class as generated
GenAnnotation generatedAnnotation = getAnnotation(generatorClass);
element.pushImport(generatedAnnotation);
element.addAnnotation(generatedAnnotation);
try {
JavaFileObject jfo = f.createSourceFile(fileName, (Element[]) null);
// create new java source file
fw = jfo.openWriter();
// write the GenClass object into file
fw.write(element.toString());
succeed = true;
} catch (FilerException e) {
LOGGER.severe("Couldn't generate file (" + fileName + ")!");
processingEnv.getMessager().printMessage(Kind.ERROR,
"Could not create source file " + fileName
+ " because it already exists");
throw new RuntimeException(e.getMessage(), e);
} catch (IOException e) {
LOGGER.severe("Couldn't generate file (" + fileName + ")!");
throw new RuntimeException(e.getMessage(), e);
} finally {
if (fw != null) {
try {
fw.close(); // flush and close the stream
} catch (IOException e) {
LOGGER.severe("Couldn't close file [" + fileName + "]!");
}
}
}
LOGGER.fine(fileName + " written");
return succeed;
Tel est le message de l'exception:
Source file already created: /path/to/the/file/to/create
Je ne changer quelque chose sur mes processeurs, mais l'erreur ne se produit pour un certain type de fichiers (Filters
nous utilisons pour filtrer données) et je n'ai rien changé sur le processeur qui génère les filtres. J'ai ajouté un nouveau processeur qui fonctionne avec une annotation différente et ces fichiers sont générés correctement.
Est-ce que quelqu'un sait quelle pourrait être la cause de cette erreur?
Avez-vous utilisé un nom de fichier différent pour utiliser generateJavaSourceFile? Le message d'exception indique que «le fichier du nom spécifié est déjà créé et que le système ne peut pas créer plusieurs fichiers du même nom». Je suppose que vous utilisez à nouveau un nom de fichier. –
Oui, le nom de fichier est le nom complet de la classe à écrire. – mvieghofer
Qu'est-ce qui est enregistré par LOGGER.severe()? Comment obtenez-vous ce message d'exception "Fichier source déjà créé:/chemin/vers/le/fichier/vers/créer"? Le nom du fichier créé par l'exécution de votre code est-il différent du nom du fichier dans le message d'exception? Si elles sont différentes, que signifie un nom de fichier dans le message d'exception? –