Link 到 webservice 之外的属性文件

Link to properties file outside webservice

我有一个使用 Java、REST、Jersey 并在 Tomcat8 上运行的 Web 服务。 Web 服务需要访问数据库。根据我们在流程中所处的位置,我们可能会使用测试数据库、生产数据库或其他数据库。理想情况下,我们希望能够设置要使用的数据库,而无需更改代码和重新编译。

我们尝试过的方法是使用一个属性文件来定义数据库参数,并使用一个环境变量来指向该文件。事实证明这很麻烦,首先我们很难在 Tomcat 服务器上定义我们可以从应用程序读取的系统属性,而且似乎所有文件都必须在类路径上定义,即已经提前配置和代码库的一部分。

这似乎是相当常见的情况,所以我确定有推荐的方法来处理这种情况?

我们有一个类似的案例。我们在同一个端点 (/admin) 上创建了第二个 Web 服务,我们调用它来设置一些配置参数。我们还有一个数据库,用于在设置后持久保存配置。为了让生活更轻松,我们还创建了一个简单的 UI 来设置这些值。用户在 UI 中配置值,UI 调用 /admin Web 服务,而 /admin 服务在内存(作为属性)和数据库中设置配置。主 Web 服务使用属性作为动态配置。

注意:我们使用基于 JWT 的授权来防止对 /admin 的未授权访问。但根据您的需要,您可以保持不安全,使用基本的 HTTP 身份验证或使用更详细的内容。

Zack Macomber 说的有道理。不要让您的 app/service 动态查找其设置。

让您的构建过程动态化。

Maven、Gradle 和朋友都提供了根据构建参数和/或 tasks/profiles.

修改输出的简单方法

在您的代码中总是 link 到同一个文件(名称)。然后将根据您的任务 and/or 构建环境包含实际文件。用于测试的测试配置。生产的生产配置。

在许多情况下,完全重新编译是不必要的,因此将被跳过(当然,这取决于您的工具)。

代码完全没有变化。此外,代码将非常愚蠢,因为它不需要了解任何有关上下文的信息。

尤其是在与多人一起工作时,这种方法提供了最稳定的长期解决方案。为那些需要一些特殊的本地配置的人定制,最重要的是 transparent 对于所有不需要或不想了解运行时环境要求的人!

不确定在这种特殊情况下是否明智,但确实可以在文件系统的任何位置创建 .properties 文件 - 并 link 通过 Resources元素.

https://tomcat.apache.org/tomcat-8.0-doc/config/resources.html

The Resources element represents all the resources available to the web application. This includes classes, JAR files, HTML, JSPs and any other files that contribute to the web application. Implementations are provided to use directories, JAR files and WARs as the source of these resources and the resources implementation may be extended to provide support for files stored in other forms such as in a database or a versioned repository.

您需要一个 PreResources 元素,link 到一个文件夹,其内容将在 /WEB-INF/classes.

处提供给应用程序
<Context antiResourceLocking="false" privileged="true" docBase="${catalina.home}/webapps/myapp">

    <Resources className="org.apache.catalina.webresources.StandardRoot">

        <!-- external res folder (contains settings.properties) -->
        <PreResources className="org.apache.catalina.webresources.DirResourceSet"       
         base="/home/whatever/path/config/"
         webAppMount="/WEB-INF/classes" /> 

    </Resources>    

</Context>

您的应用程序现在 'sees' /home/whatever/path/config/ 中的文件,就像它们位于 /WEB-INF/classes 中一样。

通常,Resources 元素放在 Context 元素内。 Context 元素必须放在位于以下位置的文件中:

$CATALINA_BASE/conf/[enginename]/[hostname]/ROOT.xml

https://tomcat.apache.org/tomcat-8.0-doc/config/context.html#Defining_a_context