2014-10-07 132 views
2

我有一个包含程序集插件的build.sbt文件。直到最近的构建,Main-Class属性被包含在组装的远程jar中,但突然之间,情况就不再如此了。为什么生成的清单中没有Main-Class属性?

当我尝试运行jar,我得到了独特的:

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:属性。

+0

愚蠢的问题 - Processrelogger中是否有多个主电源? – Azzie 2014-10-07 17:38:08

+0

我的第一个猜测是尝试FQDN而不是仅仅是类名。 – lgasior 2014-10-07 20:22:13

+0

sbt-assembly的版本是什么? – 2014-10-08 07:07:51

回答

1

这是试图用最新版本sbt-assembly 0.11.2重现问题。

项目/ build.properties

sbt.version=0.13.7-M3 

项目/ assembly.sbt

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

build.sbt

import AssemblyKeys._ 

assemblySettings 

scalaVersion := "2.11.2" 

的src/main /斯卡拉/ 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 
+0

确实 - 这用于正常工作,然后它停止工作正常,我似乎无法弄清楚可能会产生什么影响的变化。 – PlexQ 2014-10-08 17:20:34

0

这不回答 “为什么” 的原题,但正如其他评论提到,这可能会发生,如果你介绍另一main(如包括间接通过另一个对象)。

所以,你可以在你的build.sbt明确定义它,例如:

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

不知道这与上面的build.sbt中给出的不同吗? – PlexQ 2015-06-11 17:55:27

0

尝试(编译,运行)注释掉mainClass:=一些( “ProcessRelogger”) ]$ sbt clean assembly ]$ java -jar target/xxx.jar

相关问题