1

我有一个 REST 服务器,它被打包到一个 WAR 中,并在 Heroku 上与 Jetty 一起运行。我有一个新的要求来提供一些简单的静态内容。

这很简单,我可以将静态内容放入我的“src/main/webapp”中,默认的 servlet 会处理它。

但是,我不想每次我们的 HTML 人员更新静态内容时都重新构建我的 WAR。所以我有两个问题。

  1. 我如何让 Jetty 提供我的 REST 服务以及静态 HTML 内容,而不必在每次静态内容更改时重建我的战争。
  2. 如何将新的静态内容推送到heroku,而无需重建我的项目并重新启动码头?

目前部署很容易,我只需要担心代码更改,所以我只是从 git 到 heroku,它调用 mvn 包并重新启动我的 dynos。但是对于静态内容,我不希望这种情况发生。

谢谢!

4

1 回答 1

0

有几个选择供您选择。

  1. 定义另一个 DefaultServlet,将新请求路径映射到磁盘上的目录。
    • 定义于WEB-INF/web.xml
    • 或在 Jetty 上下文可部署 xml 中定义
  2. 定义一个 DefaultHandler 将新的请求路径映射到磁盘上的目录。
    • 在服务器级别定义etc/jetty.xml
    • 或添加到您选择的新 xml 文件中的处理程序列表中,例如etc/my-external-static.xml
    • 请参阅contexts-available/resources.xml分发中的示例。
  3. 定义一个 ResourceHandler 将新的请求路径映射到磁盘上的目录。
    • 在服务器级别定义etc/jetty.xml
    • 或添加到您选择的新 xml 文件中的处理程序列表中,例如etc/my-external-resources.xml
    • 请参阅etc/jetty-fileserver.xml分发中的示例。
  4. 在你的 webapp 旁边部署一个静态上下文引用

我会尝试的第一个技术是......

  • 从发行版中打开etc/webdefault.xml
  • 找到<servlet>名为defaultDefaultServlet 的 servlet 的声明。
  • <servlet>定义复制到您的 webapp 的WEB-INF/web.xml
  • 将 重命名为(它是一个特殊的保留名称)<servlet-name>以外的名称。default让我们称之为<servlet-name>extrastatic</servlet-name>
  • 添加一个新的<init-param>定义值,该resourceBase值指向磁盘上查找内容的位置。
<init-param>
  <param-name>resourceBase</param-name>
  <param-value>/var/web/static/</param-value>
</init-param>
  • 添加一个<servlet-mapping>部分,定义从哪些 URL 模式提供此静态内容。
<servlet-mapping>
  <servlet-name>extrastatic</servlet-name>
  <url-pattern>/static/*</url-pattern>
</servlet-mapping>
  • 现在再次部署你的战争。

这是如何工作的......是你现在在 webapp 之外有额外的静态内容。

假设你已经将你的战争部署到上下文中,/myapp那么像这样对 URL 的请求将提供来自这个新extrastaticservlet 的内容。

http://machine.corp.com/webapp/static/ 
   serves: /var/web/static/ (possibly index.html - see dirAllowed init-param)

http://machine.corp.com/webapp/static/css/main.css
   serves: /var/web/static/css/main.css

http://machine.corp.com/webapp/static/js/jquery-min.js
   serves: /var/web/static/js/jquery-min.js
于 2013-09-05T18:41:01.980 回答