独立码头中的Spring引导外部配置

时间:2016-12-19 18:09:37

标签: spring-boot jetty

我正在构建一个spring boot应用程序。我想在外部配置我的数据库属性,所以任何人都可以从任何机器运行war文件。如何在外部配置application.properties?我正在关注此文档http://docs.spring.io/autorepo/docs/spring-boot/1.0.1.RELEASE/reference/html/boot-features-external-config.html

所以我在jetty的主目录中创建了一个app.properties文件。

  <div class="filterPart">
        <label>Search</label>
        <input id="search" value="<?php echo $search; ?>" placeholder="Keyword" type="text" class="customfilters" />
    </div>
    <div class="filterPart lastLogin">
        <label>Registration</label>
        <input id="custom_registration_date1" readonly="readonly" value="<?php echo $registrationDateFrom; ?>"  data-target-input="registration_date1" name="custom_registration_date1" placeholder="From">
        <input id="custom_registration_date2" readonly="readonly" value="<?php echo $registrationDateTo; ?>"  data-target-input="registration_date2"  name="custom_registration_date2" placeholder="To">
    </div>

尝试通过jetty运行war文件,但由于某种原因它没有检测到application.properties。

spring.datasource.url=jdbc:sqlserver://mymachine:1433;databasename=TESTDB
spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.datasource.username=someuser
spring.datasource.password=somepass

当我在命令上面运行时,我在jetty中出现以下错误

java -jar ../start.jar --spring.config.location=file:///E:/Tools/jetty-distribution-9.3.12.v20160915/demo-base/webapps/app.properties

这是我的码头的目录结构

Caused by:
java.lang.IllegalArgumentException: Property 'driverClassName' must not be empty
        at org.springframework.util.Assert.hasText(Assert.java:168)
        at org.springframework.jdbc.datasource.DriverManagerDataSource.setDriverClassName(DriverManagerDataSource.java:1
24)
        at com.abc.mycompany.sts.config.settings.PersistenceContext.dataSource(PersistenceContext.java:55)
        at com.abc.mycompany.sts.config.settings.PersistenceContext$$EnhancerBySpringCGLIB$$368bb66a.CGLIB$dataSource$2
(<generated>)
        at com.abc.mycompany.sts.config.settings.PersistenceContext$$EnhancerBySpringCGLIB$$368bb66a$$FastClassBySpring
CGLIB$$25ca0903.invoke(<generated>)
        at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
        at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(Configurati
onClassEnhancer.java:356)
        at com.abc.mycompany.sts.config.settings.PersistenceContext$$EnhancerBySpringCGLIB$$368bb66a.dataSource(<genera
ted>)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy
.java:162)
        at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolv
er.java:588)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(Ab
stractAutowireCapableBeanFactory.java:1128)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutow
ireCapableBeanFactory.java:1022)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCap
ableBeanFactory.java:512)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapab
leBeanFactory.java:482)

在命令行上我通过转到demo-base并运行命令

来启动jetty
E:\Tools\jetty-distribution-9.3.12.v20160915\demo-base\webapps

下面的bean看起来像我在尝试从外部application.properties文件访问属性

java -jar ../start.jar --spring.config.location=file:///E:/Tools/jetty-distribution-9.3.12.v20160915/demo-base/webapps/app.properties

这找不到我的app.properties文件。我错过了什么?

4 个答案:

答案 0 :(得分:4)

我看到你使用env属性来初始化数据源,我会为你建议另一个解决方案。

命题一:可以在启动时设置属性值,如:

java -jar ../start.jar --spring.datasource.url=jdbc:sqlserver://mymachine:1433;databasename=TESTDB --spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver --spring.datasource.username=someuser --spring.datasource.password=somepass

或者,如果您需要掩码属性名称,请定义您自己的属性。您必须将application.properties文件打包到jar:

spring.datasource.url=${APP_DB_URL}
spring.datasource.driver-class-name=${APP_DB_DRIVER_CLASS}
spring.datasource.username=${APP_DB_USERNAME}
spring.datasource.password=${APP_DB_PASSWORD}

下一步。在运行应用程序之前设置env属性。在* nix平台上:

export APP_DB_URL=jdbc:sqlserver://mymachine:1433;databasename=TESTDB
export APP_DB_DRIVER_CLASS=com.microsoft.sqlserver.jdbc.SQLServerDriver
export APP_DB_USERNAME=someuser
export APP_DB_PASSWORD=somepass

在Windows平台上:

set APP_DB_URL=jdbc:sqlserver://mymachine:1433;databasename=TESTDB
set APP_DB_DRIVER_CLASS=com.microsoft.sqlserver.jdbc.SQLServerDriver
set APP_DB_USERNAME=someuser
set APP_DB_PASSWORD=somepass

最后,只需运行你的罐子没有任何参数:

java ../start.jar

我希望这篇文章对你有所帮助。

答案 1 :(得分:3)

将您的application.properties文件放在JETTY_HOME/resources文件夹下并添加

--module=resources

行到start.ini文件。

第二个将资源文件夹添加到classpath,因此该目录下的每个文件都将位于webapp的类路径中。

这应该有用。

答案 2 :(得分:2)

--spring-config-location

不是正确的属性名称。该属性使用点符号,而不是连字符。

尝试:

--spring.config.location

有关详细信息,请参阅文档中的第24.3节:http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

此外,您应该指向application.properties所在的目录而不是特定文件。这可能会有所帮助,但是当您以后想要指定配置文件时更有用。然后,Spring Boot可以根据配置文件选择正确的属性文件。例如:

--spring.config.location=file:///E:/jetty/demo-base/webapps/

如果此目录中有多个文件,例如:

application.properties
application-dev.properties 
application-prod.properties

您可以添加

--spring.profiles.active=prod

选择产品属性。<​​/ p>

答案 3 :(得分:1)

&#34; file:&#34;之后,文件的路径中有太多斜杠。也应该使用协议和反斜杠:

  

- spring.config.location =文件:E:\工具\码头 - 分布 - 9.3.12.v20160915 \演示基\ web应用\ app.properties