首页 文章

外部化WAR中的静态内容并在jetty上提供服务

提问于
浏览
0

在我的项目中,我使用Maven将Web应用程序打包到WAR,后来使用CentOS上的自定义Maven插件将其部署到Jetty . 部署到 生产环境 环境的每个项目都使用自定义插件 . 现在要求所有静态内容(如网站文本,属性)在WAR之外打包,以便可以在 生产环境 中更改它而无需新的发布周期 . 我不确定如何实现这种外化 .

Jetty服务器具有Jetty quick start guide中描述的目录结构 . 目前,Web应用程序已经提供了一些可以在外部更改的 .properties 文件,这些文件位于 resources/ 目录中 . 这些文件由自定义Maven插件移动到此处 . WAR驻留在 webapp/ 文件夹中 . 我的问题的一个选项是使用 <packagingExcludes>maven-war-plugin 不包括例如WAR中的 *.xhtml*.properties . 稍后,我可以使用自定义Maven插件将排除的文件移动到 resources/ 目录 . 但是,我有一种感觉这不是外部化静态内容的正确方法...不应该将xhtml文件存放在 webapp/ 文件夹中,而唯一的属性文件存在于 resources/ 文件夹中吗?

我还研究了将WAR部署为爆炸的选项,但我不确定这种情况的影响 . 显然,爆炸的WAR文件中的更改将在下一次部署中被覆盖,但其目的是在开发和 生产环境 中进行静态更改 . 另外,我不确定如何实现WAR "explosion",如果在_3014906中配置了Jetty是否为WAR做了什么,还是在部署之前我必须提取WAR?

最后,人们如何在Jetty中提供可以在 生产环境 中改变的静态内容?同时执行WAR和静态文件

2 回答

  • 1

    Jetty resources 文件夹不应用于应用程序文件 . J2EE Web应用程序(war)应该是自包含的 - 并且在Jetty中,仅驻留在/ webapps文件夹中 - 并且它对容器(Jetty servlet引擎)的唯一绑定是通过 web.xml 部署描述符 .

    由于可以从类路径中读取属性文件,并且Jetty resources 文件夹是系统类路径的一部分,因此Web应用程序类加载器可以读取属性文件 . 请注意,还有其他方法可以读取属性文件,Jetty resources 文件夹不应该用于应用程序属性 . 此外,应用程序可能不可移植,因为其他应用程序服务器具有不同形式的webapp类加载器隔离 .

    如果以下架构方法不适合您,那么您唯一的方法是在/ webapps文件夹中展开(爆炸战争)并希望在编辑文件时获得最佳效果 .

    从不同角度解决这个问题, - 如果您的Web应用程序依赖于 .properties.xhtml 文件才能正常运行,那么这些文件可能不是'content' . 事实上,有一个业务流程要求他们临时更新并不会使他们满意 . - 'content'类似于管理用户添加,编辑和删除的文本,图像和视频 . 应用程序不依赖于它来正确执行,它只是在浏览器上读取并传递它 .

    建议:

    • 我建议您每次更改 .xhtml.properties 文件时都部署应用程序 . 如果这些文件的编辑器是高级业务用户,您可能会想到它们的git推拉工具和连续构建挂钩,这样当它们进行更改并将它们推送到git存储库时,应用程序会被标记为更新的版本并构建和部署 . 如果出现问题(标签未在xhtml中关闭),则很容易回滚到最后一个标签 .

    • 或者,如果更改很小(例如文本描述),则修改应用程序以从任意外部文件(webapp外部)读取它们 - 在启动时提供给webapp的位置 . 然后,您可以在webapp中打包文件的'default'版本,但代码将首先尝试查找指定的外部位置 .

  • 0

    我发现您可以向属性添加HTML标记,然后使用 <h:outputFormat> 来获取带参数的这些属性 . 此外,您可以使用MessageFormat API中所述的属性文件做相当简洁的事情 .

    我的解决方案是保留 .xhtml 文件在WAR内部,但使用基于 .properties 文件的默认资源包中的简单HTML片段属性 . 这些属性包含在 .xhtml 中,使用 <h:outputFormat><h:outputText> . 这允许用户在片段中添加粗体和下划线等简单样式 .

    使用自定义Maven插件将属性文件复制到Jetty resource 文件夹,因此我将 .properties 文件保留在WAR中 . 出于某种原因,Jetty resource 文件夹优先于打包的 .properties 文件,所以这很好 . 此外,正如Akber指出的那样,如果出于某种原因将WAR移动到 resource 文件夹不可用的其他应用程序服务器,我将拥有可用属性的默认版本 .

    当然,正如Akber所指出的那样,如果格式错误的HTML放在代码片段属性中,那么使用这种方法可能会破坏代码,但它适用于我们的应用程序,因为它非常小 . 如果这是一个更大的应用程序,我可能永远不会这样做,但是我可能已经选择了基于数据库的解决方案来添加静态文本(如Joomla / Drupal / Wordpress) .

相关问题