私がやろうとしているのは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
次の質問を見ましたが、答えは当てはまりません。
- 埋め込みの jetty アプリケーションが jar から機能しない
Start.class.getProtectionDomain().getCodeSource()
: に解決されるため、NullPointerException が発生しnull
ます。 - Embedded Jetty WebAppContext FilePermission の問題: 回答がないだけでなく、アクセス許可の問題がないため、状況が明らかに当てはまりません (ファイルのリストを取得できるという事実はそれを証明するはずです)。
- jettyサーバーの問題の埋め込み:これも未回答で、依存関係の問題がないため適用できません(上記のコメントで以前に指摘したように)。
ディレクトリの下にあり、Web アプリケーションにバンドルされている/webapp
フォルダにJetty がアクセスできるようにする必要があると思います。src/main/resources/
バンドルされた Web アプリケーションを放棄し、代わりに展開されたコンテキスト パスを Jetty からアクセス可能な場所にデプロイする必要があります (これは、私と私のクライアントに多くの問題を引き起こすため、まったく望ましくありません)。