2012-02-21 23 views
7

Tôi đang cố gắng thiết lập một dịch vụ web đơn giản cho ứng dụng của mình bằng cách nhúng Jetty. Tôi muốn có hai dịch vụ web khác nhau, một máy chủ HTTP đơn giản chỉ phục vụ nội dung tĩnh (cuối cùng sẽ là một ứng dụng GWT) và một servlet tùy chỉnh có thể nhổ ra các thông báo trạng thái JSON cho ứng dụng.Làm cách nào để thiết lập tài nguyên tĩnh và dịch vụ tùy chỉnh với Trình kết nối được nhúng?

cấu trúc thư mục phân phối của tôi trông giống như sau:

+ dist/ 
    - MyApp.jar 
    + lib/ 
    + html/ 
    - index.html 

Và đây là những gì tôi có cho đến nay để cấu hình máy chủ nhúng. Tôi nhận được kết quả thử nghiệm của mình một cách chính xác từ servlet tùy chỉnh của tôi khi truy cập http://localhost/data/, nhưng dường như tôi không thể lấy DefaultServlet để tìm tệp index.html của mình.

public Webserver(int port) { 
    server = new Server(port); 

    ServletContextHandler context = new ServletContextHandler(); 
    context.setResourceBase("./html/"); 
    server.setHandler(context); 


    JsonDataApiServlet dataServlet = new JsonDataApiServlet(); 
    DefaultServlet staticServlet = new DefaultServlet(); 

    context.addServlet(new ServletHolder(dataServlet), "/data/*"); 
    context.addServlet(new ServletHolder(staticServlet), "/*"); 
} 

Có vẻ như đây sẽ là một nhiệm vụ phổ biến cho những người nhúng Jetty vào mọi thứ .. tôi có đi đúng hướng không?

Sửa

Hóa ra vấn đề này là do một sự hiểu lầm về cách đường dẫn tương đối được tính toán bên trong Jetty. Tôi đã chạy điều này từ một thư mục phía trên thư mục dist, sử dụng java -jar dist\MyApp.jar và Jetty đang tìm kiếm dist\..\html thay vì chính xác dist\html. Chạy jar từ bên trong thư mục dist sẽ khắc phục vấn đề. Tôi sẽ trả lời với cách tôi làm cho nó hoạt động mà không cần phải chạy từ bên trong thư mục dist.

+1

_Tôi dường như không thể lấy DefaultServlet để tìm tệp index.html của mình Vì vậy, bạn đang nhìn thấy hành vi nào khi bạn truy cập "/index.html". Jetty sản xuất đầu ra nào? – Tim

+0

Cảm ơn Tim, nhận xét đó đưa tôi đi đúng hướng. – Collin

Trả lời

6

Khi chỉnh sửa cho biết, đây chỉ là vấn đề với thư mục tôi đang chạy bình từ đó. Đây là phương pháp tôi đã sử dụng để tìm thư mục html từ bất cứ nơi nào Jar được chạy từ:

Đầu tiên, tôi đã thêm thư mục html vào Đường dẫn lớp kê khai của Jar. Các mã sau đây cung cấp cho các thư mục html cho bất cứ nơi nào Jar được tải từ:

ClassLoader loader = this.getClass().getClassLoader(); 
File indexLoc = new File(loader.getResource("index.html").getFile()); 
String htmlLoc = indexLoc.getParentFile().getAbsolutePath(); 

này sử dụng Classloader để tìm các tập tin chỉ mục trong classpath, sau đó tìm thấy thư mục tuyệt đối để vượt qua để Jetty:

server = new Server(port); 

ServletContextHandler context = new ServletContextHandler(); 
context.setResourceBase(htmlLoc); 
context.setWelcomeFiles(new String[] { "index.html" }); 
server.setHandler(context); 


JsonDataApiServlet dataServlet = new JsonDataApiServlet(); 
DefaultServlet staticServlet = new DefaultServlet(); 

context.addServlet(new ServletHolder(dataServlet), "/data/*"); 
context.addServlet(new ServletHolder(staticServlet), "/*"); 
Các vấn đề liên quan