【问题标题】:working directory in sbtsbt 中的工作目录
【发布时间】:2012-11-17 11:16:40
【问题描述】:

我希望能够在特定目录中运行 java 程序。我认为,参数化工作目录非常方便,因为它可以轻松管理配置。

例如,您可以在一个文件夹中进行测试配置,而在另一个文件夹中,您可以拥有生产所需的资源。您可能认为,可以选择操作类路径以包含/排除资源,但只有当您对存储在类路径中的资源感兴趣并使用 Classloader.getResource(r) 引用它们时,这种解决方案才有效。但是,如果您有一些外部配置,并且想使用简单的指令(如 File file = new File("app.properties");)访问它怎么办?

我们来看一个普通的例子。

您的应用程序使用 app.properties 文件,您可以在其中存储外部服务的凭据。应用程序在工作目录中查找此文件,因为您使用提到的File file = new File("app.properties"); 指令来访问它。在您的测试中,您希望使用特定于您的测试的 app.properties。在您的集成测试中,您希望使用特定于另一个环境的 app.properties。最后,当您构建和发布应用程序时,您希望提供其他 app.properties 文件。您希望始终以相同的方式访问所有这些资源,只需键入 File file = new File("app.properties"); 而不是(伪代码):

if(configTest) 
    file = File("testWorkDir/app.properties");
else if(config2) 
    file = File("config2WorkDir/app.properties");
else 
    file = File("app.properties");

或者不使用类路径中的资源

this.getClass.getClassLoader.getResource("app.properties");

当然你是聪明的程序员,你使用诸如maven、gradle或sbt之类的构建工具:)

一开始就够了。至少问题:

有没有办法在 java 中设置工作目录,如果有,如何在构建工具中配置它(尤其是在 sbt 中)?

附加信息:

  • 更改“user.dir”系统属性不起作用(我尝试以编程方式更改它)。
  • 在 sbt 中更改 'working directory' via baseDirectory setting for test 更改了 baseDirectory,这在我的理解中不是基本目录,并且不等于 new java.io.File(".").getAbsolutePath
  • 提供像 YOUR_APP_HOME 这样的环境变量并从此路径引用资源是可行的,但需要在代码中记住这一点。

【问题讨论】:

    标签: java file classpath sbt


    【解决方案1】:

    在 sbt 中通过 baseDirectory 设置更改“工作目录”以进行测试更改 baseDirectory 在我的理解中它不是基本目录并且它不等于 new java.io.File(".").getAbsolutePath

    我不确定上面的语句是什么意思,但是使用 sbt 你需要在runtest 期间 fork 来改变你的工作目录。这记录在 Enable forkingChange working directory 中。

    【讨论】:

      【解决方案2】:

      如果你 fork,你可以控制一切,包括工作目录。

      http://www.scala-sbt.org/0.13.5/docs/Detailed-Topics/Forking.html

      示例代码:

      fork in run := true
      baseDirectory in run := file("/path/to/working/directory/")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-18
        • 1970-01-01
        • 2012-07-10
        • 2016-06-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多