2019年11月1日jettyについての全投稿は/tag/jettyにあるので参照されたい妙なタイトルだが、要するにこういうことだ。あるアプリの中にJettyを組み込み、その上にウェブアプリをホスティングするのだが、ウェブアプリのJavaコードは、ホストとなったアプリケーションのコードやライブラリをそのまま利用する。ホスト側とウェブアプリ側の区別は必要無い。通常、JettyやTomcat等のサーブレットコンテナでは、コンテナ側とその上に配備されるウェブアプリとは別個のものとして扱われるのだが、今回の場合にはそれらが一体不可分であり、分けて考える必要はない。単純に「ウェブサービス機能を持ったアプリ」でしかないのである。基本的にサーブレットコンテナ(Jettyを組み込んだアプリ側)と、その上で動作するウェブアプリの間で何らかのデータをやり取りするには一定の困難が生ずる。それらのクラスローダが異なるからである。これを説明するのは非常に面倒なのだが、ともあれ、異なるクラスローダの間での相互呼び出しは非常に難しい。基本的に「異なるクラスローダであれば、無関係の異なるアプリ」と認識すべきである。これをあえて、自由自在に相互の呼び出しが可能とするためには、クラスローダを同一にするほかはない。ホスト側のアプリと、ウェブアプリが同一のクラスローダで動作するようにする。この方法は既にJetty:WebAppContext.setClassLoaderに記述した。同一のクラスローダの意味クラスローダが同一であるということは、本体アプリとウェブアプリのコードに区別がなくなるということだ。これにより、ウェブアプリのプログラムが、本体側にあっても良いことになる。いうことかと言えば、通常ウェブアプリ、つまりwarファイルは以下のような構成になっている。libclasses以下にウェブアプリ本体、lib以下に必要なライブラリが配備されるのだが、これらは必要無いということである。ユーザに公開されないファイルという状態で良い。warファイルを展開しないで配備Tomcatと同様にJettyでもwarファイルを与えるとデフォルトでその内容を展開してしまう(これは通常一時ファイル領域に行われる)のだが、これをさせずにwarファイルのまま扱わせることができる。このフラグとしてextractWARがある。warContext.setExtractWAR(false);※lib下にjarファイルのある状態でこれを行うとエラーになる。jarファイルがwarファイル中に含まれた状態では実行できないようだ。この場合でも一時ファイル領域は作成されてしまうようだ。まとめということで、あるJavaアプリ内に完全にJettyを組み込みにする方法としては以上である。※Jettyに関する全投稿は/tag/jettyにあるので参照されたい。組み込みでxml無しに最も簡単にJettyのHttpセッションを永続化する。コメントをキャンセルメールアドレスが公開されることはありません。*ウェブサイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。上に表示された文字を入力してください。