2012-07-31 17 views
5

पर आधारित वसंत लोडिंग application.properties मुझे अपने वसंत परियोजना के लिए विकास और उत्पादन सेटिंग्स की आवश्यकता है। मैं समझता हूं कि आप वसंत के लिए प्रोफाइल का उपयोग कर सकते हैं लेकिन ऐसा कुछ नहीं है जिसे हम कर सकते हैं।टॉमकैट सर्वलेट संदर्भ परिभाषा

मैं क्या करना चाहता हूं विकास पर्यावरण पर एक test-plication.properties फ़ाइल और उत्पादन पर prod-plication.properties फ़ाइल है। टोमकैट संदर्भ परिभाषा में हमने निम्नलिखित भेज दिए:

<Context> 
    <context-param> 
     <param-name>properties_location</param-name> 
     <param-value>file:C:\Users\Bill\test-application.properties</param-value> 
    </context-param> 
</Context> 

और हमारे पास उत्पादन सर्वर के लिए मूल्य बदल सकता है। वसंत config में हम कुछ इस तरह है:

<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> 
    <property name="locations"> 
     <list> 
      <value>${properties_location}</value> 
     </list> 
    </property> 
    <property name="ignoreUnresolvablePlaceholders" value="false" /> 
</bean> 

लेकिन हम की तरह त्रुटियों मिलती रहती है:

org.springframework.beans.factory.BeanInitializationException: गुण लोड नहीं कर सका; खुला ServletContext संसाधन [/ $ {properties_location}]

पर कोई भी विचार कैसे हल करने के लिए नहीं कर सका: नेस्टेड अपवाद java.io.FileNotFoundException है?

उत्तर

8

PropertyPlaceholder की एक विशेषता यह है कि आप एकाधिक संसाधन स्थानों को परिभाषित कर सकते हैं। इसलिए उदाहरण के लिए आप को परिभाषित कर सकते your-production-config.properties साथ फ़ाइल साथ: C:/उपयोगकर्ताओं/$ {user.name} /test-application.properties

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <list> 
      <value>classpath:your-production-config.properties</value> 
      <value>file:C:/Users/${user.name}/test-application.properties</value> 
     </list> 
    </property> 
    <property name="ignoreUnresolvablePlaceholders" value="true"/> 
    <property name="ignoreResourceNotFound" value="true"/> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>   
</bean> 

उत्पादन की जरूरत के लिए क्लासपैथ में प्रोड कॉन्फ़िगरेशन कहीं भी (वास्तव में महत्वपूर्ण नहीं है, बिल्कुल क्लासपाथ) - स्थानीय एनवी के लिए आप इस फ़ाइल की तरह संयोजक का उपयोग कर सकते हैं: सी:/उपयोगकर्ता/$ {user.name} /test-application.properties

+0

प्रोप को बाहरी बनाना चाहते हैं, मैंने वही किया लेकिन अनदेखा संसाधन नॉटफाउंड भूल गया। अब काम करता है। जवाब के लिए धन्यवाद! – checklist

+0

इसके अलावा, क्योंकि आप SYSTEM_PROPERTIES_MODE_OVERRIDE को इंगित करते हैं, जावा कॉल पर डी-डी के साथ निर्दिष्ट किसी भी गुण गुण फ़ाइल में जो पाया जाता है उसे ओवरराइड कर देगा, इसलिए 'जावा-डूसर.नाम = टेड ...' को प्राथमिकता दी जाएगी। IgnoreResourceNotFound के साथ, गुण फ़ाइलों को अपवाद फेंकने के बिना वैकल्पिक रूप से अनुपस्थित भी हो सकता है। –

0

उपयोग:

<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> 
    <property name="locations"> 
     <list> 
      <value>C:/Users/Bill/test-application.properties</value> 
     </list> 
    </property> 
    <property name="ignoreUnresolvablePlaceholders" value="false" /> 
</bean> 

से web.xml

<Context> 
    <context-param> 
     <param-name>properties_location</param-name> 
     <param-value>file:C:\Users\Bill\test-application.properties</param-value> 
    </context-param> 
</Context> 
+0

मेरा पूरा बिंदु है कि फ़ाइल फ़ाइल के बाहर गुण फ़ाइल का स्थान होना चाहिए ताकि इसे बीन परिभाषा में नहीं रखा जा सके। धन्यवाद – checklist

