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

时间:2013-12-26 13:29:06

标签: maven java-ee resources jetty packaging

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

建议:

  1. 我建议您每次更改.xhtml.properties文件时都部署应用程序。如果这些文件的编辑器是高级业务用户,您可能会想到它们的git推拉工具和连续构建挂钩,这样当它们进行更改并将它们推送到git存储库时,应用程序会被标记为更新的版本并构建和部署。如果出现问题(标签未在xhtml中关闭),则很容易回滚到最后一个标签。
  2. 或者,如果更改很小(例如文本描述),则修改应用程序以从任意外部文件(webapp外部)读取它们 - 在启动时提供给webapp的位置。然后,您可以在webapp中打包文件的“默认”版本,但代码将首先尝试查看指定的外部位置。

答案 1 :(得分:0)

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

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

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

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