1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
package forge.modules
import java.io.FileOutputStream
import java.util.jar.{JarEntry, JarOutputStream}
import ammonite.ops._
import forge.define.Task
import forge.eval.PathRef
import forge.util.Args
object Jvm {
def subprocess(mainClass: String,
classPath: Seq[Path]) = {
import ammonite.ops.ImplicitWd._
%("java", "-cp", classPath.mkString(":"), mainClass)
}
private def createManifest(mainClass: Option[String]) = {
val m = new java.util.jar.Manifest()
m.getMainAttributes.put(java.util.jar.Attributes.Name.MANIFEST_VERSION, "1.0")
m.getMainAttributes.putValue( "Created-By", "Scala Forge" )
mainClass.foreach(
m.getMainAttributes.put(java.util.jar.Attributes.Name.MAIN_CLASS, _)
)
m
}
def createJar(outputPath: Path, inputPaths: Seq[Path], mainClass: Option[String] = None): Option[Path] = {
rm(outputPath)
if(inputPaths.isEmpty) None
else {
mkdir(outputPath/up)
val jar = new JarOutputStream(
new FileOutputStream(outputPath.toIO),
createManifest(mainClass)
)
try{
assert(inputPaths.forall(exists(_)))
for{
p <- inputPaths
(file, mapping) <-
if (p.isFile) Iterator(p -> empty/p.last)
else ls.rec(p).filter(_.isFile).map(sub => sub -> sub.relativeTo(p))
} {
val entry = new JarEntry(mapping.toString)
entry.setTime(file.mtime.toMillis)
jar.putNextEntry(entry)
jar.write(read.bytes(file))
jar.closeEntry()
}
} finally {
jar.close()
}
Some(outputPath)
}
}
case class jarUp(roots: Task[PathRef]*) extends Task[PathRef]{
val inputs = roots
def evaluate(args: Args): PathRef = {
createJar(args.dest, args.args.map(_.asInstanceOf[PathRef].path))
PathRef(args.dest)
}
}
}
|