Вопрос по maven, java – Ресурс из src / main / resources не найден после сборки с помощью maven

44

Здравствуйте! Я использую файл конфигурации из src / main / resources в моем java-приложении. Я читаю это в своем классе следующим образом:

<code>new BufferedReader(new FileReader(new File("src/main/resources/config.txt")));
</code>

Так что теперь я строю это с помощью Maven, используяmvn assembly:assembly, Вот кое-что для этого в моем pom.xml:

<code><plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <finalName>TestSuite</finalName>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>com.some.package.Test</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
</code>

Поэтому, когда я запускаю свое приложение, я получаю эту ошибку:

<code>src\main\resources\config.txt (The system cannot find the path specified)
</code>

Но когда я щелкаю правой кнопкой мыши по собранной банке, я вижу ее внутри, кто-нибудь знает, что я делаю неправильно?

Ваш Ответ

5   ответов
1

что плагин сборки помещает файл в путь к классу. Расположение в JAR будет другим, чем на диске. Распакуйте полученный JAR и посмотрите, где находится файл.

Пример с beny32 - правильный подход. Rostislav Matl
11

Возможно, вы намеревались использовать что-то подобное для загрузки файла из пути к классам

// this will look in src/main/resources before building and myjar.jar! after building.
InputStream is = MyClass.class.getClassloader()
                     .getResourceAsStream("config.txt");

Или вы можете извлечь файл из банки перед чтением.

src / main / resources не работает, потому что они будут скопированы в папку target / classes и упакованы в jar. khmarbaise
Я исправил это. Спасибо. Это работает, если у вас есть. в вашем классе, но по неправильным причинам. то есть он читает оригинал, а не копию. Peter Lawrey
@ beny23 Это может быть проще, чем использоватьgetClassLoader() который всегда смотрит на корень / верхний уровень. Peter Lawrey
79

Ресурсы отsrc/main/resources будет помещен в корень пути к классам, поэтому вам нужно получить ресурс как:

new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/config.txt")));

Вы можете проверить, посмотрев файл JAR / WAR, созданный maven, как вы найдетеconfig.txt в корне вашего архива.

Как уже говорилось, Maven вкладывает ресурсы изsrc/main/resources в корень пути к классам, поэтому нетsrc/main/resourcesаталог @ в файле JAR - таким же образом,.class файлы не находятся в каталоге с именемsrc/main/java. Имеет ли это смысл beny23
Если вы находитесь в статическом контексте, тогда вы также можете использовать «Thread.currentThread (). GetContextClassLoader ()» вместо «getClass ()». Benny Neugebauer
Не могли бы вы добавить небольшой текст в свой ответ, объясняющий, что сделал Maven, что вызывает эту разницу? Это было бы большой помощью. Спасибо. theJollySin
5

которые вы поместили в src / main / resources, будут скопированы в процессе сборки в target / классы, к которым можно получить доступ, используя:

...this.getClass().getResourceAsStream("/config.txt");
Вам понадобитьсяgetClass() какthis вряд ли относится к типуClass. beny23
0

src/main/resources/ напрямуюclasspath:

Так что для вашего примера вы замените эту строку:

new BufferedReader(new FileReader(new File("src/main/resources/config.txt")));

По этой строке:

new BufferedReader(new FileReader(new File("classpath:config.txt")));

Похожие вопросы