我有一个 REST 服务器,它被打包成 WAR 并在 Heroku 上与 Jetty 一起运行。我有一个新的要求,需要提供一些简单的静态内容。
这很简单,我可以将静态内容放入我的“src/main/webapp”中,默认的 servlet 将处理它。
但是,我不想每次我们的 HTML 人员更新静态内容时都必须重建我的 WAR。所以我有两个问题。
- 如何让 Jetty 提供我的 REST 服务以及静态 HTML 内容,而不必在每次静态内容更改时重建我的 war。
- 如何将新的静态内容推送到 heroku,而无需重建项目并重新启动 jetty?
目前部署很简单,我只需要担心代码更改,所以我只需从 git 放到 heroku 中,它就会调用 mvn package 并重新启动我的 dynos。但对于静态内容仅进行更改,我不希望发生这种情况。
谢谢!
最佳答案
有几种选择供您选择。
- 定义另一个 DefaultServlet,将新请求路径映射到磁盘上的目录。
- 定义于
WEB-INF/web.xml
- 或在 Jetty 上下文可部署 xml 中定义
- 定义于
- 定义一个 DefaultHandler,将新请求路径映射到磁盘上的目录。
- 在
etc/jetty.xml
中的服务器级别定义 - 或添加到您选择的新 xml 文件中的处理程序列表中,例如
etc/my-external-static.xml
- 参见
contexts-available/resources.xml
以分布为例。
- 在
- 定义一个 ResourceHandler,将新请求路径映射到磁盘上的目录。
- 在
etc/jetty.xml
中的服务器级别定义 - 或添加到您选择的新 xml 文件中的处理程序列表中,例如
etc/my-external-resources.xml
- 参见
etc/jetty-fileserver.xml
以分布为例。
- 在
- 在您的网络应用旁边部署静态上下文引用
- 请参阅
context/javadoc.xml
发行版中的文件作为示例。
- 请参阅
我要尝试的第一个技术是......
- 打开
etc/webdefault.xml
来自分布。 - 查找
<servlet>
名为default
的 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>
定义从什么 URL 模式提供此静态内容的部分。
<servlet-mapping>
<servlet-name>extrastatic</servlet-name>
<url-pattern>/static/*</url-pattern>
</servlet-mapping>
- 现在再次部署你的 war 。
这是如何工作的......你现在在网络应用程序之外拥有额外的静态内容。
假设您已将 war 部署到上下文 /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
关于java - Heroku 上带有 WAR 和 Jetty 的静态内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18641576/