![](/img/trans.png)
[英]How to read file from src/main/resources relative in a JUnit test?
[英]How to read file from src/main/resources with annotation processor?
我有一个简单的注释处理器,它需要从与注释类相同的项目中读取配置文件。 示例结构:
- myproject
- src
- main
- java
- my.package.SourceFile
- resources
- config.json
在注释处理器中,我尝试读取文件:
FileObject resource = processingEnv.getFiler().getResource(StandardLocation.SOURCE_PATH, "", "config.json");
但它抛出FileNotFoundException
。 我还尝试了其他路径,例如../resources/config.json
,(这会抛出Invalid relative name: ../resources/config.json
)。 我尝试将配置文件放在src/main/java
(甚至是src/main/java/my/package
)中,我不喜欢,但这仍然会抛出FileNotFoundException
。
如果我能让filer.getResource()
告诉我它在哪里,那已经filer.getResource()
。 为了找出答案,我尝试生成一个文件:
filer.createResource(StandardLocation.SOURCE_OUTPUT, "", "dummy");
在myproject/build/classes/main/dummy
。 不幸的是,我无法在SOURCE_PATH
生成,因此这无助于发现这一点。
我希望来自src/main/resources
在构建期间(在注释处理之前)被复制到target/classes
。 在这种情况下,您可以像这样打开它们:
ProcessingEnvironment pe = ...;
FileObject fileObject = pe.getFiler()
.getResource( StandardLocation.CLASS_OUTPUT, "", "config.json" );
InputStream jsonStream = fileObject.openInputStream();
我已经与 Project Lombok 的一位开发人员一起研究过这个问题。 如果有人知道注释处理,那就是他们;)
我们的结论是,在内部处理请求的JavacFileManager
没有将StandardLocation.SOURCE_PATH
解析为的路径。 我们不确定,但这可能与使用 Gradle 构建有关。
我遇到了同样的问题,正在寻找解决方案一段时间,发现这个很酷的 hack对 Android 有用
在下面你可以从纯 Java/Kotlin 项目中看到我的解决方案
fun ProcessingEnvironment.getResourcesDirectory(): File {
val dummySourceFile = filer.createSourceFile("dummy" + System.currentTimeMillis())
var dummySourceFilePath = dummySourceFile.toUri().toString()
if (dummySourceFilePath.startsWith("file:")) {
if (!dummySourceFilePath.startsWith("file://")) {
dummySourceFilePath = "file://" + dummySourceFilePath.substring("file:".length)
}
} else {
dummySourceFilePath = "file://$dummySourceFilePath"
}
val cleanURI = URI(dummySourceFilePath)
val dummyFile = File(cleanURI)
val projectRoot = dummyFile.parentFile.parentFile.parentFile.parentFile.parentFile
return File(projectRoot.absolutePath + "/resources")
}
以下功能适用于我,由 gradle 触发注释处理器,它不是漂亮的,但有效:
private fun resolveApplicationPropertiesFile(): File {
val projectRoot = Path.of(processingEnv.filer.getResource(StandardLocation.CLASS_OUTPUT, "", "doesntmatter")
.toUri())
.parent
.parent
.parent
.parent
.parent
.parent
val properties = Path.of(projectRoot.toString(), "src", "main", "resources", "application.yml")
return properties.toFile()
}
其中processingEnv
是AbstractProcessor
的成员
如果您的元素是TypeElement
实例,那么您可以使用这些代码来查找源代码
FileObject fileObject = processingEnv.getFiler().getResource( StandardLocation.SOURCE_PATH, element.getEnclosingElement().toString(), element.getSimpleName() + ".java");
element.getEnclosingElement()
是你的类包,例如:com.foolelement.getSimpleName()
是你的类名,例如:Person 然后你可以打印它们: CharSequence content = fileObject.getCharContent(true);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.