7

내가하려고하는 것은 내 프로젝트가 포함 된 실행 파일 JAR을 빌드하는 것입니다. 나는 바로 옆에, 또한 JAR 파일의 종속성을 포함, 그래서 내 디렉토리 목록은 다음과 같이 보입니다 : 내가 알고 제대로 내 응용 프로그램 기능으로 내 문제는, 의존성에서 발생하지 않는다는 것을 확신JAR 파일의 임베디드 jetty 서버 시작하기

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

web-app.jar

dependency1.jar

dependency2.jar

dependency3.jar

을 , 제티가 임베디드를 시작할 때까지

나는 부두를 시작하기 위해 사용하는 코드는 다음과 같다 :

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);  
    }  

}  

나는 "웹 ​​애플리케이션"폴더가 /webapp 내 JAR 내부에 제대로 이전됩니다 것을 확인하고, 수 (내 IDE를 통해 코드를 실행할 때 IntelliJ IDEA 11) context.setResourceBase(new PathMatchingResourcePatternResolver().getResource("classpath:/webapp").getURL().toExternalForm())은 문제의 리소스에 유효하게 매핑됩니다. 또한 다음과 같이 해결할 수 있습니다.

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

액세스 할 수 있습니다 (읽었습니다). 그러나

, 내 응용 프로그램의 주요 방법을 시작하고 부두가 나는 다음과 같은 얻을 http://localhost:8089에 시작 :

HTTP ERROR: 503

Problem accessing /. Reason:

Service Unavailable 

Powered by Jetty://

어디서 잘못된 것입니까?

"resourceBase"를 "."로 설정하면됩니다. 주소 "http://localhost:8089"은 "~/Projects/Java/web-app/out/"위치에 대한 인터페이스로 작동하며 여기에서 다운로드 할 곳을 클릭하면 "web-app.jar"을 포함한 모든 JAR 파일의 목록을 볼 수 있습니다.

나는 다음과 같은 질문을 볼 수 있고, 답변이 적용되지 않습니다

  1. Embedded jetty application not working from jar : Start.class.getProtectionDomain().getCodeSource()null로 확인 이후는 NullPointerException이 얻을.
  2. Embedded Jetty WebAppContext FilePermission issue : 권한 문제 (필자는 파일 목록을 얻을 수 있다는 사실을 증명할 수있는 사실)가 없으므로이 질문에 대한 답변은 없지만 상황은 분명히 적용되지 않습니다.
  3. embedding jetty server problems : 또한 답이 없습니다. 종속성에 대한 문제가 없으므로이 또한 적용 할 수 없습니다 (앞에서 설명한 내용 참조).

나는 어떻게 든 내 src/main/resources/ 디렉토리 아래에있는 내 웹 응용 프로그램에 번들로 제공되는 /webapp 폴더를 액세스 할 부두를 활성화해야한다고 생각합니다. 번들 된 웹 애플리케이션을 버리고 전개 된 컨텍스트 경로를 대신 Jetty가 액세스 할 수있는 곳에 배치해야합니다 (이는 나와 내 고객에게 여러 가지 문제점을 제기하므로 바람직하지 않습니다).

+0

당신은 WAR 파일과 context.setWar (...)를 사용할 수 있습니다. 이렇게하면 배포본에 하나의 파일 만 추가됩니다. –

+0

나는 비슷한 문제에 직면하고있다. 서버가 일식에서 시작될 때 요청에 대한 적절한 응답을 얻고있다.하지만 cmd의 jar 파일에서 실행하면 404가 발생한다. –

답변

0

부두의 WebAppContextPathMatchingResourcePatternResolver을 사용할 수 있는지 확실하지 않습니다.

내 프로젝트 중 하나에서 Class#getResourceAsStream에 의해 요청 된 리소스를로드하는 내 자신의 javax.servlet.Filter을 작성하여이 문제를 해결했습니다. Class#getResourceAsStream은 jars 내부와 리소스 경로 (예 : maven) 내부에서 리소스를 읽습니다.이 팁은 당신을 위해 도움이됩니다

희망, 환호 틸로