2016-12-19 12 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 

warファイルをjettyで実行しようとしていますが、何らかの理由でapplication.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 

ある

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

ベースコマンドと実行コマンド

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

Beanは、私はこれは私のapp.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; 
} 

ファイルの外部application.propertiesからプロパティにアクセスしようとしていますどこ下記のように見えます。私は何が欠けていますか?

+0

spring.datasource.driverClassName(ハイフンなし)を試すことはできますか? – Lucky

+0

@Lucky - プロパティファイルがjar内にあるときに同じプロパティが機能するので意味がありません – yogsma

+0

さらに詳しい情報が必要です。たとえば、application.propertiesが存在するはずのディレクトリ/ファイル構造を表示できますか? – pczeus

答えて

4

私は、envプロパティを使用してデータソースを初期化することをお勧めします。もう1つの解決策を提案します。

命題1:

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 

それとも、マスクプロパティ名をしたい場合は、独自のプロパティを定義します。次のように起動時にプロパティ値を設定することが可能です。

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} 

次へ:あなたはjarファイルに次のapplication.propertiesファイルをパックする必要があります。アプリケーションを実行する前に、envプロパティを設定してください。 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 

そして最後に、ただののparamsせずにあなたのjarファイルを実行します:* nixのプラットフォームで

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ブートは、プロファイル上の正しいプロパティファイルのベースを選択できます。あなたのようなこのディレクトリに複数のファイルを持っていた場合

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

:たとえば

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

あなたはPRODのプロパティを選択するには

--spring.profiles.active=prod 

を追加することができます。

+0

ええ、私はそれを今試みましたが、driverClassNameが空であってはならないという同じエラーが表示されます。プロパティファイル – yogsma

+0

からdriverClassnameプロパティを設定しています投稿を更新し、スタックトレースとエラーを受け取ることはできますか? – pczeus

+0

私はエラーといくつかの詳細で投稿を更新しました。 – yogsma

3

JETTY_HOME/resourcesフォルダの下に、あなたのapplication.propertiesファイルを入れて、start.iniファイルに

--module=resources

行を追加します。

もう1つは、クラスパスにresourcesフォルダを追加するため、そのディレクトリの下にあるすべてのファイルはwebappのクラスパスにあります。

これは動作するはずです。プロトコルおよびバックスラッシュは、あまりにも使用する必要があります。「ファイル」:

1

あなたは後に、ファイルへのパスにあまりにも多くのスラッシュを持って

--spring.config.location =ファイル:E:\ツール\桟橋-distribution-9.3.12.v20160915 \ demo-base \ webapps \ app.properties

+0

あなたはスラッシュについて本当ですか?それがSpringのウェブサイトに記載されている方法です – yogsma

関連する問題