【问题标题】:Why does multi-module project build generate empty jar files for submodules with stage?为什么多模块项目构建会为带有阶段的子模块生成空的jar文件?
【发布时间】:2014-10-23 23:33:48
【问题描述】:

我是 Typesafe Activator 的新手,正在尝试创建一个具有子项目关系的 Play 项目。

我在本地开发中使用activator,在 Heroku 上使用sbt。这是 sbt 版本 0.13.5。

当我从root 项目的基本目录中键入sbt clean stage 时,它会调用子模块并在<parent_dir>/<sub_project_dir>/universal/stage/lib 下的适当位置生成一个jar 文件。

问题是jar文件只有META-INF/MANIFEST.MF文件,里面没有其他文件,包括类文件。

当我使用 activator clean stage 从子模块的基目录构建子模块时,会创建包含所有正确类文件的 jar 文件。

这是顶级项目build.sbt 的内容(减去库依赖项和repo 解析器):

import play.PlayScala

name := "perf-catalog-index"

version := "1.0"

lazy val index_worker=(project in file("index_worker")) settings (
  name:="perf-catalog-index-worker",
  mainClass:=Some("org.myorg.catalog.index.CatalogIndexWorker")
)

lazy val root = (project in file(".")) enablePlugins(PlayScala) aggregate(index_worker)

aggregate in Global := true

scalaVersion := "2.11.1"

这里是我的子项目index_workerbuild.sbt文件的类似内容:

import play.PlayScala

name := "perf-catalog-index-worker"

version := "1.0"

lazy val root = (project in file(".")) enablePlugins(PlayScala)

// Setup the packager
packageArchetype.java_application

// Enable JAR export for staging
exportJars := true

val workerMainClass = Some("org.myorg.catalog.index.CatalogIndexWorker")

mainClass in (Compile, run) := workerMainClass

mainClass in (Compile, packageBin) := workerMainClass

scalaVersion := "2.11.1"

如何获取stage 命令为包含类文件的子项目生成jar 文件?

【问题讨论】:

  • 这需要一些时间来找出问题所在,所以您介意将项目发布到 github 上进行调查吗?
  • 我不确定我是否可以发布整个内容。这是我公司私人 github 存储库的一部分。不过我会看看有什么可能。
  • 只需发布您自己的副本,用于在更小、更受控制的“环境”中重现问题 - 您在此处提出问题之前确实创建了一个副本,不是吗?
  • 顺便说一句,为什么你使用sbt activator 而单独使用activator 就足够了?为什么要打扰sbt?!
  • 我在本地工作中使用 activator,因为我正在使用 play 框架进行开发。当发布到 heroku 时,我们在那里使用标准的 sbt 构建包,我假设它正在使用 sbt 来完成它的工作。我试图确保这两种方法的行为相同,以确保 Heroku 可以正确构建它。在父级使用激活器也会产生与 sbt 相同的结果(空 jar 文件)。

标签: playframework sbt typesafe-activator


【解决方案1】:

我的猜测是将顶级build.sbt 中的index_worker 项目声明更改为明确地具有enablePlugins PlayScala

lazy val index_worker = (project in file("index_worker")) settings (
  name := "perf-catalog-index-worker",
  mainClass := Some("org.myorg.catalog.index.CatalogIndexWorker")
) enablePlugins PlayScala

这样做的原因是您有两个独立的 Play 项目 - index_workerroot。虽然 index_worker 是一个完整的 Play 项目,但它的整个 project 构建定义没有被拾取,因为只有顶层定义是(这就是 sbt 的工作方式)。

不过,我不知道为什么stage 在子模块中执行。 我可能弄错了。

【讨论】:

  • 你的猜测是正确的。从父版本启用 PlayScala 插件实现了我正在寻找的结果。现在生成的 jar 文件包含我期望的所有类文件。感谢您花时间看这个!非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-23
  • 1970-01-01
  • 2020-12-24
  • 1970-01-01
  • 2021-10-03
  • 2012-03-27
  • 1970-01-01
相关资源
最近更新 更多