【发布时间】:2020-04-14 22:19:00
【问题描述】:
在编译时使用javax.annotation.processing.Processor 生成资源文件时,无法创建文件名中包含空格的文件。
重现问题的简化代码:
public class SampleAnnotationProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment env) {
for (Element element : env.getElementsAnnotatedWith(SampleAnnotation.class)) {
FileObject resource = processingEnv.getFiler()
.createResource(StandardLocation.CLASS_OUTPUT, "configs.generated", "file name with spaces.xml", element);
// ...
}
return true;
}
}
在jdk1.8.0_212.jdk 上失败:
java.lang.IllegalArgumentException: Invalid relative name: file name with spaces.xml
如果 src/resources 中存在此类资源,则可以将其打包到 jar 中,我认为自动生成时也应该可以这样做。
有没有办法转义空格,或者在编译时执行其他操作来生成此类文件?
【问题讨论】:
-
documentation 的
Filer表示,“有效的相对名称必须符合 RFC 3986 的 'path-rootless' 规则,第 3.3 节”。链接的 RFC 描述了 URI,它不能包含空格,所以我想这就是问题所在。你能用“-”或“_”等其他字符代替空格吗? -
@Slaw 我正在研究这个 RFC,它允许使用 %20 转义空格,但如果我这样做,编译器不会对其进行转义。令人惊讶的是,我的 IDE 能够根据问题构建代码,并生成带有空格的文件。它使用相同的 JDK,但显然以某种方式对编译器进行了检测。所以它可以用 IDE 编译,但不能用命令行/maven。
-
您使用的是什么 IDE?如果是 Eclipse,那么您可能正在使用 Eclipse 的编译器,这就是它起作用的原因。
-
它是 IntelliJ IDEA,它清楚地打印了一个编译注释:
Information:javac 1.8.0_212 was used to compile java sources以及我的文件已成功生成的注释。
标签: java annotations annotation-processing