Как использовать Maven для использования файла свойств с существующим приложением Spring Boot?

Я пытаюсь использовать существующее приложение Spring Boot, размещенное в репозитории Maven моей компании. Это приложение принимает сообщения с сервера Kafka и помещает их в базу данных Mongo. Все, что нужно, чтобы заставить его работать, это предоставить ему файл свойств, который определяет серверы Kafka и Mongo. Мне нужно создать проект Maven, который импортирует это приложение как зависимость и предоставляет ему файл свойств для конфигурации. Единственными двумя файлами должны быть pom.xml и application.properties. Конечным результатом должен быть исполняемый JAR-файл, который выполняет зависимость (существующее приложение Spring Boot), используя мой файл свойств.

У меня нет выбора в выборе другого подхода к решению этой проблемы.

Я потратил бесчисленное количество часов, пытаясь настроить Maven для этого. Мне, наконец, удалось заставить это работать при использовании команды mvn spring-boot:run, но я не могу заставить ее создать правильно работающий исполняемый файл JAR.

Я включаю свою зависимость, как и любую другую:

<dependencies>
  <dependency>
    <groupId>com.company.dept</groupId>
    <artifactId>consume-to-mongo-app</artifactId>
    <version>1.0</version>
  </dependency>
</dependencies>

Затем я определяю основной класс из зависимости следующим образом:

<properties>
  <mainClass>org.springframework.boot.loader.JarLauncher</mainClass>
</properties>

И мой раздел плагинов выглядит так:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
          <mainClass>org.springframework.boot.loader.JarLauncher</mainClass>
    </configuration>
    <executions>
      <execution>
        <goals>
          <goal>repackage</goal>
        </goals>
        <configuration>
          <classifier>exec</classifier>
              <mainClass>org.springframework.boot.loader.JarLauncher</mainClass>
        </configuration>
      </execution>
    </executions>
</plugin>

Приложение работает нормально при запуске mvn spring-boot:run

 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ / _` | \ \ \ \
 \/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.4.RELEASE)

После запуска mvn clean package, затем java -jar myjar.jar я получаю тысячи таких:

)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
    at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Caused by: java.lang.reflect.InvocationTargetException
    ... 1024 more

Вам разрешено создавать zip-файл, содержащий свойства и банку? Если он разархивирован и файл свойств находится в том же каталоге, что и Spring Boot Jar, приложение Spring Boot автоматически подберет его.

Compass 19.04.2019 20:15

Я предлагаю вам преобразовать ваш проект в многомодульный проект Maven. У вас будет два модуля (проекта): ваш проект Spring и второй, содержащий ваши файлы свойств. Затем установите зависимость между вашими модулями. Сгенерированный jar должен содержать все ваши файлы (включая файлы свойств).

Harry Coder 19.04.2019 21:43

Эта ссылка может вам помочь: stackoverflow.com/questions/52673216/…

Harry Coder 19.04.2019 23:28

Я не думаю, что проблема в том, что файл свойств не найден. Моя проблема в том, что когда я собираю файл JAR, он выдает сумасшедшее количество исключений отражения (тысячи). Таким образом, проблема должна быть связана с чем-то еще, связанным с весенней загрузкой.

zgillis 22.04.2019 16:15

с Spring-boot 2 похоже изменился baeldung.com/spring-boot-командная строка-аргументы

borjab 18.05.2021 12:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
941
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я смог решить свою проблему с помощью плагина Maven Assembly для создания специально упакованного ZIP-файла, содержащего JAR-файл моих зависимостей и мой файл свойств. На сервере развертывания этот ZIP можно извлечь, а банку можно запустить в полученном каталоге, и она подхватит файл свойств. Я следовал этому руководству: https://medium.com/@kasunpdh/using-the-maven-assembly-plugin-to-build-a-zip-distribution-5cbca2a3b052.

Я внес несколько изменений в руководство, чтобы моя окончательная ZIP-структура непосредственно содержала JAR моей зависимости Spring Boot App и мой файл свойств без каких-либо других каталогов. Это мой модифицированный файл zip.xml:

<assembly xmlns = "http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
  xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation = "http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
  <!--<modelVersion>4.0.0</modelVersion>-->
  <id>zip</id>
  <includeBaseDirectory>true</includeBaseDirectory>

  <formats>
    <format>zip</format>
  </formats>
  <fileSets>
    <fileSet>
      <directory>${project.basedir}/src/main/resources</directory>
      <outputDirectory>.</outputDirectory>
    </fileSet>
  </fileSets>
  <dependencySets>
    <dependencySet>
      <outputDirectory>.</outputDirectory>
      <excludes>
        <exclude>${project.groupId}:${project.artifactId}:jar:*</exclude>
      </excludes>
    </dependencySet>
  </dependencySets>

</assembly>

Другие вопросы по теме