如何解决在 application.properties 文件中读取 CF 环境变量的问题
我很难将 spring-webmvc 应用程序部署到云代工厂。错误与应用程序有关。CF 环境未解决属性占位符。错误如下
22:14:41.152: [APP/PROC/WEB.0] [CONTAINER] org.apache.jasper.servlet.TldScanner INFO At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
22:14:41.215: [APP/PROC/WEB.0] [CONTAINER] lina.core.ContainerBase.[Catalina].[localhost].[/] INFO No Spring WebApplicationInitializer types detected on classpath
22:14:41.544: [APP/PROC/WEB.0] [CONTAINER] lina.core.ContainerBase.[Catalina].[localhost].[/] INFO Initializing Spring root WebApplicationContext
22:14:41.947: [APP/PROC/WEB.0] [CONTAINER] org.cloudfoundry.reconfiguration.ProfileUtils INFO 'cloud' profile activated
22:14:42.088: [APP/PROC/WEB.0] [CONTAINER] n.CloudPropertySourceApplicationContextInitializer INFO 'cloud' property source added
22:14:42.090: [APP/PROC/WEB.0] [CONTAINER] erviceReconfigurationApplicationContextInitializer INFO Reconfiguration enabled
22:14:42.633: [APP/PROC/WEB.0] 03:14:42.622 [main] ERROR org.springframework.web.context.ContextLoader - Context initialization failed
22:14:42.639: [APP/PROC/WEB.0] at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:831)
22:14:42.633: [APP/PROC/WEB.0] org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'dataSource' defined in ServletContext resource [/WEB-INF/test-servlet.xml]: Could not resolve placeholder 'datasource.url' in string value "${datasource.url}"; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'datasource.url' in string value "${datasource.url}"
22:14:42.633: [APP/PROC/WEB.0] at org.springframework.beans.factory.config.PlaceholderConfigurerSupport.doProcessProperties(PlaceholderConfigurerSupport.java:211) ~[spring-beans-4.0.3.RELEASE.jar:4.0.3.RELEASE]
我正在使用 concourse 将应用程序部署到 CF。下面是我的管道代码:
jobs:
- name: maven-build-and-deploy
serial: true
public: true
plan:
- get: mygit
- task: mvn-package
privileged: true
config:
platform: linux
image_resource:
type: docker-image
source:
repository: test/alpine-jdk8-maven
tag: latest
inputs:
- name: test11
outputs:
- name: maven-package-output
run:
path: sh
args:
- -exc
- |
set -xe
cd test
mvn package
cp target/test.war ../maven-package-output
- put: cf-push
resource: cf-env
params:
path: maven-package-output/test.war
manifest: test/manifest.yml
environment_variables:
datasource.url: ((datasource.url))
datasource.username: ((datasource.username))
datasource.password: ((datasource.password))
以上环境变量在 Cloud Foundry 中配置。 这些环境变量由 application.properties 文件读取,这会导致问题。
我已经在本地 tomcat 中配置了相同的应用程序。创建了一个带有属性的 setenv.sh 文件并复制到 tomcat/bin 文件夹。部署成功后。
部署到 CF 时,导致问题。
下面是我的 pom.xml,只包括依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>${spring.jpa.data.version}</version>
</dependency>
application.properties
database.url = ${datasource.url}
database.username = ${datasource.username}
database.password = ${datasource.password}
test-servlet.xml(上下文加载器)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd">
<context:property-placeholder location="classpath:application.properties" />
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${database.driverClassName}" />
<property name="url" value="${database.url}" />
<property name="username" value="${database.username}" />
<property name="password" value="${database.password}" />
</bean>
application.properties 如何从 CF 环境中读取环境变量。 请帮助解决此问题。
解决方法
在您的管道中,您正在设置这些环境变量:
datasource.url: ((datasource.url))
datasource.username: ((datasource.username))
datasource.password: ((datasource.password))
我看到的一个问题,可能还有其他问题,datasource.url
是将使用的实际环境变量名称,但是,从技术上讲,这不是有效的环境变量名称。不允许使用 .
(也不是 -
)。这些变量最终将不会被设置,因为由于无效字符,shell 会将它们过滤掉。
Allowed characters in Linux environment variable names
Spring Boot 文档中的建议是命名环境变量:
- 全部大写
- 将空格和
.
(点或句点)更改为_
(下划线) - 删除
-
。
所以如果要设置datasource.url
属性,就需要设置DATASOURCE_URL
。类似地,如果您想设置属性 foo.bar-prop
,您需要设置一个环境变量 FOO_BARPROP
。
有关详细信息,请参阅有关宽松绑定的文档:https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config-relaxed-binding
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。