【问题标题】:How to create a resource with spaces in file name from Annotation Processor如何从注释处理器创建文件名中带有空格的资源
【发布时间】: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 中,我认为自动生成时也应该可以这样做。

有没有办法转义空格,或者在编译时执行其他操作来生成此类文件?

【问题讨论】:

  • documentationFiler 表示,“有效的相对名称必须符合 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


【解决方案1】:

作为一种蛮力方法,重命名生成的文件可以解决问题:

String nameWithoutSpaces = desiredFilename.replace(" ", "-");
FileObject resource = processingEnv.getFiler()
                .createResource(StandardLocation.CLASS_OUTPUT, "configs.generated", nameWithoutSpaces, element);

Path generatedResourcePath = Paths.get(resource.toUri());
Path desiredPath = generatedResourcePath.getParent().resolve(desiredFilename);
Files.move(generatedResourcePath, desiredPath, StandardCopyOption.REPLACE_EXISTING);

仍在寻找更传统的方法。 参考解释为什么资源不能有空间工作的错误/票证或规范说明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 2018-06-01
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    相关资源
    最近更新 更多