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

Juh*_*uh_ 5 java tomcat servlets parameter-passing servlet-container

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

我发现这不合适,因为每次为不同的部署(开发与生产,更改执行计算机)打包 webapp 时都需要更改这些值。源代码被版本化,这让它更加麻烦。

有没有更好的选择来传递上面列出的参数?

更好,我的意思是:

  • 实用:易于设置、更改和向他人解释
  • 与战争分离
  • 尽可能独立于 web 容器(如果依赖,我在 prod 中使用 tomcat)

编辑

我选择了@aksappy答案来奖励答案中所做的工作,因为它提供了几种使用标准工具的方法。但是,根据上下文,我可以采用任何其他解决方案:

aks*_*ppy 3

您可以根据您的环境使用多种东西。以下是一些可以考虑的事情

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

您可以通过在此元素内嵌套条目来配置命名值,这些命名值将作为环境条目资源对 Web 应用程序可见。例如,您可以创建如下环境条目:(来源此处)。这可以设置为上下文参数或环境条目。它们等同于 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
  }
}
Run Code Online (Sandbox Code Playgroud)

注意:以上只是一个例子。

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

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