所以我有一个 Java 应用程序,它曾经被打包为一个战争,然后部署到 Tomcat,但现在我已经设置了它,所以它直接从一个使用嵌入式 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 中)。在我的原文中,上下文根是 /bigsense,servlet 映射到 api/*,因此所有静态内容都可以直接从 /bigsense/{js,css,whatever} 提供。
我不知道如何让 Jetty 做同样的事情,但是上面列出的当前设置工作正常,我调整了所有模板以从同一个配置对象(在属性文件中有一个后端)获取该静态路径.
我也想创建一个嵌入式 Tomcat 实现,并且我已经阅读了几个指南,但他们似乎都想要一个真正的 webapp 基本目录。我找不到任何示例,它们要么只是映射没有 webapp 基础的 servlet 目录,要么从类路径(在 jar 中)而不是真正的物理目录中获取 webapp 基础。我尝试过类似以下的事情:
编辑让 servlet 使用以下内容。现在我只需要 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 类似的主 servlet 设置。我在上下文对象上找不到任何函数来添加我拥有的两个 ServletContextListner 对象。我还需要能够从 contentRoot (/static) 上的 jar 中提供我的静态上下文。