1

मैं संदर्भ पैरामीटर का उपयोग नहीं करके इसे सुलझाने समाप्त हो गया कोड के नीचे निकालें। इसके बजाए हमने

<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> 
    <property name="locations"> 
     <list> 
      <value>classpath:application.properties</value> 
      <value>file:C:\Users\Bill\prod-application.properties</value> 
     </list> 
    </property> 
    <property name="ignoreUnresolvablePlaceholders" value="true" /> 
    <property name="ignoreResourceNotFound" value="true"/> 
</bean> 

इस तरह से दोनों फ़ाइलों को लोड करने का प्रयास किया है। परीक्षण सर्वर पर हमारे पास प्रोड फ़ाइल नहीं है इसलिए यह लोड नहीं होता है। प्रोड सर्वर पर prod-application.properties फ़ाइल मौजूद है और क्लासपाथ में मौजूद परीक्षण को ओवरराइड करता है। बोझिल लेकिन काम करता है!

+0

हालांकि यह काम करता है, अगर वसंत का बेहतर समाधान होता तो यह अच्छा होता। मुझे यकीन है कि कई लोग टोमकैट पर ऐप्स तैनात कर रहे हैं और – checklist

1

व्यक्तिगत रूप से, निर्दिष्ट स्थानों से बचने का प्रयास करें। मुझे लगता है कि यह हासिल करने के लिए जेएनडीआई का उपयोग करना आपके लिए सबसे अच्छी बात है।

बिल्ला/conf/server.xml में

<Resource name="jdbc/prod" auth="Container" 
      type="javax.sql.DataSource" driverClassName="${database.driverClassName}" 
      url="${database.url}" 
      username="${database.username}" password="${database.password}" 
      maxActive="20" maxIdle="10" 
      maxWait="-1"/> 

और बिल्ला catalina.properties में (Oracle XE अन्यथा यह उसके अनुसार बदल का उपयोग कर):

database.driverClassName=oracle.jdbc.driver.OracleDriver 
database.url=jdbc:oracle:thin:@//localhost:1521/XE 
database.username=user 
database.password=password 

अपने आवेदन में बनाने के गुण में फ़ाइल आपके क्लासपाथ नाम जेडीबीसी।गुण और निम्न (यदि का उपयोग कर Oracle XE अन्यथा यह उसके अनुसार बदल)

jdbc.driverClassName=oracle.jdbc.driver.OracleDriver 
jdbc.url=jdbc:oracle:thin:user/[email protected]//localhost:1521/XE 

तो डाल स्प्रिंग applicationContext.xml में

<context:property-placeholder location="classpath:jdbc.properties" /> 

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="java:comp/env/jdbc/prod" /> 
    <property name="defaultObject" ref="dataSourceFallback" /> 
</bean> 
<bean id="dataSourceFallback" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="${jdbc.driverClassName}" /> 
    <property name="url" value="${jdbc.url}" /> 
    <property name="poolPreparedStatements"> 
     <value>true</value> 
    </property> 
    <property name="maxActive"> 
     <value>4</value> 
    </property> 
    <property name="maxIdle"> 
     <value>1</value> 
    </property> 
</bean> 
2
<context:property-placeholder location="file:${catalina.home}/conf/myFirst.properties" ignore-unresolvable="true" /> 
<context:property-placeholder location="classpath:second.properties" ignore-unresolvable="true" /> 

मैं इसे ऊपर की तरह है। catalina.home वैरिएबल गुण फ़ाइल को tomcat home conf निर्देशिका में lcoated की अनुमति देता है।

0

यदि आप डेटाबेस की तरह संसाधन कॉन्फ़िगर करने के लिए Tcserver और server.xml उपयोग कर रहे हैं, आदि कतार आप com.springsource.tcserver.properties.SystemProperties तरह server.xml में

delcare इस श्रोता का उपयोग कर सकते हैं

नीचे
<Listener className="com.springsource.tcserver.properties.SystemProperties" 
      file.1="${catalina.base}/conf/password.properties" 
      file.2="${catalina.base}/conf/server.properties" 
      immutable="false" 
      trigger="now"/> 

अब आप गुणों को दो फाइलों में password.properties और server.properties को बाहरी कर सकते हैं।

संबंधित मुद्दे