sbt中的工作目录

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

例如,在一个文件夹中,您可以配置测试,在另一个文件夹中,您可以拥有生产所需的资源。 您可能认为,可以选择操作类路径以包含/排除资源,但只有当您对存储在类路径中的资源感兴趣并使用Classloader.getResource(r)引用它们时,此解决方案才有效。 但是如果你有一些外部配置并且想要使用File file = new File("app.properties");类的简单指令来访问它会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");您想要访问的所有这些资源总是以相同的方式访问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"); 

或者不使用classpath中的资源

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

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

从一开始就应该这样做。 至少问题:

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

附加信息:

  • 更改’user.dir’系统属性不起作用(我试图以编程方式更改它)。
  • 在sbt 通过baseDirectory设置更改’工作目录’进行测试更改baseDirectory,它不是我的understangind中的基础目录,它不等于new java.io.File(".").getAbsolutePath
  • 提供像YOUR_APP_HOME这样的环境变量并从该路径引用资源是可行的,但需要在代码中记住这一点。

如果你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/") 

在sbt通过baseDirectory设置更改’工作目录’进行测试更改baseDirectory,它不是我的understangind中的基础目录,它不等于new java.io.File(".").getAbsolutePath

我不确定上面的语句是什么意思,但是对于sbt,你需要在runtest期间分叉来更改你的工作目录。 这在Enable forking和Change工作目录中有记录 。