2012-10-01 40 views
7

Điều tôi đang cố gắng làm là xây dựng tệp JAR thực thi sẽ chứa dự án của tôi. Tôi đã bao gồm phụ thuộc của nó ngay bên cạnh nó, cũng trong JAR file, vì vậy danh sách thư mục của tôi trông giống như sau:Khởi động máy chủ cầu nối nhúng cho tệp JAR

~/Projects/Java/web-app/out:

web-app.jar

dependency1.jar

dependency2.jar

dependency3.jar

tôi biết và chắc chắn rằng vấn đề của tôi không phát sinh từ phụ thuộc, như các chức năng ứng dụng của tôi đúng , ngay lúc tôi bắt đầu Jetty được nhúng vào.

Code tôi sử dụng để bắt đầu Jetty là như thế này:

public class ServerExecutionGoal implements ExecutionGoal {  

    private final static Logger logger = Logger.getLogger(ServerExecutionGoal.class);  

    private WebAppContext getWebAppContext() throws IOException {  
     WebAppContext context = new WebAppContext();  
     System.out.println("context = " + context);  
     context.setResourceBase(new PathMatchingResourcePatternResolver().getResource("classpath:/webapp").getURL().toExternalForm());  
     context.setContextPath("/");  
     context.setLogger(new StdErrLog());  
     return context;  
    }  

    @Override  
    public void execute(Map<String, Object> stringObjectMap) throws ExecutionTargetFailureException {  
     logger.info("Instantiating target server ...");  
     final Server server = new Server(8089);  
     final ContextHandlerCollection handlerCollection = new ContextHandlerCollection();  
     try {  
      handlerCollection.setHandlers(new Handler[]{new RequestLogHandler(), getWebAppContext()});  
     } catch (IOException e) {  
      throw new ExecutionTargetFailureException("Could not create web application context", e);  
     }  
     server.setHandler(handlerCollection);  
     try {  
      logger.info("Starting server on port 8089 ...");  
      server.start();  
      server.join();  
      logger.info("Server started. Waiting for requests.");  
     } catch (Exception e) {  
      throw new ExecutionTargetFailureException("Failed to properly start the web server", e);  
     }  
    }  

    public static void main(String[] args) throws ExecutionTargetFailureException {  
     new ServerExecutionGoal().execute(null);  
    }  

}  

Tôi có thể xác nhận rằng "webapp" thư mục được chuyển một cách chính xác bên trong JAR tôi để /webapp, và đó là khi chạy các mã thông qua IDE của tôi (IntelliJ IDEA 11) context.setResourceBase(new PathMatchingResourcePatternResolver().getResource("classpath:/webapp").getURL().toExternalForm()) bản đồ hợp lệ với tài nguyên được đề cập. Ngoài ra, tôi có thể cho thấy rằng nó giải quyết một cái gì đó như:

jar:file:~/Projects/Java/web-app/out/web-app.jar!/webapp 

và có thể truy cập (tôi đọc nó).

Tuy nhiên, khi tôi bắt đầu phương pháp chính ứng dụng của tôi, và Jetty bắt đầu, trên http://localhost:8089 tôi nhận được như sau:

HTTP ERROR: 503

Problem accessing /. Reason:

Service Unavailable 

Powered by Jetty://

tôi đi đâu vậy?

Tôi biết rằng bằng cách đặt "resourceBase" thành "." địa chỉ "http://localhost:8089" sẽ hoạt động như một giao diện cho vị trí "~/Projects/Java/web-app/out/" nơi tôi có thể xem danh sách tất cả các tệp JAR, bao gồm "web-app.jar", khi nhấp vào đó tôi được cung cấp để tải xuống.

Tôi đã thấy những câu hỏi sau đây, và câu trả lời không áp dụng:

  1. Embedded jetty application not working from jar: Tôi nhận NullPointerException từ Start.class.getProtectionDomain().getCodeSource() quyết tâm null.
  2. Embedded Jetty WebAppContext FilePermission issue: không chỉ không được trả lời, nhưng tình hình rõ ràng không áp dụng, vì tôi không có vấn đề về quyền (thực tế là tôi có thể có danh sách tệp phải chứng minh điều đó).
  3. embedding jetty server problems: cũng chưa được trả lời, cũng không áp dụng được vì tôi không có bất kỳ sự cố phụ thuộc nào (như đã chỉ ra trong các nhận xét ở trên).

Tôi nghĩ rằng bằng cách nào đó tôi nên kích hoạt Jetty để truy cập thư mục /webapp, nằm trong thư mục src/main/resources/ của tôi và được đưa vào ứng dụng web của tôi. Tôi có nên từ bỏ một ứng dụng web đi kèm và triển khai đường dẫn ngữ cảnh đã phát nổ đến một nơi nào đó có thể truy cập bởi Jetty hay không (điều này không hề mong muốn vì nó đặt ra vô số vấn đề cho tôi và khách hàng của tôi).

+0

Bạn có thể sử dụng context.setWar (...) với tệp WAR. Điều này sẽ chỉ thêm một tệp vào bản phân phối của bạn. –

+0

Tôi cũng phải đối mặt với một vấn đề tương tự. Khi máy chủ được bắt đầu từ nhật thực tôi nhận được phản ứng thích hợp cho request.But khi chạy nó từ một tập tin jar từ cmd, tôi nhận được 404. Bất kỳ trợ giúp được đánh giá cao. –

Trả lời

0

Tôi không chắc chắn, nếu WebAppContext của Cầu tàu có thể được sử dụng với PathMatchingResourcePatternResolver!

Trong một trong các dự án của tôi, tôi đã giải quyết vấn đề này bằng cách viết javax.servlet.Filter của riêng tôi, tải các tài nguyên được yêu cầu theo số Class#getResourceAsStream. Class#getResourceAsStream đọc tài nguyên từ bên trong một cái lọ cũng như bên trong đường dẫn tài nguyên (ví dụ: maven).

Hy vọng mẹo này hữu ích cho bạn, hãy cổ vũ Thilo

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