【问题标题】:Static Content with a WAR and Jetty on HerokuHeroku 上带有 WAR 和 Jetty 的静态内容
【发布时间】:2013-09-09 14:20:45
【问题描述】:

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

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

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

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

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

谢谢!

【问题讨论】:

    标签: java heroku jetty


    【解决方案1】:

    您有几个选择。

    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. 在您的 web 应用程序旁边部署一个静态上下文引用

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

    • 从分发中打开etc/webdefault.xml
    • 找到名为default DefaultServlet 的servlet 的<servlet> 声明。
    • <servlet> 定义复制到您的Web 应用程序的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>
    
    • 添加 &lt;servlet-mapping&gt; 部分,定义从哪些 URL 模式提供此静态内容。
    <servlet-mapping>
      <servlet-name>extrastatic</servlet-name>
      <url-pattern>/static/*</url-pattern>
    </servlet-mapping>
    
    • 现在再次部署您的战争。

    这是如何工作的……是您现在在 web 应用之外拥有额外的静态内容。

    假设您已将您的战争部署到上下文 /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
    

    【讨论】:

    • 谢谢乔金。我想我可能想多了。也许最简单的事情是在“src/main/webapp”中创建一个仅包含静态内容的新 maven WAR 模块,并使用 maven war 覆盖功能让我的休息服务器 WAR 依赖于该静态 WAR。然后我什么都不做,我的静态内容被隔离在它自己的模块中。仍然没有解决 Heroku slug 编译问题,但应该足够好了。
    猜你喜欢
    • 1970-01-01
    • 2019-09-29
    • 2011-05-14
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 2011-07-01
    相关资源
    最近更新 更多