为啥 SBT 不将生成的资源复制到 classes 文件夹?

Posted

技术标签:

【中文标题】为啥 SBT 不将生成的资源复制到 classes 文件夹?【英文标题】:Why isn't SBT copying generated resources to the classes folder?为什么 SBT 不将生成的资源复制到 classes 文件夹? 【发布时间】:2021-07-31 19:57:34 【问题描述】:

我编写了一个插件来处理一些 SQL 文件并生成新的作为托管资源的文件。当我运行“sbt compile”时,文件会生成到 target/resource_managed/main/sql 文件夹中。当我运行 'sbt run' 或 'sbt test' 时,它们并没有像我预期的那样复制到目标/类目录中,因此在类路径中查找它们的代码找不到它们。

这是插件的代码:

object SqlProcessorPlugin extends AutoPlugin 
  import autoImport._

  override def requires = plugins.JvmPlugin
  override def trigger = noTrigger

  object autoImport 
    lazy val processorSettings = taskKey[File]("Settings for sql processing")
    lazy val processSqlTask = taskKey[Seq[File]]("Process Sql")

    def configProcessor(cfg: Configuration) = 
      inConfig(cfg) 
        Seq(
          target in processorSettings := resourceManaged.value / "sql",
          sourceDirectory in processorSettings := sourceDirectory.value / "sql",
          processSqlTask / fileInputs += (sourceDirectory in processorSettings).value.toGlob / ** / "*.sql",
          processSqlTask := 
            SqlProcessor.process(
              processSqlTask.inputFileChanges,
              (target in processorSettings).value
            )
          ,
          resourceGenerators += processSqlTask.taskValue,
        )
      
    

    override val projectSettings = configProcessor(Compile)
  

我已经根据其他问题和其他插件的示例对此进行了很多尝试,但没有任何结果导致生成的文件被复制到类路径中。

我在这里错过了什么/做错了什么?

【问题讨论】:

SqlProcessor.process 是否返回所有生成的文件? 是的,它返回生成的文件。我发现它正在复制文件,而不是我期望的地方。它不是目标/类,而是将它们复制到目标/类/scala-2.13/classes/resource_managed。如何让它们直接复制到类文件夹下? 【参考方案1】:

我发现了这个问题。我使用 resourceManage.value 而不是 (Compile/resourceManaged).value 作为目标目录。另外,我认为结果是它弄乱了输出文件的相对路径,导致它们被复制到错误的位置。

【讨论】:

以上是关于为啥 SBT 不将生成的资源复制到 classes 文件夹?的主要内容,如果未能解决你的问题,请参考以下文章

sbt资源未复制

为啥 sbt-native-packager 不生成 bin 目录?

为啥生成的清单中没有 Main-Class 属性?

让 Maven2 将资源复制到构建目录,但不将它们捆绑在 JAR 中

为啥 RestTemplate 不将响应表示绑定到 PagedResources?

为啥不将哈希函数迭代 10,000,000 次? [复制]