如何在多模块sbt项目中设置具体的工作目录

时间:2019-05-23 20:17:31

标签: scala file module sbt

我的包装结构与下面类似;

myapplication/
├── my-library/
│   └── src
│       └──main
│          └── scala
│   
├── my-other-library/
│   └── src/
│       └──main/
│          └── scala/
│── my-executable-project/
│   │── src/
│   │   └──main/
│   │      └── scala/
│   └── resources/
│       └── somefile.txt
└── build.sbt

当我通过sbt或intellij运行测试时;

  • 相对文件(例如new File("build.sbt"))相对于myapplication

当我通过sbt-revolver或二进制文件使用reStart运行项目时;

  • my-executable-project是工作目录。因此,要访问相同的build.sbt文件,我应该使用new File("../build.sbt")

这个项目结构对我来说很有意义,因为以后可能还会有其他可执行项目。我更喜欢将每个项目都放在父项目下。

my-executable-project被打包并在生产环境中运行。当它再次在那里运行时,my-executable-project是工作目录。

目前唯一的不便是当我要引用相对文件时,它在测试和常规运行中有所不同。

我通过使用classpath和classloader克服了资源加载问题,但是找不到相对文件引用的方法。当应用运行测试失败时,当测试运行应用失败时。


编辑:这就是我唯一的build.sbt的样子;

lazy val root = project
  .in(file("."))
  .disablePlugins(RevolverPlugin)
  .aggregate(library1, library2, service, common)
  .settings(
    settings,
    name := "parent",
    version := "0.1"
  )

lazy val common = project
  .in(file("common"))
  .disablePlugins(RevolverPlugin)
  .settings(
    settings,
    name := "common",
    libraryDependencies ++= ... some deps ...
  )

lazy val library1 = project
  .in(file("library1"))
  .disablePlugins(RevolverPlugin)
  .dependsOn(common)
  .settings(
    settings,
    name := "library1",
    libraryDependencies ++= ... some deps ...
  )

lazy val library2 = project
  .in(file("library2"))
  .disablePlugins(RevolverPlugin)
  .dependsOn(common)
  .settings(
    settings,
    name := "library2",
    libraryDependencies ++= ... some deps ...
  )

lazy val service = project
  .in(file("service1"))
  .dependsOn(library1, library2)
  .enablePlugins(JavaServerAppPackaging)
  .settings(
    settings,
    name := "service1",
    mappings in Universal ++= directory("service1/src/main/resources"),
    mainClass in Compile := Some("my.main.class.service.Main"),
    Revolver.enableDebugging(port = 5005, suspend = false),
    libraryDependencies ++= ... some deps ...
  )

1 个答案:

答案 0 :(得分:1)

我解决了这些问题,将所有sbt的内容放到了父项目中。

在此处查看文档:{​​{3}}

build.sbt的主要结构如下:

lazy val root = (project in file("."))
  .aggregate(util, core)

lazy val util = (project in file("util"))

lazy val core = (project in file("core"))

每个项目都可以这样配置:

lazy val core = (project in file("core"))
  .enablePlugins(PlayScala, BuildInfoPlugin)
  .settings(generalConf.noPublishSettings)
  .settings(generalConf.buildInfoSettings)
  .settings(coreConf.settings)

在这里,您看到我们使用常规配置generalConf和特殊项目配置(coreConf)。然后,这些文件位于/project文件夹中。

相关问题