Scala 为什么生成的清单中没有主类属性?

Scala 为什么生成的清单中没有主类属性?,scala,sbt,sbt-assembly,Scala,Sbt,Sbt Assembly,我有一个build.sbt文件,其中包含程序集插件。在最近的构建之前,主类属性一直包含在已组装的far jar中,但突然之间,情况不再如此 当我尝试运行jar时,我得到了无与伦比的: no main manifest attribute, in ./target/scala-2.10/foo-0.3.0-SNAPSHOT.jar 但是使用sbt控制台上的run可以很好地工作 我的build.sbt当前看起来是这样的(assembly中添加的mainClass是为了向assembly插件强制指示

我有一个build.sbt文件,其中包含程序集插件。在最近的构建之前,主类属性一直包含在已组装的far jar中,但突然之间,情况不再如此

当我尝试运行jar时,我得到了无与伦比的:

no main manifest attribute, in ./target/scala-2.10/foo-0.3.0-SNAPSHOT.jar
但是使用sbt控制台上的run可以很好地工作

我的build.sbt当前看起来是这样的(assembly中添加的mainClass是为了向assembly插件强制指示它确实应该包含,尽管我在插件源代码中注意到,它看起来像是在检查为运行而指定的一个)


当我解压jar文件并检查META-INF/MANIFEST.MF时,没有包含Main Class:attribute。

这是试图用最新版本的0.11.2重现这个问题

项目/构建.属性

sbt.version=0.13.7-M3
项目/组装.sbt

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.11.2")
import AssemblyKeys._

assemblySettings

scalaVersion := "2.11.2"
构建.sbt

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.11.2")
import AssemblyKeys._

assemblySettings

scalaVersion := "2.11.2"
src/main/scala/main.scala

object HelloApp extends App {
  println("Hello")
}
在单个项目中包含上述所有文件:

> about
[info] Updating {file:/Users/jacek/sandbox/sbt-assembly/}sbt-assembly...
[info] Resolving jline#jline;2.12 ...
[info] Done updating.
[info] This is sbt 0.13.7-M3
[info] The current project is {file:/Users/jacek/sandbox/sbt-assembly/}sbt-assembly 0.1-SNAPSHOT
[info] The current project is built against Scala 2.11.2
[info] Available Plugins: sbt.plugins.IvyPlugin, sbt.plugins.JvmPlugin, sbt.plugins.CorePlugin, sbt.plugins.JUnitXmlReportPlugin, com.typesafe.sbteclipse.plugin.EclipsePlugin, net.virtualvoid.sbt.graph.Plugin, com.github.tototoshi.sbt.musical.Plugin, com.timushev.sbt.updates.UpdatesPlugin, sbtassembly.Plugin
[info] sbt, sbt plugins, and build definitions are using Scala 2.10.4

> assembly
[info] Updating {file:/Users/jacek/sandbox/sbt-assembly/}sbt-assembly...
[info] Resolving jline#jline;2.12 ...
[info] Done updating.
[info] Compiling 1 Scala source to /Users/jacek/sandbox/sbt-assembly/target/scala-2.11/classes...
[info] Including: scala-library-2.11.2.jar
[info] Checking every *.class/*.jar file's SHA-1.
[info] Merging files...
[warn] Merging 'META-INF/MANIFEST.MF' with strategy 'discard'
[warn] Strategy 'discard' was applied to a file
[info] SHA-1: a5c09d7626fe19f4e3cd98d709966a77f127b048
[info] Packaging /Users/jacek/sandbox/sbt-assembly/target/scala-2.11/sbt-assembly-assembly-0.1-SNAPSHOT.jar ...
[info] Done packaging.
[success] Total time: 4 s, completed Oct 8, 2014 9:27:41 AM

> eval "unzip -p target/scala-2.11/sbt-assembly-assembly-0.1-SNAPSHOT.jar META-INF/MANIFEST.MF" !
Manifest-Version: 1.0
Implementation-Title: sbt-assembly
Implementation-Version: 0.1-SNAPSHOT
Specification-Vendor: default
Specification-Title: sbt-assembly
Implementation-Vendor-Id: default
Specification-Version: 0.1-SNAPSHOT
Main-Class: HelloApp
Implementation-Vendor: default

[info] ans: Int = 0
这并不能回答原始问题的“为什么”,但正如其他评论所提到的,如果您引入另一个
main
(例如,通过另一个对象间接包含),则可能会发生这种情况

因此,您可以在build.sbt中明确定义它:

mainClass in assembly := Some("path.to.intended.Main")  // object with main

在(编译、运行):=Some(“ProcessRelogger”)中尝试注释出mainClass

]$sbt清洁组件
]$java-jar目标/xxx.jar

愚蠢的问题-Processrelogger中是否有多个主电源?我的第一个猜测是尝试FQDN而不仅仅是类名。sbt程序集的版本是什么?使用sbt程序集的0.11.2,Processrelogger中没有多个主电源,这就是FQDN,它在根包中。您能删除两行
mainClass
并重新开始吗?您是否可以在之后执行
show compile:run::mainClass
,并将其包含到问题中?您还可以使用主类的名称执行
assembly
,然后执行
last grep
?将输出添加到问题中。事实上-这曾经运行良好,但后来它停止运行良好,我似乎不知道是什么变化可能会产生这种效果。不确定这与上面build.sbt中给出的有什么不同?