2009-09-10 49 views
25

Tôi đang đóng gói trước một ứng dụng web JSP dựa trên một số cài đặt đường dẫn tệp được tìm thấy trong web.xml. Các cài đặt này không xác định tại thời điểm đóng gói, vì chúng tham chiếu đến đường dẫn mà khách hàng sẽ đặt khi triển khai toàn bộ ứng dụng (trong đó ứng dụng web là giao diện quản lý). Có vẻ như cách dễ nhất để tránh mã thông báo và sửa đổi tập tin trong kịch bản cài đặt của tôi là hỏi người dùng về vị trí cài đặt, đặt vị trí này làm biến môi trường (ví dụ: JAVA_HOME) và có web.xml luôn tham chiếu biến đó.Tham chiếu Biến môi trường trong web.xml

Có cách nào để tham chiếu giá trị biến môi trường từ bên trong web.xml không? Các tìm kiếm của Google dẫn đến phương thức J2EE của SETTING các biến môi trường từ các tệp ejb xml. Đây không phải là những gì tôi đang tìm kiếm.

+0

Hãy xem tùy chọn đầu tiên trong câu trả lời được chấp nhận [ở đây] (http://stackoverflow.com/questions/2161054/where-to-place-configuration-properties-files-in-a-jsp-servlet-web -ứng dụng). Bằng cách sử dụng tải tài nguyên từ tệp bên ngoài, chỉ cần có sẵn trên đường dẫn lớp của bạn, tôi nghĩ bạn có thể đạt được những gì bạn muốn. – gamliela

+0

Tôi biết bạn ít nhất có thể tham khảo biến HOME env như sau $ {user.home} -> Không chắc chắn điều này hữu ích nhưng có thể sử dụng nó theo cách sáng tạo. Xem [SSL HOWTO] (http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html) có vấn đề là – nsof

Trả lời

11

tôi nghĩ bạn không muốn sử dụng biến môi trường (mà tôi nghĩ là không thể truy cập từ web.xml), nhưng môi trường mục [1, 2]. như vậy:

<env-entry> 
    <env-entry-name>Bla/SomeFilePath</env-entry-name> 
    <env-entry-type>java.lang.String</env-entry-type> 
    <env-entry-value>/opt/bla</env-entry-value> 
</env-entry> 

bạn có thể sử dụng SomeFilePath như:

InitialContext ic = new InitialContext(); 
String s = (String) ic.lookup("java:comp/env/ejb/Bla/SomeFilePath"); 
+1

, ứng dụng web được tạo mã, mà tôi không muốn gây rối với , ngoại trừ việc thay đổi giá trị của một biến cụ thể trong web.xml. Vì vậy, tôi đang tìm một cách để chỉ đặt giá trị theo cách sẽ tham chiếu biến môi trường được đặt trước. –

+0

như tôi đã nói: tôi nghĩ rằng nó không thể sử dụng biến môi trường trong mô tả triển khai. không có cách nào thay đổi một số mã, tôi sợ. –

8

Về cơ bản, bạn không làm điều đó theo cách đó. Các web.xml nên chứa giá trị mặc định cho mọi thứ, có, nhưng bạn nên ghi đè lên chúng khi thực sự triển khai. Nếu bạn đang triển khai Tomcat, bạn thực hiện việc này bằng cách bao gồm các mục thích hợp trong số context.xml mà bạn sử dụng để triển khai. Ví dụ:

<Context path="/app"> 
    <!-- For things described by webapp parameters --> 
    <Parameter name="foobar" value="grill" /> 

    <!-- For things described by environment entries --> 
    <Environment name="Bla/SomeFilePath" type="java.lang.String" 
      value="/opt/bla" /> 
</Context> 

Các thùng chứa khác sẽ có cơ chế riêng để thực hiện việc này. Bạn sẽ phải tra cứu tài liệu của họ (hoặc yêu cầu giúp đỡ tập trung hơn).

30

Bạn có thể sử dụng biến thay Ant-style trong bất kỳ các tập tin cấu hình tomcat xml, chẳng hạn như:

<servlet-mapping> 
    <servlet-name>mvc-dispatcher</servlet-name> 
    <url-pattern>${foo}</url-pattern> 
</servlet-mapping> 

đâu foo là một Java System Property (sysprop).

Bạn không thể sử dụng OS Environment Variables (envvars) trực tiếp, tôi nghĩ ...

Để sử dụng envvars, bạn có thể đặt

set "CATALINA_OPTS=-DsomeJavaSysProp=%SOME_OS_ENVVAR%" 

trong bin/setenv.bat (hoặc tương tự trong bin/setenv.sh cho * nix). Bạn có thể cần tạo tệp đó. Tomcat sẽ chạy tệp này khi nó bắt đầu.

CATALINA_OPTS là một envvar (trái ngược với tùy chọn dòng lệnh), nó không được hiển thị bởi người dùng khác trên hệ thống (lưu Unix cũ), mặc dù tôi chưa thử nghiệm điều này.

http://tomcat.apache.org/tomcat-7.0-doc/config/

Nếu bạn đang sử dụng Spring, bạn có thể tạo một bean <context:property-placeholder/> và sau đó trực tiếp sử dụng envvars hoặc sysprops trong mùa xuân XML file cấu hình (mặc dù không web.xml).

+0

Tôi đã thử nghiệm với Tomcat 7, nó hoạt động cho tôi. Nhưng nó có di động không? Hay là cụ thể cho Tomcat? – mcoolive

+0

Bạn có thể mở rộng về cách sử dụng trình giữ chỗ thuộc tính để sử dụng envvars trong web.xml không? – Adam

+0

@Adam Tôi không nghĩ rằng bạn có thể sử dụng trình giữ chỗ thuộc tính trong tệp web.xml, chỉ trong tệp cấu hình mùa xuân xml –

1

Tôi không hoàn toàn rõ ràng về giới hạn của bạn, nhưng chỉ có thể bạn có thể làm điều này (tôi giả định rằng nó là một init-param bạn đang cố gắng để cấu hình):

1) Để lại biến không xác định trong web.xml
2) Tạo một ServletContextListener và thêm rằng ứng dụng của bạn
3) Nghe cho việc khởi tạo servlet của bạn
4) Đặt init-param cho servlet tại thời điểm đó

tôi cố gắng này với một vấn đề tương tự, nhưng nó không thành công đối với tôi bởi vì hóa ra là bên thứ ba servlet (mà tôi cũng không muốn gây rối) không thực sự hoạt động như một servlet chút nào, vì vậy ngữ cảnh không bao giờ được khởi tạo. Nhưng có lẽ nó có một cơ hội ở đây ...

1

Bạn phải đặt env-entry theo thứ tự:

<env-entry> 
    <env-entry-name>maxAmount</env-entry-name> 
    <env-entry-type>java.lang.String</env-entry-type> 
    <env-entry-value>aString</env-entry-value> 
</env-entry> 

khác bạn sẽ phải xác nhận lỗi trên web.xml

ref: https://community.oracle.com/thread/840452?tstart=0

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