java - 如何在Tomcat中获取属性文件

标签 java tomcat properties

我使用 Neatbeans 创建一个 Java 类库项目。这个类(名称:TestDB.java)是做一些数据库的工作。我写了一个“config.properties”文件来配置一些属性。 config.properties 位于项目文件夹中。在我的类 TestDB.java 中:

Properties properties = new Properties(System.getProperties());
String configFile = "config.properties";
properties.load(new FileInputStream(configFile));
String param1 = properties.getProperty("Postgre.Driver1");

我可以使用测试用例来获取属性,没关系。

当我构建这个项目并创建一个 jar 文件时。我想要另一个 Web 应用程序使用这个 jar 文件来做一些数据库工作。我已经将 jar 包含在我的 webapp 中并构建了一个 webproj.war。当我将此 webproj.war 放置到 Tomcat 并运行 webapp 时。我无法获取该属性,因为我不知道 Tomcat webapp 中的哪个文件夹可以放置 config.properties。谁能帮我解决这个问题?

最佳答案

很抱歉回答很长,但我想介绍一下背景,因为我认为您的问题有点困惑。

这个答案试图更笼统地阐明您对网络应用程序和可重用性的理解。

首先,了解应用程序通常必须在多个环境中运行很重要 - dev、sit、uat、production 等。如果您在二进制文件(jar 或 war)中包含特定环境,这意味着您只能使用该二进制文件在单一环境中。

最初的 J2EE 假设是这些环境细节将由容器(在本例中为 Tomcat)管理。这就是the answer referenced in the first comment of your question是在做。基本上,容器提供在 JNDI 中注册的资源,您的应用程序可以查找这些资源。

现在,我认为可以公平地说,J2EE 人员在某些特性方面表现出色,JNDI 资源机制就是其中一个实例,现在并不常用(至少在我习惯的应用程序)。

现在,尝试回答您的问题。

首先要认识到的是,将代码放入单独的 jar 中的原因是为了使其可重用。自从 Spring 出现以来,实现可重用性的基本方法之一就是使用 dependency injection。 .抛开 Spring ,dependency injection没有什么比在创建特定对象时传递特定对象所需的资源更复杂的了。

例如,您的 TestDB 类可能实例化如下:

TestDB testDB = new TestDB(dataSource);

这仍然没有解决实例化 DataSource 的问题,但是它确实将此责任置于使用 TestDB 而不是 TestDB 的代码中> 本身。

实例化 DataSource 的简单方法是在 war 的类路径中包含一个属性文件(在 WEB-INF/classes 中),这将允许您执行以下(注意 DataSource 实例化将特定于数据库):

Properties properties = new Properties();
properties.load(getClass().getClassLoader().getResourceAsStream("config.properties"))

DataSource dataSource = new PGSimpleDataSource();
dataSource.setServerName(properties.get("database.server.name")); 
...

所以这会让您到达从 war 中加载属性文件的地步。然而,正如我所说,这使得 war 环境变得特殊。

我知道解决此问题的最佳方法是使用带有指向环境配置的符号链接(symbolic link)的爆炸式 war 。为此,您需要使用一个上下文文件,该文件将放置在 [Tomcat root]/conf/Catalina/localhost 中。

例如,给定的上下文文件:

<?xml version="1.0" encoding="UTF-8"?>

<Context path="/my-app" docBase="/local/apps/my-app/war" distributable="false" allowLinking="true">

  <WatchedResource>WEB-INF/web.xml</WatchedResource>

</Context>

你会有这样的目录结构:

local
  + apps
    + my-app
      + war
        + WEB-INF
          + classes
            + env -> /local/apps/my-app/env
      + env

/local/apps/my-app/war/WEB-INF/classes/env 是指向 /local/apps/my-app/env 的符号链接(symbolic link).

您的属性现在将像这样加载:

Properties properties = new Properties();
properties.load(getClass().getClassLoader().getResourceAsStream("env/config.properties"))

这为您提供了两个可发布的组件 - 应用程序和配置,只需解压即可安装它们。

关于java - 如何在Tomcat中获取属性文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31068574/

相关文章:

java - JSAPI : Central. createRecognizer 返回 null

spring - Tomcat 8.0无法启动

java - Tomcat 没有选择 index.html 上显示的 404

c# - C# 自动实现的静态属性是线程安全的吗?

java - 执行Java时进程不运行

java - 如何配置eclipse支持java?

java - PowerMock:对采用 Object[] 作为参数的方法正确使用 Whitebox.invokeMethod(...)

java - 在客户端调用 onOpen() 之前调用 websocket ServerEndpoint

Objective-C 访问器声明(只读、读写等)

java - 为什么不通过在 sar/META.INF/jboss-service.xml 中工作的 SystemPropertiesService 配置 JBoss 系统属性