весенний загрузочный файл свойств загрузки из пользовательской папки - PullRequest
0 голосов
/ 10 января 2020

Мне нужно загрузить файл свойств из папки src / main / resources / config. Часть загрузки написана в общем проекте зависимостей, где мы не имеем никакого контроля. Мы просто передаем имя файла, выраженное через зависимость. Фрагмент кода в зависимом банке, как показано ниже, стандартная загрузка ресурсов.

InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(propertyFileName);

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

Как явно указать пользовательскую папку в качестве дополнительной папки classpath?

С помощью maven мы можем сделать что-то вроде ниже, что прекрасно работает. Есть ли какой-нибудь OOTB способ добиться этого с помощью аннотации при весенней загрузке?

    `<resources>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
        <resource>
            <directory>src/main/resources/config</directory>
        </resource>
    </resources>`

Обновлено

    `// This works if config.properties is directly under resource folder
    // What if config.properties is under resources/config folder.
    // Dont say to pass argument as /config/config.properties, there are some other limitations.
    // So in that case with the same approach, config should come under classpath, so that the below
    // method will work always when the property name is passed.
    // As mentioned earlier, we can use maven resource settings to achieve this.
    // The question here is, is there any way to explicitely advise spring to load property from this folder.
    // I have seen something like loader.path config, not sure that helps!
    InputStream stream = SpringBootStarter.class.getResourceAsStream("/config.properties");`

1 Ответ

0 голосов
/ 11 января 2020

Прежде чем ответить, когда вы говорите: Spring will always look for recources under recources folder directly, in this case its unable to load the file as its in the custom folder and its not under classpath., это не правильно.

Spring может выглядеть где угодно в вашей системе. Вот как вы можете загрузить различные файлы свойств при загрузке Spring и Spring:

  • @PropertySource("classpath:config/common.properties") => Будет искать в пути к классам файл, расположенный в папке config, в root из ваш classpath.
  • @PropertySource("file:/config/common.properties") => Будет искать файл common.properties в root вашей файловой системы, здесь в /config/common.properties.

Сейчас возникает вопрос «что такое путь к классам», похоже, что оно заслуживает более подробного объяснения.

Путь к классам предназначен для JVM, какова файловая система для вашей ОС. Когда вы выполняете некоторый код java (например, файл .jar), JVM сохраняет все указанные вами файлы. Вы можете указать файлы при выполнении java -classpath /a/shared/folder,/a/dependency/app.jar,myApp.jar MainClass. (Смотрите это для некоторых других способов: https://javarevisited.blogspot.com/2012/10/5-ways-to-add-multiple-jar-to-classpath-java.html). Довольно часто, что происходит с разработчиками (до того, как мы используем Spring), было следующее:

  1. Мы разрабатываем наше приложение и используем maven для управления зависимостями
  2. Мы выполняем наше приложение с помощью IDE все работает так же хорошо, жизнь прекрасна
  3. Мы готовы go жить (в производстве). Мы генерируем знаменитый myApp.jar и пытаемся запустить приложение java -jar myApp.jar и ... ничего не работает. У вас есть проблемы с java (я полагаю, вы настроили основной класс в Манифесте ...), и вы получаете что-то вроде Caused by: java.lang.ClassNotFoundException: my.dependency.OtherClass ...
  4. Наконец, вы понимаете, что жизнь трудна, и вы не готов go жить прямо сейчас. Вам нужно иметь что-то, что вы можете легко выполнить.

Одним из возможных решений этой проблемы, чтобы избежать проблем с classpath, является помещение всего в JAR-файл (который вызывается при весенней загрузке FAT jar), и вы используйте java -jar myApp.jar, и он работает нормально.

По умолчанию, когда вы генерируете проект maven, автоматически включаются некоторые папки, такие как:

  • src/main/java => your java файлы и пакеты
  • src/main/resources => ваши файлы конфигурации (например, .properties)
  • src/test/java => Ваши java тестовые файлы
  • src/test/resources => ресурсы, удобные для ваших тестов

Когда вы генерируете свой jar-файл (более или менее каждая конфигурация, которую вы добавили в свой проект maven, но, допустим, все в порядке), то, что происходит, если компилятор принимает папки и файлы в src/main/java и src/main/resources и поместите их в root вашей банки. (Не стесняйтесь заглянуть в свои файлы jar. Это всего лишь Zip, вы можете открыть его, просмотреть его и убедиться сами).

Сказав это, когда вы говорите How do we explicitly set the custom folder as additional classpath folder? и вы говорите о пользовательской папке, расположенной в src/main/resources, затем при создании Jar пользовательская папка будет находиться в jar, а следовательно, в вашем пути к классам.

Если у вас по-прежнему возникают проблемы, выполните следующие действия. поможет вам:

  • Разархивируйте ваши файлы jar и проверьте, что внутри. Если вы не видите в ней никакой папки config/, возможно, ваше Jar-поколение неверно
  • Попробуйте использовать @PropertySource(...) для загрузки файла свойств, в вашем classpath и в вашей файловой системе, чтобы увидеть, как он работает и что вы достигнете
  • Обратите внимание на следующее:

    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>

  • Не стесняйтесь переносить все больше и больше вашего старого кода в Spring-boot, будет намного проще для вас.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...