Подтвердить что ты не робот

Ресурс из src/main/ресурсов не найден после сборки с maven

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

FileReader читает файлы из файловой системы.

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

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

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

Ответ 3

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

...this.getClass().getResourceAsStream("/config.txt");

Ответ 4

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

Ответ 5

Вы можете заменить src/main/resources/ напрямую на classpath:

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

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

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

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

Ответ 6

После того, как мы соберем jar файл, он будет иметь файлы ресурсов в папке BOOT-INF/classes или target/classes, которая находится в classpath, используйте метод ниже и передайте файл в src/main/resources как вызов метода getAbsolutePath ("certs/uat_staging_private.ppk "), даже мы можем поместить этот метод в класс Utility, и будет вызван вызывающий экземпляр Thread, чтобы загрузить ClassLoader для получения ресурса из пути к классам.

 public String getAbsolutePath(String fileName) throws IOException {
      return Thread.currentThread().getContextClassLoader().getResource(fileName).getFile();
  }

enter image description here enter image description here

мы можем добавить тег ниже к тегу в pom.xml, чтобы включить эти файлы ресурсов для создания папки target/classes

<resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.ppk</include>
            </includes>
        </resource>
</resources>