2014-09-05 4 views
0

Редактировать: Я только что узнал, что не IOExcpetion, а бросок FilerException. Поэтому я изменил это в описании и названии.Filer всегда выбрасывает FilerException

Я работаю с обработкой аннотации, чтобы сгенерировать некоторые файлы для моего проекта java. Теперь я всегда получаю FilerException, когда обработка аннотаций пытается сгенерировать мои файлы.

Это то, как я создаю файлы (GenClass и GenAnnotation являются пользовательскими классами, которые абстрагируют сгенерированные классы. Они не были изменены примерно через полгода, поэтому я уверен, что ошибка не где-то там. Я пишу эти файлы также не изменились в прошлом году).

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; 

Это сообщение исключения:

Source file already created: /path/to/the/file/to/create 

я изменить что-то на моих процессорах, однако единственная ошибка происходит для определенного типа файлов (Filters, который мы используем для фильтрации данные), и я ничего не менял на процессоре, который генерирует фильтры. Я добавил новый процессор, который работает с другой аннотацией, и этот файл генерируется правильно.

Кто-нибудь знает, в чем причина этой ошибки?

+0

Вы использовали другое имя файла для использования generateJavaSourceFile? Сообщение об исключении говорит, что «Файл с указанным именем уже создается, и система не может создавать несколько файлов с тем же именем». Я думаю, вы снова используете имя файла. –

+0

Да, имя файла - это полное имя класса, который должен быть написан. – mvieghofer

+0

Что записывается LOGGER.severe()? Как вы получите это сообщение об исключении «Созданный исходный файл:/path/to/the/file/to/create»? Является ли имя файла, созданного при выполнении вашего кода, отличным от имени файла в сообщении об исключении? Если они отличаются друг от друга, что означает имя файла в сообщении об исключении? –

ответ

0

У меня была ошибка в другом процессоре (который не имел ничего общего с процессором, который генерирует фильтры), и это вызвало эту ошибку. Теперь, когда я исправил эту ошибку, это поведение прекратилось. Я не совсем уверен, почему это FilerException произошло все время, однако теперь оно ушло.

Смежные вопросы