2011-02-03 33 views
21

tôi muốn triển khai chiến tranh và chiến tranh sẽ tìm nạp một số thuộc tính từ bên ngoài chiến tranh (cho phép nói tệp .war ở đâu, cùng thư mục đó.)tham chiếu cấu hình.properties bên ngoài .war

tại thời điểm này là giải pháp tốt nhất tôi đã tìm thấy:

<context:property-placeholder location="file:${user.home}/configuration.properties" ignore-unresolvable="true"/> 

nhưng giải pháp này buộc tôi phải giữ nó luôn trong thư mục chính. tôi muốn nó được trong thư mục webapps tomcat nơi tôi triển khai của tôi .war. Tôi chỉ tìm kiếm một giải pháp có liên quan đến đường dẫn tuyệt đối. nếu đường dẫn tương đối là hoàn toàn không thể, thì tôi sẽ xem xét một đường dẫn tuyệt đối.

cảm ơn trước.

+0

Bạn viết: "Tôi chỉ tìm kiếm một giải pháp có liên quan đến đường dẫn tuyệt đối" nhưng tôi đoán bạn có nghĩa là đối diện. –

+0

no i did not. nhìn vào con đường u được sử dụng, nó không tuyệt đối. user.home loại biến có thể là bất cứ điều gì. – Ikthiander

+0

Tôi có thể hỏi * tại sao * bạn muốn cấu hình của mình nằm ngoài ngữ cảnh ứng dụng web? Có phải vì bạn muốn chia sẻ cấu hình với các ứng dụng web khác không? Nếu vậy thì có những cách tốt hơn để làm điều này. – Qwerky

Trả lời

16

đây là một giải pháp:

<context:property-placeholder 
    location="file:${catalina.home}/webapps/datasource.properties" 
    ignore-unresolvable="true"/> 

cho tôi biết nếu có bất cứ điều gì tốt hơn, ví dụ nếu tôi có thể thoát khỏi tham khảo nhà catalina và làm cho nó một tổng quát hơn bằng cách nào đó.

+0

Tôi nghĩ rằng đây là cách tốt nhất, nhưng nó borking IDE của tôi lựa chọn intellij http://stackoverflow.com/q/13606328/106261 – NimChimpsky

0

Bạn có thể đặt tệp thuộc tính trong đường dẫn lớp và chỉ cần chỉ định tên tệp thuộc tính. Thông qua mã java, bạn có thể làm điều đó like this

Tôi đoán rằng mùa xuân cũng nên kiểm tra tệp thuộc tính trong đường dẫn lớp. Bạn có thể thử đặt tệp thuộc tính vào đường dẫn lớp và chỉ đề cập đến tên tệp.

+0

cảm ơn bạn đã bình luận của bạn. ý định là không sử dụng các mã như chúng tôi đã sử dụng mùa xuân, và bước tiếp theo nên được tối thiểu. – Ikthiander

3

Một giải pháp mà tôi có thể cung cấp là sử dụng thuộc tính hệ thống để chuyển đường dẫn đến tệp cấu hình.

Có 2 cấp độ tài sản:

  • thuộc tính hệ thống java gửi bằng chuyển -D để JVM và chiết xuất bởi System.getProperty()
  • biến môi trường hệ điều hành mà bạn xác định trên cấp hệ điều hành và có thể truy cập bằng System.getenv()
+0

cảm ơn AlexR nhưng hãy nhìn vào một trong những giải pháp có thể tôi đã viết mà không liên quan đến java. tôi sẽ rất vui khi sử dụng jndi, việc sử dụng mã java sẽ là điều cuối cùng cần làm. – Ikthiander

1

Bước 1: Xác định thuộc tính:

<util:properties id="myProperties" location="file:some/Absolute/path" />

Bước 2: Sử dụng nó trong ứng dụng của bạn. Ví dụ:

(1) public ModelAndView doWhatever(@Value("#{myProperties['some.outside.property']}") String whatever) { ... }

HOẶC (2) Properties props = appContext.getBean("myProperties", Properties.class);

3

Khá một chút muộn để bên này, nhưng tôi figured tôi muốn gửi một câu trả lời vì câu hỏi này đã đưa ra đầu tiên trên Google cho tôi. Tôi không chắc chắn nếu điều này làm việc tại thời điểm đó câu hỏi được hỏi, nhưng đến mùa xuân 3.1, bạn có thể làm điều này để sử dụng một đường dẫn tuyệt đối:

<context:property-placeholder location="file:///etc/myApp/myApp.conf"/> 

Lưu ý rằng có ba phía trước-slashes. Hai cái đầu tiên dành cho giao thức: "file: //".

0

Bạn có thể xác định bất kỳ biến nào dưới dạng tham số ngữ cảnh trong số context.xml của Tomcat và sử dụng nó trong applicationContext.xml được đặt bên trong chiến tranh.

Ví dụ, context.xml:

<Context> 
    <Parameter name="configlocation" value="/etc/application/my.properties" override="false"/> 
</Context> 

applicationContext.xml:

<beans ...> 
    <context:property-placeholder location="file:${configlocation}" ... /> 
</beans> 
Các vấn đề liên quan