Я работаю над приложением Spring Boot Tomcat, используя Maven. Когда я запускаю его в своей среде IDE (IntelliJ IDEA), он работает нормально. Однако, когда я запускаю его нормально
java -jar myjar.jar
я получаю исключение
Caused by: java.lang.IllegalArgumentException:
Could not resolve placeholder 'sysm.client.api.path' in value "${sysm.client.api.path}"
Я также безуспешно пытался использовать JarLoader и PropertiesLauncher.
У меня есть это свойство sysm.client.api.path, определенное в моем application.properties, но на всякий случай я также добавил его в командную строку как параметр -D -Dsysm.client.api.path=my-path.
Сама инъекция значения происходит в каком-то коде зависимостей, иначе я бы просто жестко закодировал это значение.
Одно примечание: IntelliJ не запускает его как -jar; скорее, он объявляет все библиотеки в обширном аргументе командной строки -classpath, а затем использует мой класс @SpringBootApplication в качестве исполняемого класса, что совершенно не соответствует духу Spring Boot!
Мне интересно, почему этот модуль, кажется, получает свои свойства до загрузки application.properties, и есть ли способ переупорядочить это, чтобы он работал
ОБНОВЛЕНИЕ: я дважды проверил банку, и свойства приложения находятся в разделе BOOT-INF/classes/application.properties. Но по какой-то причине приложение не видит этого в банке. Когда я копирую их в каталог запуска, все работает нормально. Не знаете, почему они не берутся из банки, как ожидалось?
<project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>commy-group</groupId>
<artifactId>my-app</artifactId>
<version>2.0.1-SNAPSHOT</version>
<name>${project.artifactId}</name>
<url>http://maven.apache.org</url>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
</parent>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<distribution.root>discovery-service-${project.version}</distribution.root>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<ansible.group>npc</ansible.group>
<ansible.name>${project.artifactId}</ansible.name>
<ansible.deploy>2018-1</ansible.deploy>
</properties>
<scm>
<url>..</url>
<connection>..</connection>
<developerConnection>..</developerConnection>
</scm>
<distributionManagement>
...
</distributionManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.1.5.RELEASE</version>
</dependency>
<!-- ********************* SPRING ********************* -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-ldap</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>create</goal>
</goals>
</execution>
</executions>
<configuration>
<doCheck>false</doCheck>
<doUpdate>false</doUpdate>
<shortRevisionLength>8</shortRevisionLength>
</configuration>
</plugin>
</plugins>
</build>
Я так не думаю. Свойства есть, и я также добавил отсутствующее свойство в командную строку просто для сохранности (и я также скопировал все application.properties в файловую систему вместе с лаунчером). Application.properties есть, просто кажется, что он разрешает этот bean-компонент до загрузки application.properties
Вы используете spring-boot-maven-plugin для создания фатжара? Можете ли вы проверить свою банку, включены ли в нее application.properties?
Итак, вы можете добавить свой pom.xml или build.gradle?
Да, это определенно в банке: -bash-4.1$ jar -tf lib/myjar.jar|grep application.properties BOOT-INF/classes/application.properties
Я только что заметил, что когда я копирую application.properties в корень приложения, он работает правильно. По какой-то причине он не видит этот файл в банке
Вы пробовали mvn clean package spring-boot:repackage?
Я делаю mvn clean deploy на сервере сборки. Я добавил помпу выше
Нашел ответ. У нас есть специальный деплойер, который развертывает все jar-файлы для общего Java-приложения. Конечно, это не обязательно для приложения SpringBoot, поскольку все jar-файлы являются внутренними (за исключением основного jar-файла и -bootstrapper.jar), но я ожидаю, что это не повредит выполнению приложения.
Однако, когда я удалил все лишние банки, приложение внезапно начало распознавать встроенные свойства application.properties.
У меня возникает соблазн закрыть этот вопрос, но, возможно, он может быть актуален для людей, у которых такая же ситуация? Кроме того, я хотел бы понять, почему происходит такое поведение? (Это происходит только с некоторыми приложениями. Другие прекрасно работают с лишними баночками)
в некоторых из этих банок предположительно было sysm.client.api.path = "value"?
Да, наверное, так и есть, большое спасибо. Пожалуйста, дайте ответ, и я отмечу его правильным
похоже, что в /src/main/resources отсутствуют определенные ваши свойства appplication.properties, у которых есть свойство sysm.client.api.path.