2010-10-08 43 views
16

Tôi chạy webapp trên Cầu tàu. Cấu hình cho ứng dụng đến từ tệp tồn tại trên cùng một máy chủ nơi Jetty đang chạy. Bên trong ứng dụng tôi dựa vào thuộc tính hệ thống để lấy đường dẫn đến tệp để tôi có thể phân tích cú pháp đó. Ví dụ.Cầu tàu - đặt thuộc tính hệ thống

final String loc = System.getProperty(FACTORY); 

Bây giờ tôi có thể bắt đầu cầu tàu với công tắc D để cung cấp $FACTORY trên dòng lệnh nhưng tôi đặt nó vào tệp jetty.xml nếu có thể. Tôi biết có thẻ <SystemProperty /> nhưng dường như chỉ cung cấp giá trị hệ thống đã tồn tại cho thẻ <Set/>. Ai đó có thể cho tôi ví dụ làm thế nào điều này có thể đạt được? (Nếu có thể đạt được)

Trả lời

2

Để định cấu hình ứng dụng web, tốt hơn nên tránh các thuộc tính hệ thống và sử dụng JNDI thay thế.

Gần đây, tôi đã đăng một example về cách thực hiện điều đó với Jetty.

+3

Cảm ơn nhưng tôi vẫn muốn biết nếu nó có thể được thực hiện và làm thế nào. Thành thật mà nói nếu nó được thiết lập từ jetty.xml và không phải trong chính hệ thống, tôi không thấy tại sao nó là xấu – Bostone

+2

Lợi ích là tính di động. Nếu bạn sẽ triển khai ứng dụng web của mình vào một vùng chứa khác thì bạn có thể chắc chắn rằng có một cách để đặt các tham số JNDI. Theo như tôi biết thẻ 'SystemProperty' trong cầu cảng.xml chỉ để đọc thuộc tính hệ thống. Đây là tham chiếu cú ​​pháp Jetty: http://docs.codehaus.org/display/JETTY/Syntax+Reference#SyntaxReference-SystemProperty – vanje

+0

Vị trí duy nhất tôi biết để đặt thuộc tính hệ thống là tệp cấu hình cho dịch vụ Windows Jetty hoặc tập lệnh shell Unix thích hợp. – vanje

3

Tôi sẽ chấp nhận câu trả lời @vanje vì nó khiến tôi suy nghĩ đúng hướng. Đây là những gì tôi đã kết thúc bằng:

  1. Tạo cầu cảng-web.xml ngoài distro WAR của bạn (không có bạn không muốn gói nó với WAR nếu bạn muốn cấu hình ứng dụng từ "bên ngoài")
  2. Nơi jetty-web.xml cùng của jetty.xml
  3. tôi cần chỉ là một tham số duy nhất vì vậy tôi đã kết thúc với những điều sau đây:

cầu cảng-web.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN"  
    "http://jetty.mortbay.org/configure.dtd"> 
<Configure class="org.mortbay.jetty.webapp.WebAppContext"> 
    <New class="org.mortbay.jetty.plus.naming.EnvEntry"> 
     <Arg>myOwnParam</Arg> 
     <Arg type="java.lang.String">//some/path/to/the/file</Arg> 
    </New> 
</Configure> 

Java đoạn mã

InitialContext c = new InitialContext(); 
    EnvEntry env = (EnvEntry) 
     c.lookup("org.mortbay.jetty.plus.naming.EnvEntry/myOwnParam"); 
    final String myString = (String) env.getObjectToBind(); 

Gotcha lớn nhất đối với tôi đây là tôi đã cố gắng để có được myString từ env defaul mà không làm việc cho đến khi tôi nhận ra rằng JNDI đã sử dụng bối cảnh địa phương. Điều này là tốt cho tôi nhưng sẽ phá vỡ tính di động nếu bạn cố gắng di chuyển WAR trên Tomcat nói. Nếu ai đó có thể đăng một ví dụ về cách này có thể được lưu vào ngữ cảnh mặc định sẽ là greatOwnParam

+0

Đây là câu trả lời hoàn hảo. Điều duy nhất tôi muốn thêm là giá trị myOwnParam có thể là bất kỳ thứ gì và không cần thiết phải là đường dẫn đến tệp. (Thoạt nhìn, tôi nghĩ rằng nó phải là một đường dẫn đến một tập tin thuộc tính.) –

20

Để ghi lại, nếu bạn thực sự cần thực hiện điều này thông qua thuộc tính hệ thống (tôi đã làm), bạn có thể làm điều này để nối thêm ví dụ - Drun.mode = dàn đến các thuộc tính hệ thống:

<Call class="java.lang.System" name="setProperties"> 
    <Arg> 
    <New class="java.util.Properties"> 
     <Call name="putAll"> 
     <Arg><Call class="java.lang.System" name="getProperties"/></Arg> 
     </Call> 
     <Call name="setProperty"> 
     <Arg>run.mode</Arg> 
     <Arg>staging</Arg> 
     </Call> 
    </New> 
    </Arg> 
</Call> 

... và có thể bạn có thể có thể lập trình ứng dụng của bạn thông qua này ;-)

+0

Cảm ơn bạn vì điều này. Tôi không muốn thay đổi đối số dòng lệnh, nhưng tôi cần đặt thuộc tính file.encoding thông qua jetty.xml. –

+0

Một hack, nhưng một tốt đẹp, để chắc chắn. –

+15

tôi thêm một chút phiên bản nhỏ gọn hơn: ' run.mode dàn dựng ' –

5

Nếu bạn đang bắt đầu Jetty thông qua API Java của nó đối với một ứng dụng thử nghiệm hoặc 'được nhúng', ví dụ sau đây cho thấy thực sự thiết lập Java Syste Các thuộc tính m trước khi khởi động WebAppContext của bạn.

private void startJetty() { 
    try { 
     long startTime = System.currentTimeMillis(); 

     server = new Server(); 
     setUpSystemProperties(server); 

     Connector connector = new SelectChannelConnector(); 
     connector.setPort(port); 
     server.addConnector(connector); 

     WebAppContext webAppContext = new WebAppContext(); 
     webAppContext.setWar("src/main/webapp"); 
     server.setHandler(webAppContext); 

     server.start(); 
    } 
    catch (Exception e) { 
     throw new RuntimeException("Failed to set-up web server fixture", e); 
    } 
} 

private void setUpSystemProperties(Server jettyServer) { 
    final Properties systemProperties = new Properties(); 
    // set your system properties... 
    systemProperties.setProperty("yourProperty", "yourValue"); 
    jettyServer.addLifeCycleListener(new SystemPropertiesLifeCycleListener(systemProperties)); 
} 

private class SystemPropertiesLifeCycleListener extends AbstractLifeCycleListener { 
    private Properties toSet; 

    public SystemPropertiesLifeCycleListener(Properties toSet) { 
     this.toSet = toSet; 
    } 

    @Override 
    public void lifeCycleStarting(LifeCycle anyLifeCycle) { 
     // add to (don't replace) System.getProperties() 
     System.getProperties().putAll(toSet); 
    } 
} 

Không giống như hầu hết các câu trả lời này, tôi sẽ không cho bạn biết liệu đây có phải là 'thích hợp' so với JNDI hay một số công nghệ khác mà bạn không hỏi.

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