2016-12-19 86 views
3

我正在构建一个弹簧启动应用程序。我想在外部配置我的数据库属性,所以任何人都可以从任何机器运行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文件。

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运行war文件,但由于某种原因它未检测到application.properties。

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) 

这是我的码头的目录结构

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

在命令行中,我通过将演示开始码头-base和运行命令

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

豆子看起来像下面那里我试图访问从外部application.properties属性文件

@Bean 
public DataSource dataSource() { 
    final DriverManagerDataSource dataSource = new DriverManagerDataSource();    
    dataSource.setDriverClassName(env.getProperty(ConfigConstants.DATABASE_DRIVER_CLASS_NAME)); 
    dataSource.setUrl(env.getProperty(ConfigConstants.DATABASE_URL)); 
    dataSource.setUsername(env.getProperty(ConfigConstants.DATABASE_USERNAME)); 
    dataSource.setPassword(env.getProperty(ConfigConstants.DATABASE_PASSWORD)); 

    return dataSource; 
} 

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

+0

你可以试试spring.datasource.driverClassName(不带连字符)吗? – Lucky

+0

@Lucky - 这是没有意义的,因为相同的属性工作时,属性文件是在罐子里 – yogsma

+0

仍然需要更多的信息。例如,你可以向我们展示application.properties应该驻留的目录/文件结构吗? – pczeus

回答

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 

最后,刚刚运行罐子没有任何PARAMS:

java ../start.jar 

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

+0

我不能在jar包中包含application.properties,这就是为什么我要在外部配置中可以在任何环境下运行我的war文件 – yogsma

+0

好的,第一个命题(--spring.datasource .url = ...),它可能对你有帮助吗?您可以用这种方式覆盖所需的属性。 –

+0

第一个选项奏效。 – yogsma

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 

要选择督促性能。

+0

是的,我现在试过,但它仍然给我同样的错误关于driverClassName不能为空。我正在从属性文件中填充driverClassname属性 – yogsma

+0

您是否可以更新您的文章并提供您收到的堆栈跟踪和错误? – pczeus

+0

我更新了帖子,错误和一些更多的信息。 – yogsma

3

把你的application.properties文件JETTY_HOME/resources文件夹下,并添加

--module=resources

start.ini文件。

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

这应该工作。

1

你必须在文件路径太多斜线后“文件:”协议和反斜杠也应该被使用:

--spring.config.location =文件:E:\ TOOLS \码头-distribution-9.3.12.v20160915 \ demo-base \ webapps \ app.properties

+0

你确定要斜杠吗?这就是它在Spring网站上的说明 – yogsma