編輯:我剛剛發現,不是IOExcpetion
,但FilerException
被拋出。因此,我在說明和標題中改變了這一點。Filer總是拋出FilerException
我正在使用Annotation Processing來爲我的java項目生成一些文件。現在,當Annotation Processing嘗試生成我的文件時,我總是得到一個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?異常消息表示「指定名稱的文件已經創建,並且系統不能創建多個同名的文件」。我想你再使用一個文件名。 – 2014-09-05 08:53:24
是的文件名是要寫入的類的標準名稱。 – mvieghofer 2014-09-05 08:54:47
LOGGER.severe()記錄什麼?你如何得到這個異常消息「源文件已創建:/路徑/到/文件/到/創建」?異常消息中執行代碼時創建的文件名是否與文件名不同?如果它們不同,那麼異常消息中的文件名是什麼意思? – 2014-09-05 10:01:42