Sono incredibilmente nuovo al mondo scala e sbt e sto cercando di gestire tutti i miei nuovi progetti con sbt piuttosto che usare Maven. Ma ora sono su un punto in cui non lo so più perché non riesco a trovare nessuna controparte sbt per il plugin mavnen-shade. Quello che ho trovato erano solo plugin per includere tutte le dipendenze, ma non è quello che mi serve. Quindi qualcuno conosce un plugin per includere certe dipendenze nel barattolo?maven-shade come plug-in per SBT
risposta
SBT-assemblaggio 0.14.0 aggiunge il supporto shading .
sbt-assembly può schermare le classi dai progetti o dalle dipendenze della libreria. Sostenuto da Jar Jar Links, la trasformazione bytecode (tramite ASM) viene utilizzata per modificare i riferimenti alle classi rinominate.
assemblyShadeRules in assembly := Seq(
ShadeRule.rename("org.apache.commons.io.**" -> "[email protected]").inAll
)
Sto cercando una cosa simile perché sono completamente stufo degli errori di suffisso cross-version e degli errori di deduplicazione da sbt-assembly.
sono riuscito a trovare "onejar" plug-in, ma non è stato aggiornato per un anno intero, fatemi sapere se funziona: https://github.com/sbt/sbt-onejar
Ho avuto successo con Proguard utilizzando il plugin sbt-proguard. Mi ci è voluto un po 'per installarlo e ho dovuto disattivare alcune delle funzionalità di Proguard per farlo funzionare, ma alla fine ho ottenuto quello che volevo: un singolo jar che potevo eseguire con "java -jar", anche su un sistema senza scala installato.
Ecco il mio project/plugins.sbt
per abilitare il plugin:
resolvers += Resolver.url("sbt-plugin-releases-scalasbt", url("http://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/"))(Resolver.ivyStylePatterns)
addSbtPlugin("com.typesafe.sbt" % "sbt-proguard" % "0.2.2")
Ed ecco alcuni frammenti dal mio build.sbt per configurarlo:
scalaVersion := "2.10.2"
proguardSettings
ProguardKeys.options in Proguard += ProguardOptions.keepMain("io.package.my.app.Main")
ProguardKeys.options in Proguard ++= Seq(
"-keep class com.sun.xml.wss.impl.misc.XWSSProcessorFactory2_0Impl { *; }", // created dynamically by XWSSProcessorFactory
//
"-dontshrink",
"-dontobfuscate",
"-dontoptimize",
//
// Don't warn is necessary to avoid ProGuard refusing to build the jar.
//
"-dontwarn com.sun.**",
"-dontwarn org.apache.**",
"-dontwarn scala.**",
//
// Don't note just reduces clutter in the build output. If you make changes
// to the ProGuard configuration, you might want to remove these temporarily to
// help debug the new configuration until it's working correctly.
//
"-dontnote com.sun.**",
"-dontnote org.apache.**",
"-dontnote scala.**"
)
//"-printconfiguration /tmp/proguard"
// Examples of how to filter classes.
ProguardKeys.inputFilter in Proguard := { file =>
file.name match {
case "classes" => None
case "org.apache.karaf.shell.console-2.3.2.jar" => Some("org/apache/karaf/shell/**,org/apache/felix/gogo/commands/**")
case "jline-2.9.jar" => Some("jline/**")
case "org.apache.karaf.jaas.modules-2.3.2.jar" => Some("org/apache/karaf/jaas/modules/**")
case "org.apache.karaf.jaas.config-2.3.2.jar" => Some("org/apache/karaf/jaas/config/**")
case "org.osgi.compendium-4.3.1.jar" => Some("!**")
case _ => Some("!META-INF/**")
}
}
ho scritto Scala dal 2.7 e io ancora preferisco usare Maven, FWIW. – lmm
Il [montaggio sbt-assembly] (https://github.com/sbt/sbt-assembly) fa ciò che vuoi? –
Non esattamente, rinomina tutti i file in jar come "OrginalClassName-1.0-SNAPSHOT.class", quindi il programma di caricamento classi non li trova. –