如何将依赖于部署的参数传递给 webapp

How to pass deployment dependant parameters to webapp

在我工作(编辑)的项目中,部署参数 - 例如存储路径或数据库登录 - 通常通过参数文件给出,该文件存储在 war 文件中。

我发现这不合适,因为每次为不同的部署打包 webapp 时都需要更改这些值(dev vs prod,执行计算机的更改)。源代码版本化,这就更麻烦了。

Is there some better option to pass parameters such as listed above?

更好的意思是:

编辑

我选择 来重新ward 在答案中完成的工作,因为它提供了几种使用标准工具的方法。但是,根据上下文,我可以寻求任何其他解决方案:

我们通常将 Web 应用程序属性文件放在 Tomcat 主文件夹中。 POJOS 查看启动文件夹。将有其他网络服务器的其他标准位置。

  final String tomcatHome = System.getProperty("catalina.home");
  if (tomcatHome == null) {
    // POJOs look in "."
    searchPaths.add(".");
  } else {
    searchPaths.add(tomcatHome);
    webApp = true;
  }

您可以根据自己的环境使用很多东西。以下是一些可以考虑的东西

  1. 使用数据源 服务器上下文中定义的数据源从 Web 应用程序中删除了管理数据库配置和连接池的硬连线依赖性。在 Tomcat 中,这可以在 context.xml
  2. 中按如下方式完成
<Context>
       ...
      <Resource name="jdbc/EmployeeDB" auth="Container"
                 type="javax.sql.DataSource"
          description="Employees Database for HR Applications"/>
      </Context>
  1. 使用上下文

您可以通过在该元素中嵌套条目来配置将作为环境条目资源对 Web 应用程序可见的命名值。例如,您可以像这样创建一个环境条目:(Source here)。这可以设置为上下文参数或环境条目。它们等同于 web.xml 或属性文件中的条目,只是它们可从服务器的上下文中获得。

  1. 使用数据库配置并在 ServletContextListener 加载这些配置

我倾向于遵循的另一种方法是在数据库中创建属性的关系模式。不要在服务器启动期间加载属性文件,而是在启动期间从数据库加载属性。

public class ContextInitialize implements ServletContextListener {
  private static Properties props;
  public void contextInitialized(ServletContextEvent servletContextEvent) {
     // connect to DB
     // Load all the key values pairs as required
     //put this into a Properties object, or create a hashtable, hashmap ..
  }
  //Getter
  public String getProperty(String key){
     // get value of key
  }
  //Setter
  public void setProperty(String key, String value){
     // set value to a key
  }
}

注:以上仅为示例。

  1. 使用环境变量或类路径变量

在环境变量中使用类路径/路径变量,并在 java 代码中使用 System.getenv() 以根据需要获取这些值。

一种策略是将所有属性和配置文件打包到一个外部 jar 中,并使这个 jar 成为您的应用程序的依赖项:war、ear 等。然后,您可以部署这个 jar在一个公共文件夹中,应用程序服务器将在该文件夹中加载它并使其可用于部署在那里的所有应用程序。这意味着您将为每个环境部署一次具有值的 jar(或每次您需要更改它时,但与对主要工件所做的更改相比,它的更改必须很慢)并且您可以部署和重新部署您的 war 或您的应用程序服务器中的任何其他项目都没有问题。

在 Tomcat 的情况下,您可以将此 jar 部署在 %CATALINA_HOME%/lib 中,如 Tomcat Tutorial. Class Loader Definitions

中所述

要在我的应用程序中使用(读取)这些文件,我只需像在我的应用程序中加载任何其他资源一样加载它们。

我使用过的两种策略:

JVM 参数 -- 自定义 JVM 参数可以在启动时由容器设置。如果您有很多设置,这可能会有点冗长。

配置文件 -- 这些可以被应用程序读取。位置是硬编码的,放在容器路径中,或者为了两全其美,通过 JVM 参数指定位置。