我在sbt中使用程序集插件来组装我的项目.但是当"java -jar xx.jar"运行时会发生错误 -
"没有主要的清单属性".
我认为这是因为我的src/main/scala/目录中有两个文件,每个文件都有一个对象扩展Application,这意味着项目中有两个主要条目.但我需要两个应用程序,一个是服务器,另一个是测试客户端.
如何two-main-entry在scala sbt中处理这个问题.提前致谢.
我正在用scala编程,当我写一个简单的"println("hello world")"程序并使用'sbt package'将它发布到一个jar文件中时,该文件的大小只有4kb,但这对我没有帮助如果没有scala库,jar文件将无法运行.所以在网上搜索之后,我找到了sbt-assembly,它将包括scala库在内的所有内容打包成一个"胖jar",但生成的jar文件大小超过13Mb所以我的问题是当jar文件被执行或访问时,整个jar文件是否被加载进入内存,或者只需要将所需的数据和函数加载到内存中?
我对scala中的部署有点新意,我配置了sbt-assembly插件,一切运行良好.
几天前我添加了hadoop,spark和其他一些依赖项,然后assembly任务变得非常缓慢(8到10分钟),在此之前,它已经<30s.大部分时间用于生成程序集jar(jar需要几秒钟才能生成1MB大小).
我观察到存在很多合并冲突,这些冲突由first策略解决.这会影响装配速度吗?
我已经使用sbt的-Xmx选项(添加-Xmx4096m),但它没有帮助.
我正在使用sbt12.4和sbt-assembly.有关优化此任务的建议或指示吗?
我正在尝试使用SBT程序集插件创建一个可执行jar.
我最终得到以下错误:
[error] (app/*:assembly) deduplicate: different file contents found in the following:
[error] /Users/rajeevprasanna/.ivy2/cache/org.eclipse.jetty.orbit/javax.servlet/orbits/javax.servlet-3.0.0.v201112011016.jar:about.html
[error] /Users/rajeevprasanna/.ivy2/cache/org.eclipse.jetty/jetty-continuation/jars/jetty-continuation-8.1.8.v20121106.jar:about.html
[error] /Users/rajeevprasanna/.ivy2/cache/org.eclipse.jetty/jetty-http/jars/jetty-http-8.1.8.v20121106.jar:about.html
[error] /Users/rajeevprasanna/.ivy2/cache/org.eclipse.jetty/jetty-io/jars/jetty-io-8.1.8.v20121106.jar:about.html
[error] /Users/rajeevprasanna/.ivy2/cache/org.eclipse.jetty/jetty-security/jars/jetty-security-8.1.8.v20121106.jar:about.html
[error] /Users/rajeevprasanna/.ivy2/cache/org.eclipse.jetty/jetty-server/jars/jetty-server-8.1.8.v20121106.jar:about.html
[error] /Users/rajeevprasanna/.ivy2/cache/org.eclipse.jetty/jetty-servlet/jars/jetty-servlet-8.1.8.v20121106.jar:about.html
[error] /Users/rajeevprasanna/.ivy2/cache/org.eclipse.jetty/jetty-util/jars/jetty-util-8.1.8.v20121106.jar:about.html
[error] /Users/rajeevprasanna/.ivy2/cache/org.eclipse.jetty/jetty-webapp/jars/jetty-webapp-8.1.8.v20121106.jar:about.html
[error] /Users/rajeevprasanna/.ivy2/cache/org.eclipse.jetty/jetty-xml/jars/jetty-xml-8.1.8.v20121106.jar:about.html
[error] Total time: 2562 s, completed Dec 5, 2013 12:03:25 PM
Run Code Online (Sandbox Code Playgroud)
在阅读了程序集插件的wiki后,我在build.scala文件中添加了合并策略.似乎它不起作用.我不确定它是否正确修复.有人可以建议我正确的策略.
下面是我在build.scala文件中的代码:
mergeStrategy in assembly <<= (mergeStrategy in assembly) {
(old) => {
case "about.html" => MergeStrategy.discard
case "logback.xml" => MergeStrategy.first //case PathList("logback.xml") => MergeStrategy.discard
case x => old(x)
}
}
Run Code Online (Sandbox Code Playgroud)
我根据此文档编写了与我的应用程序的插件集成:Scalatra servlet的独立部署
我尝试了不同的策略,如MergeStrategy.rename和MergeStrategy.deduplicate.但没有任何作用..寻求帮助......
问题:为什么它忽略了MergeStrategy.first?
我在Play Framework中使用2.3.8版本做了一个小应用程序.根据官方文档,您可以将该行添加addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0")到plugin.sbt并添加一些(请参阅下面的代码)以使用该activator assembly命令.
这似乎有效,但存在重复数据删除冲突.这与文件ServerWithStop.class奇怪地发生.在build.sbt中,这个类有一个assembleMergeStrategy.这是官方文档的精确副本.
case "play/core/server/ServerWithStop.class" => MergeStrategy.first
case other => (assemblyMergeStrategy in assembly).value(other)
Run Code Online (Sandbox Code Playgroud)
我添加了几行我发现修复spring.tooling重复数据删除(可以在完整的sbt中再次找到).我明白这些原则; 它的哈希SHA-1比较类然后根据行为合并,我明白它不明白如何处理似乎与ServerWithStop.class不同的重复项.
我不明白(因此问题):为什么它忽略了MergeStrategy.first?
-
build.sbt
name := """MovieRequest"""
version := "1.0"
lazy val root = (project in file(".")).enablePlugins(PlayJava)
scalaVersion := "2.11.1"
libraryDependencies ++= Seq(
javaJdbc,
javaEbean,
cache,
javaWs,
"mysql" % "mysql-connector-java" % "5.1.35"
)
mainClass in assembly := Some("play.core.server.NettyServer")
fullClasspath in assembly += Attributed.blank(PlayKeys.playPackageAssets.value)
assemblyExcludedJars in assembly <<= (fullClasspath in assembly) map { cp =>
cp filter …Run Code Online (Sandbox Code Playgroud) 我目前面临着将一个超级jar部署到Spark Streaming应用程序的问题,其中存在具有不同版本的全等JAR,这些JAR导致引发运行时异常的火花.有问题的库是TypeSafe Config.
在尝试了很多东西之后,我的解决方案是推迟对提供的依赖项进行着色,这样它就不会与Spark在运行时提供的JAR冲突.
因此,我去了sbt-assembly阴影下的文档,我看到了以下示例:
assemblyShadeRules in assembly := Seq(
ShadeRule.rename("org.apache.commons.io.**" -> "shadeio.@1")
.inLibrary("commons-io" % "commons-io" % "2.4", ...).inProject
)
Run Code Online (Sandbox Code Playgroud)
试图遮蔽com.typesafe.config,我尝试将以下解决方案应用到我的build.sbt:
assemblyShadeRules in assembly := Seq(
ShadeRule.rename("com.typesafe.config.**" -> "shadeio.@1").inProject
)
Run Code Online (Sandbox Code Playgroud)
我以为它应该在我的项目中重命名对TypeSafe Config的任何引用.但是,这不起作用.它匹配我的项目中的多个类,并导致它们从超级jar中删除.我在尝试运行时看到了这个sbt assembly:
Fully-qualified classname does not match jar entry:
jar entry: ***/Identifier.class
class name: **/Identifier.class
Omitting ***/OtherIdentifier.class.
Fully-qualified classname does not match jar entry:
jar entry: ***\SparkBaseJobRunner$$anonfun$1.class
class name: ***/SparkBaseJobRunner$$anonfun$1.class
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用:
assemblyShadeRules in assembly := Seq(
ShadeRule.rename("com.typesafe.config.**" -> "shadeio.@1") …Run Code Online (Sandbox Code Playgroud) 我尝试用干净的项目构建jar,sbt-assembly如何在docs中描述:
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.11.2")
import AssemblyKeys._
assemblySettings
mainClass in assembly := Some("play.core.server.ProdServerStart")
fullClasspath in assembly += Attributed.blank(PlayKeys.playPackageAssets.value)
Run Code Online (Sandbox Code Playgroud)
但它给了我很多重复数据删除错误.如何打造"肥胖"罐子sbt-assembly?
我的代码基本上是这样的:
class FoodTrainer(images: S3Path) { // data is >100GB file living in S3
def train(): FoodClassifier // Very expensive - takes ~5 hours!
}
class FoodClassifier { // Light-weight API class
def isHotDog(input: Image): Boolean
}
Run Code Online (Sandbox Code Playgroud)
我想在JAR-assembly(sbt assembly)时,调用val classifier = new FoodTrainer(s3Dir).train()并发布JAR,该classifier实例可立即供下游库用户使用.
最简单的方法是什么?对此有哪些既定范式?我知道它是ML项目中一个相当常见的成语,用于发布经过训练的模型,例如http://nlp.stanford.edu/software/stanford-corenlp-models-current.jar
如何sbt assembly在不必将大型模型类或数据文件签入我的版本控制的情况下执行此操作?
组装uber jar时出现以下错误:
java.lang.RuntimeException:重复数据删除:在以下文件中发现了不同的文件内容:[错误] /Users/jake.stone/.ivy2/cache/org.bouncycastle/bcprov-jdk15on/jars/bcprov-jdk15on-1.61.jar:module -info.class [错误] /Users/jake.stone/.ivy2/cache/javax.xml.bind/jaxb-api/jars/jaxb-api-2.3.1.jar:module-info.class
我不了解Java技术,但是假设我不能简单地丢弃这些类之一。
有人可以告诉我我可以用来安全地编译uber jar的mergeStrategy吗?
我有一个有趣的问题,我基本上需要创建一个.jar(加上所有的类路径依赖项),其中包含一个 SBT 项目(加上它的任何子项目)的所有测试。这个想法是我可以只使用运行 jarjava -jar并且所有测试都将执行。
我听说这可能与 sbt-assembly 有关,但您必须手动运行您拥有assembly的每个 sbt 子项目(每个子项目都有自己的.jars),理想情况下,我只想运行一个命令,.jar为您碰巧拥有的每个 sbt root+sub 项目中的每个测试(以同样的方式,如果您test在带有子项目的 sbt 项目中运行,它将为所有内容运行测试)。
我们当前使用的测试框架是 specs2,但我不确定这是否有所不同。
有谁知道这是否可能?