在我的项目中,我使用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和静态文件
答案 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 并不会使他们满意。
- “内容”类似于管理用户添加,编辑和删除的文本,图像和视频。应用程序不依赖于它来正确执行,它只是在浏览器上读取并传递它。
建议:
.xhtml
或.properties
文件时都部署应用程序。如果这些文件的编辑器是高级业务用户,您可能会想到它们的git推拉工具和连续构建挂钩,这样当它们进行更改并将它们推送到git存储库时,应用程序会被标记为更新的版本并构建和部署。如果出现问题(标签未在xhtml中关闭),则很容易回滚到最后一个标签。答案 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)。