【问题标题】:How to specify test classpath in Eclipse如何在 Eclipse 中指定测试类路径
【发布时间】:2012-01-31 22:55:52
【问题描述】:

我有一个 Eclipse 项目,其目录结构如下:

MyProj
    >> src/main/java
    >> src/main/config
    >> src/test/java
    >> src/test/config

src/test/config 内部,我有一个名为app.properties 的属性文件,其中包含src/main/javasrc/test/java 中的类都使用的属性。

我用来查找属性文件的所有代码如下所示:

try {
    Properties props = new Properties();

    props.load(new FileInputStream("app.properties"));

    someString = props.getProperty("app.title.color");
    // etc.
} catch(Exception exc) {
    // Handle exception...
}

但是,当我运行它时,我收到以下错误(在上面的 catch 子句中处理):

java.io.FileNotFoundException: app.properties(系统找不到指定的文件)

但是当我将app.properties 文件移动到我的项目根目录(与src/main/java 处于同一级别)并重新运行代码时,效果很好。

显然,这是一个类路径问题。如果我转到Build Path >> Configure Build Path >> Source,我会看到src/test/config 实际上是构建路径 上的源文件夹。这可能并不意味着它也在类路径!!!

如何配置 Eclipse 以在类路径中查找 src/test/config,以便我可以将我的属性文件放在那里,但在运行时(运行单元测试时)仍然可以使用它?

提前致谢!

【问题讨论】:

    标签: java eclipse classpath


    【解决方案1】:

    执行此操作的正确方法(这将确保您的代码在放入 JAR 时继续工作)是将 src/test/config 添加到项目的类路径中,并使用 getResourceAsStream() 加载资源ClassLoader 的方法。例如

    Thread.currentThread().getContextClassLoader().getResourceAsStream("app.properties")
    

    【讨论】:

    • dty - 我正要问“如果我把它放在 JAR 里怎么办?”对 DNA 的回应——你把我脑子里的话都偷走了!谢谢!
    • 同意,这是一个更好的方法。我已经多次使用这种变体来加载与类相关的资源,但不知道 getContextClassLoader() 细节。谢谢。
    【解决方案2】:

    这不完全是类路径问题(因为您没有在此处加载类!) - 问题是您的代码正在加载相对于当前工作目录的文件,默认情况下是您的项目根目录。 FileInputStream 不知道类路径是什么——它只是加载文件!

    您可以指定文件的路径:

    props.load(new FileInputStream("src/test/config/app.properties"));
    

    虽然在命令行(或 Eclipse 运行配置文件)上将配置目录指定为系统属性会更好:

    -Dconfig.dir="src/test/config/"
    

    然后加载与该目录相关的文件,例如:

    public static final String CONFIG_DIR = System.getProperty("config.dir");
    props.load(new FileInputStream(CONFIG_DIR+"app.properties"));
    

    【讨论】:

    • 感谢 DNA,这是一个很好的建议 - 我正要问你一个后续问题,但 dty 在我问之前就回答了。再次感谢(我赞成你的回答)。
    【解决方案3】:

    文件夹已合并,但您必须以不同的方式访问属性文件,作为相对于类的资源:

        InputStream is = YourClassName.class.getResourceAsStream("/app.properties");
    

    注意开头的“/”。

    【讨论】:

      猜你喜欢
      • 2014-10-14
      • 2012-12-20
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多