Почему в сгенерированном манифесте нет атрибута Main-Class?

У меня есть файл build.sbt, который включает плагин сборки. Вплоть до самой последней сборки атрибут Main-Class включался в собранную дальнюю банку, но внезапно это уже не так.

Когда я пытаюсь запустить банку, получаю неподражаемое:

no main manifest attribute, in ./target/scala-2.10/foo-0.3.0-SNAPSHOT.jar

но используя запуск из консоли sbt, работает нормально.

Мой build.sbt в настоящее время выглядит так (mainClass в сборке добавлен в попытке принудительно указать плагину сборки, что он действительно должен включать, хотя я заметил в исходном коде плагина, похоже, что он все равно проверяет тот, который указан для запуска ).

import AssemblyKeys._

name := "foo"

version := "0.3.0-SNAPSHOT"

organization := "com.mycompany.myproduct"

scalaVersion := "2.10.4"

mainClass in (Compile, run) := Some("ProcessRelogger")

mainClass in assembly := Some("ProcessRelogger")

assemblySettings

libraryDependencies ++= Seq(
  "org.scalatest" % "scalatest_2.10" % "1.9.2" % "test",
  "ch.qos.logback" % "logback-classic" % "1.0.9",
  "com.typesafe.akka" %% "akka-actor" % "2.2.4",
  "joda-time" % "joda-time" % "2.3",
  "com.rabbitmq" % "amqp-client" % "3.3.4",
  "org.scalaz" % "scalaz-core_2.10" % "7.0.6",
  "com.typesafe.slick" %% "slick" % "2.0.2",
  "postgresql" % "postgresql" % "9.1-901.jdbc4",
  "com.escalatesoft.subcut" %% "subcut" % "2.0"
)

и когда я распаковываю файл jar и проверяю META-INF / MANIFEST.MF, атрибут Main-Class: не включен.


person PlexQ    schedule 07.10.2014    source источник
comment
Глупый вопрос - а в Processrelogger есть несколько сетей?   -  person Azzie    schedule 07.10.2014
comment
Моей первой догадкой было бы попробовать полное доменное имя, а не просто имя класса.   -  person lgasior    schedule 08.10.2014
comment
Какая версия sbt-сборки?   -  person Jacek Laskowski    schedule 08.10.2014
comment
Используется 0.11.2 sbt-assembly, и в ProcessRelogger нет нескольких сетей, и это полное доменное имя, оно находится в корневом пакете.   -  person PlexQ    schedule 08.10.2014
comment
Не могли бы вы удалить две mainClass строки и начать заново? Можете ли вы сделать show compile:run::mainClass после этого и включить это в вопрос? Можете ли вы также выполнить assembly, а затем last-grep с именем основного класса? Добавьте результаты к вопросу.   -  person Jacek Laskowski    schedule 08.10.2014
comment
Я обнаружил еще одну вещь: в системе есть ДВА класса приложений, которые используются в разных ситуациях. Я воспроизвел настройку теста, приведенную ниже, и если я добавлю mainClass: = Some (Thing), в котором класс не существует, он не завершится неудачно, а просто выберет класс, являющийся приложением ?!   -  person PlexQ    schedule 09.10.2014
comment
›Show compile: run :: mainClass [info] Some (ProcessRelogger)   -  person PlexQ    schedule 09.10.2014
comment
и grepping для основного класса на сборке показывает много bupkiss   -  person PlexQ    schedule 09.10.2014


Ответы (3)


Это попытка воспроизвести проблему с последней версией sbt-assembly 0.11.2.

project / build.properties

sbt.version=0.13.7-M3

project / assembly.sbt

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

build.sbt

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
person Jacek Laskowski    schedule 08.10.2014
comment
Действительно - раньше это работало нормально, а затем перестало работать нормально, и я не могу понять, что изменилось, что могло бы иметь такой эффект. - person PlexQ; 08.10.2014

Это не отвечает на вопрос «почему» для исходного вопроса, но, как упоминалось в других комментариях, это может произойти, если вы ввели другой main (например, включая косвенно через другой объект).

Таким образом, вы можете явно определить его, например, в своем build.sbt:

mainClass in assembly := Some("path.to.intended.Main")  // object with main
person Core    schedule 09.06.2015
comment
Не знаете, чем это отличается от того, что указано в build.sbt выше? - person PlexQ; 11.06.2015

Попробуйте закомментировать mainClass в (Compile, run): = Some ("ProcessRelogger") ]$ sbt clean assembly ]$ java -jar target/xxx.jar

person Michaelzh    schedule 21.07.2017