在Heroku上使用WAR和Jetty的静态内容

时间:2013-09-05 16:32:20

标签: java heroku jetty

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

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

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

  1. 如何让Jetty提供我的REST服务以及静态HTML内容,而不必在每次静态内容更改时重建我的战争。
  2. 如何在不重建项目并重新启动jetty的情况下将新的静态内容推送到heroku?
  3. 目前部署很简单,我只需要担心代码更改,所以我只是从git放到heroku,它调用mvn包并重新启动我的dynos。但是对于静态内容只有变化,我不希望这种情况发生。

    谢谢!

1 个答案:

答案 0 :(得分: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旁边部署静态上下文引用
  5. 我会尝试的第一种技术是......

    • 从发行版中打开etc/webdefault.xml
    • 查找名为default DefaultServlet的servlet的<servlet>声明。
    • <servlet>定义复制到您的网络应用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>部分,定义从中提供此静态内容的网址格式。
    <servlet-mapping>
      <servlet-name>extrastatic</servlet-name>
      <url-pattern>/static/*</url-pattern>
    </servlet-mapping>
    
    • 现在再次部署你的战争。

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

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

    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