Ресурс из 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)
Но когда я нажимаю правой кнопкой мыши на собранную банку, я вижу ее внутри, кто-нибудь знает, что я делаю неправильно?
Ответы
Ответ 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]()
мы можем добавить тег ниже к тегу в pom.xml, чтобы включить эти файлы ресурсов для создания папки target/classes
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.ppk</include>
</includes>
</resource>
</resources>