Spring Boot“无法解析占位符”

时间:2019-02-01 18:15:32

标签: spring spring-boot

我正在使用Maven处理Spring Boot Tomcat应用程序。当我在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,但运气不好。

我的确在我的application.properties中定义了属性sysm.client.api.path,但是为了很好地实现,我也将它作为-D参数添加到命令行-Dsysm.client.api.path = my-路径。

值注入本身是在某些依赖项代码中进行的,否则我将仅对该值进行硬编码。

一个注意事项:IntelliJ没有将其作为-jar运行;而是在一个巨大的-classpath命令行参数中声明所有库,然后将我的@SpringBootApplication类用作可执行类,完全不符合Spring Boot的精神!

我想知道为什么该模块似乎在加载application.properties之前就已经获得其属性,以及是否有任何方法可以对其进行重新排序以使其起作用

更新:我仔细检查了jar并在BOOT-INF / classes / application.properties下找到了应用程序属性。但是由于某种原因,应用程序在jar中看不到它。当我将它们复制到启动目录时,它可以正常工作。不确定为什么没有按预期从罐子中捡起这些东西吗?

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

1 个答案:

答案 0 :(得分:0)

找到了答案。我们有一个自定义部署程序,可以为通用Java应用程序部署所有jar。当然,对于SpringBoot应用程序来说这不是必需的,因为所有的jar都是内部的(除了主jar和-bootstrapper.jar之外),但我希望它不会损害应用程序的执行。

但是,当我删除所有多余的jar时,应用程序突然开始识别嵌入式application.properties。

我很想结束这个问题,但也许与情况相同的人有关?另外,我想了解为什么会发生这种现象? (这仅在某些应用程序中发生。其他应用程序在多余的jar上可以正常工作)