Как создать ресурс с пробелами в имени файла из процессора аннотаций - PullRequest
0 голосов
/ 15 апреля 2020

При создании файла ресурсов во время компиляции с использованием 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

Поскольку такой ресурс будет просто отлично упакован в jar, если он присутствует в src/resources, я предполагаю, что то же самое должно быть возможно при автоматическом также генерируется.

Есть ли способ избежать пробелов или сделать что-то еще для генерации таких файлов во время компиляции?

1 Ответ

0 голосов
/ 15 апреля 2020

При использовании метода грубой силы переименование получающегося файла делает свое дело:

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);

Все еще ищем более традиционный подход. Ссылка на ошибку / тикет или спецификацию, объясняющую, почему у ресурса не может быть пробелов.

...