package Ġcom . iv ie league . k build . jvm Ċ Ċ import Ġjava . io .* Ċ import Ġjava . util . jar . Jar Entry Ċ import Ġjava . util . jar . Jar InputStream Ċ import Ġjava . util . jar . Jar OutputStream Ċ import Ġjava . util . jar . Manifest ĊĊ Ċ object ĠJar Ġ{ ĊĊĠĠĠ Ġfun Ġdefault Manifest (): ĠManifest Ġ= ĠManifest (). also Ġ{ ĊĠĠĠĠĠĠĠ Ġit . main Attributes . put Value (" Manifest - Version ", Ġ" 1 . 0 ") ĊĠĠĠĠĠĠĠ Ġit . main Attributes . put Value (" Created - By ", ĠSystem . getProperty (" java . version ") Ġ+ Ġ" Ġ( F ad le )") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate ( from Directory : ĠFile , Ġinto Jar : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ ĠJar OutputStream ( File OutputStream ( into Jar )). use Ġ{ Ġstream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( from Directory , Ġstream ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate ( from Directories : ĠSequence < File >, Ġinto Jar : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ ĠJar OutputStream ( File OutputStream ( into Jar )). use Ġ{ Ġstream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Directories . forEach Ġ{ Ġfrom Directory Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( from Directory , Ġstream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġjar Files ( jar : ĠFile ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= ĠArrayList < String >() ĊĠĠĠĠĠĠĠ ĠFileInputStream ( jar ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġj Ġ= ĠJar InputStream ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= Ġj . next Jar Entry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( entry . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġlist ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlist Java Classes ( classpath : ĠFile ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( classpath . extension Ġ== Ġ" jar ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjar Files ( classpath ). filter Ġ{ Ġit . endsWith (". class ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . replace ('/', Ġ'. '). replace ('\\ ', Ġ'. '). remove Suffix (". class ") Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclasspath . walk Top Down (). filter Ġ{ Ġit . extension Ġ== Ġ" class " Ġ}. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . relative To ( classpath ). path . replace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ'/', ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ'.' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). replace ('\\ ', Ġ'. '). remove Suffix (". class ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toList () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġadd ( source : ĠFile , Ġtarget : ĠJar OutputStream , Ġbase : ĠFile Ġ= Ġsource ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrelative Path Ġ= Ġsource . relative To ( base ). in variant Separ ators Path ĊĠĠĠĠĠĠĠ Ġif Ġ( source . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġname Ġ= Ġrelative Path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! name . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! name . endsWith ("/ ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ+= Ġ"/" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= ĠJar Entry ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry . time Ġ= Ġsource . lastModified () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget . put Next Entry ( entry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget . close Entry () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource . list Files () !!. forEach Ġ{ Ġnested File Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( nested File , Ġtarget , Ġbase ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= ĠJar Entry ( relative Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentry . time Ġ= Ġsource . lastModified () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget . put Next Entry ( entry ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuffered InputStream ( FileInputStream ( source )). copy To ( target ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget . close Entry () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ }