2012-07-31 24 views
5

Tôi cần phải có cài đặt phát triển và sản xuất cho dự án mùa xuân của mình. Tôi hiểu rằng bạn có thể sử dụng hồ sơ cho mùa xuân nhưng đó không phải là điều mà chúng tôi có thể làm.Tải xuống ứng dụng Spring.properties dựa trên định nghĩa ngữ cảnh servlet tomcat

Điều tôi muốn làm là đặt trên môi trường phát triển tệp tin test-application.properties và trong quá trình sản xuất tệp prod-application.properties. Trong định nghĩa ngữ cảnh tomcat, chúng tôi đã gửi như sau:

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

Và chúng tôi có thể thay đổi giá trị cho máy chủ sản xuất. Trong cấu hình mùa xuân chúng tôi có một cái gì đó như thế này:

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

Nhưng chúng tôi tiếp tục nhận được lỗi như:

org.springframework.beans.factory.BeanInitializationException: thể không tải tài sản; lồng nhau ngoại lệ là java.io.FileNotFoundException: Không thể mở ServletContext nguồn [/ $ {properties_location}]

Bất kỳ ý tưởng về làm thế nào để giải quyết?

Trả lời

8

Một tính năng của PropertyPlaceholder là bạn có thể xác định nhiều vị trí tài nguyên. Vì vậy, ví dụ bạn có thể xác định your-production-config.properties cùng với file: C:/Users/$ {} 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> 

phục vụ sản xuất bạn cần để đặt prod cấu hình vào classpath một nơi nào đó (thực sự không quan trọng nơi chính xác, chỉ classpath) - cho env địa phương bạn có thể sử dụng convension như tập tin này: C:/Users/$ {user.name} /test-application.properties

+0

Tôi đã làm điều tương tự nhưng quên ignoreResourceNotFound. Bây giờ làm việc. Cảm ơn câu trả lời! – checklist

+0

Ngoài ra, vì bạn chỉ ra SYSTEM_PROPERTIES_MODE_OVERRIDE, bất kỳ thuộc tính nào được chỉ định bằng -D trên cuộc gọi java sẽ ghi đè lên những gì được tìm thấy trong tệp thuộc tính, vì vậy 'java -Duser.name = ted ...' sẽ được ưu tiên. Với ignoreResourceNotFound, các tệp thuộc tính cũng có thể được tùy chọn vắng mặt mà không cần ném một ngoại lệ. –

0

sử dụng:

<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> 

Remove bên dưới mã từ 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

Toàn bộ điểm của tôi là có vị trí của tệp thuộc tính OUTSIDE tệp chiến tranh để nó không thể được đưa vào định nghĩa bean. Cảm ơn – checklist

1

tôi đã kết thúc giải quyết nó bằng cách không sử dụng bối cảnh params. Thay vào đó, chúng tôi đã xác định

<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> 

Bằng cách này, hãy thử tải cả hai tệp. Trên máy chủ thử nghiệm, chúng tôi không có tệp sản phẩm nên nó không được tải. Trên máy chủ prod, tệp prod-application.properties tồn tại và ghi đè kiểm tra nằm trong đường dẫn lớp. Cồng kềnh nhưng hoạt động!

+0

Mặc dù công trình này, nó sẽ được tốt đẹp nếu mùa xuân đã có một giải pháp tốt hơn. Tôi chắc chắn có rất nhiều người triển khai ứng dụng cho tomcat và muốn để bên ngoài các đạo cụ – checklist

1

Cá nhân, cố gắng tránh xác định vị trí. Tôi nghĩ điều tốt nhất cho bạn là sử dụng JNDI để đạt được điều này.

Trong tomcat/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"/> 

và In catalina.properties tomcat (Nếu sử dụng Oracle XE khác thay đổi nó cho phù hợp):

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

Trong ứng dụng của bạn tập tin tạo thuộc tính trong classpath của bạn có tên là jdbc.tài sản và đưa sau (Nếu sử dụng Oracle XE khác thay đổi nó cho phù hợp)

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

sau đó Trong mùa xuân 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" /> 

tôi làm điều đó như trên. Biến số catalina.home cho phép tệp thuộc tính được lcoated trong thư mục conf nhà của tomcat.

0

nếu bạn đang sử dụng Tcserver và server.xml để cấu hình tài nguyên như cơ sở dữ liệu, hàng đợi vv bạn có thể sử dụng com.springsource.tcserver.properties.SystemProperties

Delcare nghe này trong server.xml như dưới đây

<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"/> 

Bây giờ bạn có thể mở rộng các thuộc tính thành hai tệp passwords.properties và server.properties.

Các vấn đề liên quan