6

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

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

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

更好,我的意思是:

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

编辑

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

4

4 回答 4

3

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

  1. 使用数据源 服务器上下文中定义的数据源消除了管理数据库配置和连接池的硬性依赖关系。在 Tomcat 中,可以按如下方式完成context.xml
<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. 使用环境变量或类路径变量

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

于 2015-05-26T13:24:12.210 回答
1

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

  final String tomcatHome = System.getProperty("catalina.home");
  if (tomcatHome == null) {
    // POJOs look in "."
    searchPaths.add(".");
  } else {
    searchPaths.add(tomcatHome);
    webApp = true;
  }
于 2015-05-26T13:23:39.667 回答
1

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

对于 Tomcat,您可以按照Tomcat 教程中的说明在 %CATALINA_HOME%/lib 中部署这个 jar 。类加载器定义

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

于 2015-05-26T13:30:36.337 回答
1

我用过的两种策略:

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

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

于 2015-05-26T14:44:36.060 回答