Редактировать: Я только что узнал, что не 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
, который мы используем для фильтрации данные), и я ничего не менял на процессоре, который генерирует фильтры. Я добавил новый процессор, который работает с другой аннотацией, и этот файл генерируется правильно.
Кто-нибудь знает, в чем причина этой ошибки?
Вы использовали другое имя файла для использования generateJavaSourceFile? Сообщение об исключении говорит, что «Файл с указанным именем уже создается, и система не может создавать несколько файлов с тем же именем». Я думаю, вы снова используете имя файла. –
Да, имя файла - это полное имя класса, который должен быть написан. – mvieghofer
Что записывается LOGGER.severe()? Как вы получите это сообщение об исключении «Созданный исходный файл:/path/to/the/file/to/create»? Является ли имя файла, созданного при выполнении вашего кода, отличным от имени файла в сообщении об исключении? Если они отличаются друг от друга, что означает имя файла в сообщении об исключении? –