【问题标题】:Externalizing static content from a WAR and serve both on jetty从 WAR 外部化静态内容并在码头上提供服务
【发布时间】:2013-12-26 13:29:06
【问题描述】:

在我的项目中,我使用 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“爆炸”,如果在 jetty.xml 中配置,Jetty 是否会为您的 WAR 做一些事情,还是我必须在部署之前提取 WAR?

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

【问题讨论】:

    标签: maven jakarta-ee resources jetty packaging


    【解决方案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 push-pull 工具和一个持续构建钩子,这样当他们进行更改并将它们推送到 git 存储库时,应用程序会被标记为较新的版本并被构建和部署。如果有问题(xhtml中标签没有关闭),那么回滚到最后一个标签就很容易了。
    2. 或者,如果更改很小(例如文本描述),则修改应用程序以从任意外部文件(webapp 外部)读取它们 - 启动时提供给 webapp 的位置。然后,您可以将文件的“默认”版本打包到 webapp 中,但代码会首先尝试在指定的外部位置查找。

    【讨论】:

    • .xhtml.properties 文件作为WAR 包之外的外部可修改文件有什么缺点? 1.将无法在项目环境设置。使用 2. 你建议我应该制作另一个配置/属性文件,但我不明白这种方法的好处。
    • 我在开头添加了 2 段以进一步阐述。规则是:如果您的应用程序由于格式错误或损坏的 xhtml 或属性文件而中断——那么它是代码而不是内容,并且应该经历一个发布周期。如果您想将文本视为内容(很好!),请将其保留在 web 应用程序之外并编写代码以在加载时读取它,同时在应用程序内提供默认版本以使其不会中断。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-09-29
      • 1970-01-01
      • 1970-01-01
      • 2018-08-05
      • 2019-07-18
      • 2020-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多