classLoader.getResource (filename) не возвращает существующий файл (возвращается null) - PullRequest
3 голосов
/ 05 августа 2020

Я пытаюсь загрузить файл .json для тестирования в конвейере Beam.

Код выглядит как

...
public class ExtractCsvMessageTest {
  @Rule public final transient TestPipeline pipeline = TestPipeline.create();

  final String filepath = "com/project/functions/ExtractCsvMessageTest/";
  final String filename = filepath + "comma_delimited.json";
  final ClassLoader classLoader = getClass().getClassLoader();

  final File commaDelimited = new File(classLoader.getResource(filename).getFile());
...

После запуска отладчика я вижу строка, выдающая ошибку:

final File commaDelimited = new File(classLoader.getResource(filename).getFile());

Мой путь выглядит как

test
    ├── java
    │   └── com
    │       └── project
    │           ├── functions
    │           │   ├── ExtractCsvMessageTest.java
    │           └── transforms
    └── resources
        └── com
            └── project
                └── functions
                    └── ExtractCsvMessageTest
                        └── comma_delimited.json

Здесь есть похожие вопросы, но я не могу найти ничего, что помогло бы решить эту проблему.

Кроме того, я использую VSCode, и я просто создал путь из resources вручную.

Наконец, мой .classpath равен

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" output="bin/main" path="src/main/java">
        <attributes>
            <attribute name="gradle_scope" value="main"/>
            <attribute name="gradle_used_by_scope" value="main,test"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="src" output="bin/main" path="src/main/resources">
        <attributes>
            <attribute name="gradle_scope" value="main"/>
            <attribute name="gradle_used_by_scope" value="main,test"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8/"/>
    <classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/>
    <classpathentry kind="output" path="bin/default"/>
    <classpathentry kind="src" path="src/test/java" output="build/classes/test">
        <attributes>
            <attribute name="test" value="true" />
        </attributes>
    </classpathentry>
</classpath>

tl: dr

Почему

final File commaDelimited = new File(classLoader.getResource(filename).getFile());

возвращает null?

1 Ответ

1 голос
/ 06 августа 2020

Это была проблема пути к классам, как и предполагалось.

Я решил ее в VSCode, запустив палитру команд с помощью Cmd + Shift + P и выбрав

Java: Clean the Java language server workspace

Это в свою очередь обновил файл .classpath.

После выхода и повторного запуска VSCode все снова заработало.

...