したがって、以前は戦争としてパッケージ化されてから Tomcat にデプロイされていた Java アプリケーションがありますが、次のように組み込みの Jetty を使用して jar ファイルからすべてが直接実行されるようにセットアップしました。
class JettyServer extends ServerTrait {
val server = new Server()
val connector = new ServerConnector(server)
connector.setPort(BigSenseServer.config.options("httpPort").toInt)
server.setConnectors(Array(connector))
val context = new ServletContextHandler()
context.setContextPath(BigSenseServer.webRoot)
context.addServlet(new MasterServlet().getClass, "/*")
context.addEventListener(new InitLoggingListener())
context.addEventListener(new DBUpdateListener())
val fileContext = new WebAppContext()
fileContext.setContextPath(BigSenseServer.contentRoot)
fileContext.setResourceBase(BigSenseServer.getClass.getResource("/io/bigsense/web").toExternalForm)
val handlers = new HandlerCollection()
handlers.setHandlers(Array( fileContext, context, new DefaultHandler()))
server.setHandler(handlers)
override def startServer() {
server.start
server.join
}
override def stopServer() {
server.stop
}
}
webroot は /bigsense/api であり、contentRoot は /static です。この構成では、CSS や Javascript などの静的ファイルは /io/bigsense/web パッケージから提供されます (SBT の src/main/resources に保持されます)。オリジナルでは、context-root は /bigsense で、サーブレットは api/* にマップされていたので、すべての静的コンテンツは /bigsense/{js,css,whatever} から直接提供できました。
Jetty に同じことをさせる方法がわかりませんでしたが、上記の現在のセットアップは問題なく動作し、すべてのテンプレートを調整して、同じ構成オブジェクト (プロパティ ファイルにバックエンドがあります) からその静的パスを取得しました。 .
組み込みの Tomcat 実装も作成したいと考えており、いくつかのガイドを読みましたが、それらはすべて実際の webapp ベース ディレクトリを必要としているようです。webapp ベースなしでサーブレット ディレクトリをマップするか、実際の物理ディレクトリの代わりにクラスパス (jar 内) から webapp ベースを取得する例は見つかりません。私は次のようなことを試しました:
編集サーブレットが次のように動作するようになりました。ここで必要なのは、ServletContextListneres と、jar ファイルからサーバー ファイルへの方法だけです。
class TomcatServer extends ServerTrait {
val tomcat = new Tomcat()
tomcat.setPort(BigSenseServer.config.options("httpPort").toInt)
val tmp = new File(System.getProperty("java.io.tmpdir"))
val ctx = tomcat.addContext(BigSenseServer.webRoot,tmp.getAbsolutePath)
Tomcat.addServlet(ctx,"bigsense",new MasterServlet())
ctx.addServletMapping("/*","bigsense")
override def startServer() = {
tomcat.start()
tomcat.getServer().await()
}
override def stopServer() = tomcat.stop
}
したがって、メインのサーブレットについては、Jetty と同様の設定をしています。私が持っている 2 つの ServletContextListner オブジェクトを追加するためのコンテキスト オブジェクトの関数が見つかりません。contentRoot (/static) の jar から静的コンテキストを提供できるようにする必要もあります。