GitHub - sbtsbt-assembly Implementați JAR-uri grase

Implementați JAR-uri grase. Reporniți procesele.

sbtsbt-assembly

sbt-assembly este un plugin sbt portat inițial din assembly-sbt de codahale, care cred că a fost inspirat de pluginul de asamblare al lui Maven. Scopul este simplu: creați un JAR gras al proiectului dvs. cu toate dependențele sale.

  • sbt
  • Dorința arzătoare de a avea o procedură simplă de implementare.

Probleme de raportare și contribuții

Înainte de a-mi trimite un e-mail, vă rugăm să citiți cu atenție Ghidul de raportare a problemelor. De două ori. (Nu-mi trimiteți un e-mail)

Utilizarea pluginului publicat

Adăugați sbt-assembly ca dependență în project/plugins.sbt:

(Este posibil să fie necesar să verificați etichetele acestui proiect pentru a vedea care este cea mai recentă versiune.)

Deoarece sbt-assembly este acum un plugin automat care este declanșat pentru toate proiectele cu JvmPlugin, nu ar trebui să necesite o configurare suplimentară pentru a include sarcina de asamblare în proiectul dvs. Consultați ghidul de migrare pentru detalii despre cum să faceți upgrade de la asamblarea sbt mai veche.

Aplicarea pluginului la multi-proiect build.sbt

De exemplu, iată un build.sbt cu mai multe proiecte:

În exemplul de mai sus, atât proiectul aplicației, cât și proiectul utils nu rulează teste în timpul asamblării. Proiectul aplicației stabilește o clasă principală, în timp ce proiectul utils stabilește numele fișierului său jar.

Acum veți avea o nouă sarcină minunată de asamblare care vă va compila proiectul, vă va rula testele și apoi va împacheta fișierele de clasă și toate dependențele într-un singur fișier JAR: target/scala_X.X.X/projectname-assembly-X.X.X.jar .

Dacă specificați un mainClass în asamblare în build.sbt (sau doar lăsați-l să detecteze automat unul), atunci veți ajunge cu un JAR complet executabil, gata de rock.

Iată lista cheilor pe care le puteți reconecta pentru sarcina de asamblare.

De exemplu, numele borcanului poate fi setat după cum urmează în build.sbt:

Pentru a sări peste test în timpul asamblării,

Pentru a seta o clasă principală explicită,

Excluderea unei clase principale explicite din asamblarea dvs. necesită totuși ceva puțin diferit

Dacă mai multe fișiere partajează aceeași cale relativă (de exemplu, o resursă denumită application.conf în JAR-uri cu dependență multiplă), strategia implicită este de a verifica dacă toți candidații au același conținut și se erorează altfel. Acest comportament poate fi configurat pe bază de cale, utilizând una dintre următoarele strategii încorporate sau scriind una personalizată:

  • MergeStrategy.deduplicate este valoarea implicită descrisă mai sus
  • MergeStrategy.first alege primul dintre fișierele potrivite în ordinea clasei
  • MergeStrategy.last alege ultima
  • MergeStrategy.singleOrError se salvează cu un mesaj de eroare la conflict
  • MergeStrategy.concat pur și simplu concatenează toate fișierele potrivite și include rezultatul
  • MergeStrategy.filterDistinctLines, de asemenea, concatenează, dar lasă duplicatele pe parcurs
  • MergeStrategy.rename redenumește fișierele provenite din fișiere jar
  • MergeStrategy.discard aruncă pur și simplu fișierele potrivite

Cartarea numelor de căi pentru strategiile de îmbinare se face prin setarea assemblyMergeStrategy care poate fi mărită după cum urmează:

NOTĂ:

  • assemblyMergeStrategy în asamblare așteaptă o funcție. Nu puteți face assemblyMergeStrategy în assembly: = MergeStrategy.first !
  • Unele fișiere trebuie să fie eliminate sau redenumite altfel pentru a evita ruperea codului zip (din cauza numelui fișierului duplicat) sau a licenței legale. Delegați manipularea implicită la (assemblyMergeStrategy în asamblare) ca exemplu de potrivire a modelului de mai sus.

Apropo, primul model de caz din cele de mai sus folosind PathList (.) Este modul în care puteți alege javax/servlet/* din primul borcan. Dacă MergeStrategy.deduplicate implicit nu funcționează pentru dvs., probabil înseamnă că aveți mai multe versiuni ale unei biblioteci extrase de graficul de dependență. Soluția reală este să remediați acel grafic de dependență. Puteți rezolva problema prin MergeStrategy.first, dar nu vă mirați când vedeți ClassNotFoundException .

Iată valoarea implicită:

Custom MergeStrategy poate afla de unde provine un anumit fișier folosind metoda sourceOfFileForMerge pe sbtassembly.AssemblyUtils, care ia directorul temporar și unul dintre fișierele trecute în strategie ca parametri.

Pluginuri de strategie de îmbinare a terților

Suportul pentru strategiile de îmbinare a cazurilor speciale dincolo de domeniul de aplicare generic poate fi oferit de pluginurile însoțitoare, mai jos este o listă neexhaustivă:

sbt-assembly poate umbra clasele din proiectele dvs. sau din dependențele bibliotecii. Susținută de Jar Jar Links, transformarea bytecode (prin ASM) este utilizată pentru a schimba referințele la clasele redenumite.

Iată regulile de umbră:

  • ShadeRule.rename ("x. **" -> "y. @ 1",.). ÎnToate Aceasta este regula principală.
  • ShadeRule.zap („a.b.c”). InAll
  • ShadeRule.keep ("x. **"). InAll

Regula principală ShadeRule.rename este utilizată pentru a redenumi clasele. Toate referințele la clasele redenumite vor fi, de asemenea, actualizate. Dacă un nume de clasă este asociat cu mai multe reguli, se va aplica doar prima. Regulile de redenumire iau un vararg de perechi de șiruri

este un nume de clasă cu metacaractere opționale. ** se va potrivi cu orice sub șir valid de nume de clasă. Pentru a se potrivi cu o singură componentă de pachet (prin excluderea. Din potrivire), se poate folosi în schimb un singur *. este un nume de clasă care poate face referință opțional la șirurile potrivite de metacaractere. O referință numerotată este disponibilă pentru fiecare * sau ** din

, începând de la stânga la dreapta: @ 1, @ 2 etc. O referință specială @ 0 conține întregul nume al clasei potrivite.