8

私がやろうとしているのはJAR、私のプロジェクトを含む実行可能ファイルを構築することです。その依存関係をファイルのすぐ隣に含めたJARので、ディレクトリのリストは次のようになります。

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

web-app.jar

依存関係1.jar

依存関係2.jar

依存関係3.jar

私は、Jetty 組み込みを起動する瞬間まで、私のアプリケーションが適切に機能するため、私の問題が依存関係から生じていないことを知っており、確信しています。

Jetty を起動するために使用するコードは次のようなものです。

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 内で に正しく再配置され/webapp、IDE (IntelliJ IDEA 11) を介してコードを実行するとcontext.setResourceBase(new PathMatchingResourcePatternResolver().getResource("classpath:/webapp").getURL().toExternalForm())、問題のリソースに有効にマップされることを検証できます。また、次のように解決されることを示すことができます。

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

アクセス可能です(私はそれを読みました)。

ただし、アプリケーションのメイン メソッドを開始すると、Jetty が開始されhttp://localhost:8089、次のようになります。

HTTP エラー: 503

/ へのアクセスに問題があります。理由:

Service Unavailable

Jetty:// を搭載

どこが間違っていますか?

「resourceBase」を「。」に設定することでそれを知っています。アドレス " http://localhost:8089" は場所 " " へのインターフェイスとして機能し、クリックすると " "を含む~/Projects/Java/web-app/out/すべてのJARファイルの一覧が表示され、ダウンロードするように提案されます。web-app.jar

次の質問を見ましたが、答えは当てはまりません。

  1. 埋め込みの jetty アプリケーションが jar から機能しないStart.class.getProtectionDomain().getCodeSource(): に解決されるため、NullPointerException が発生しnullます。
  2. Embedded Jetty WebAppContext FilePermission の問題: 回答がないだけでなく、アクセス許可の問題がないため、状況が明らかに当てはまりません (ファイルのリストを取得できるという事実はそれを証明するはずです)。
  3. jettyサーバーの問題の埋め込み:これも未回答で、依存関係の問題がないため適用できません(上記のコメントで以前に指摘したように)。

ディレクトリの下にあり、Web アプリケーションにバンドルされている/webappフォルダにJetty がアクセスできるようにする必要があると思います。src/main/resources/バンドルされた Web アプリケーションを放棄し、代わりに展開されたコンテキスト パスを Jetty からアクセス可能な場所にデプロイする必要があります (これは、私と私のクライアントに多くの問題を引き起こすため、まったく望ましくありません)。

4

2 に答える 2