Spring boot 独立jetty中的Spring boot外部配置

Spring boot 独立jetty中的Spring boot外部配置,spring-boot,jetty,Spring Boot,Jetty,我正在构建一个spring启动应用程序。我想在外部配置我的数据库属性,这样任何人都可以从任何机器上运行war文件。如何在外部配置application.properties?我遵循这个文件 所以我在jetty的主目录中创建了一个app.properties文件 spring.datasource.url=jdbc:sqlserver://mymachine:1433;databasename=TESTDB spring.datasource.driver-class-name=com.micro

我正在构建一个spring启动应用程序。我想在外部配置我的数据库属性,这样任何人都可以从任何机器上运行war文件。如何在外部配置application.properties?我遵循这个文件

所以我在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
当我运行上述命令时,我在jetty中得到以下错误

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)
在命令行中,我通过去演示基地并运行命令启动jetty

java -jar ../start.jar --spring.config.location=file:///E:/Tools/jetty-distribution-9.3.12.v20160915/demo-base/webapps/app.properties
bean如下所示,我试图从externalapplication.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文件。我错过了什么

--spring-config-location
不是正确的属性名称。该属性使用点表示法,而不是连字符

尝试:

有关更多信息,请参阅文档中的第24.3节:

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

--spring.config.location=file:///E:/jetty/demo-base/webapps/
如果此目录中有多个文件,如:

application.properties
application-dev.properties 
application-prod.properties
您可以添加

--spring.profiles.active=prod

选择产品属性。

将application.properties文件放在
JETTY\u HOME/resources
文件夹下,然后添加

--模块=资源

行到
start.ini
文件

第二种方法是将resources文件夹添加到classpath,这样该目录下的每个文件都将位于webapp的classpath中


这应该行得通。

在“文件:”协议之后的文件路径中有太多斜杠,也应该使用反斜杠:

--spring.config.location=文件:E:\Tools\jetty-distribution-9.3.12.v20160915\demo base\webapps\app.properties


我看到您使用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}
下一个。运行应用程序前设置环境属性。在*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
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
在windows平台上:

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
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
最后,只需在没有任何参数的情况下运行jar:

java ../start.jar

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

是的,我现在试过了,但它仍然给了我关于driverClassName不能为空的相同错误。我正在从属性文件填充driverClassname属性。您可以更新您的帖子并提供您收到的stacktrace和错误信息吗?我只有一个文件。它被命名为app.properties,而不是application.properties。文件名没有任何区别。我也犯了同样的错误。如果我在我的war中使用相同的文件,它可以正常工作。同样指向目录而不是文件,我得到了同样的错误。你能试试spring.datasource.drivercassname(不带连字符)吗?@Lucky-这没有意义,因为当属性文件在jar中时,相同的属性可以工作,但仍然需要更多信息。例如,您能告诉我们application.properties应该驻留的目录/文件结构吗?@pczeus-我下载了jetty,它位于路径E:\Tools上。你们可以看到我添加的更多关于我尝试启动Jettyar的目录的信息,你们确定要使用斜杠吗?这就是Spring网站上的说法,我不能在jar中包含application.properties,这就是为什么我要尝试外部配置,在任何环境下运行war文件好吧,第一个命题(--Spring.datasource.url=…)怎么样,这对你有帮助吗?您可以用这种方式覆盖所需的属性。不确定发生了什么,但突然之间,您建议的第一个选项不再起作用了,我得到了与我在本问题中报告的相同的错误project/versions/environment中是否有任何更改?你们能展示一下整个启动命令吗?康斯坦丁-我决定使用进近2,不知道为什么进近1突然停止工作。java-jar../start.jar--spring.datasource.url=jdbc:sqlserver://mymachine:1433;databasename=TESTDB--spring.datasource.driver类名=com.microsoft.sqlserver.jdbc.SQLServerDriver--spring.datasource.username=someuser--spring.datasource.password=somepass