2014-09-05 3 views
0

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?

+0

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. –

+0

Oui, le nom de fichier est le nom complet de la classe à écrire. – mvieghofer

+0

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? –

Répondre

0

J'ai eu une erreur dans un autre processeur (qui n'avait rien à voir avec le processeur qui génère les filtres) et qui a causé cette erreur. Maintenant que j'ai corrigé cette erreur, ce comportement s'est également arrêté. Je ne suis pas vraiment sûr pourquoi ce FilerException est arrivé tout le temps, mais il est parti maintenant.