Skip to content

Instantly share code, notes, and snippets.

@colestanfield
Created August 8, 2014 22:55
Show Gist options
  • Select an option

  • Save colestanfield/fac042d3108b0c06e952 to your computer and use it in GitHub Desktop.

Select an option

Save colestanfield/fac042d3108b0c06e952 to your computer and use it in GitHub Desktop.

Revisions

  1. colestanfield created this gist Aug 8, 2014.
    35 changes: 35 additions & 0 deletions gistfile1.scala
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,35 @@

    // Create a new MergeStrategy for aop.xml files
    val aopMerge: MergeStrategy = new MergeStrategy {
    val name = "aopMerge"
    import scala.xml._
    import scala.xml.dtd._

    def apply(tempDir: File, path: String, files: Seq[File]): Either[String, Seq[(File, String)]] = {
    val dt = DocType("aspectj", PublicID("-//AspectJ//DTD//EN", "http://www.eclipse.org/aspectj/dtd/aspectj.dtd"), Nil)
    val file = MergeStrategy.createMergeTarget(tempDir, path)
    val xmls: Seq[Elem] = files.map(XML.loadFile)
    val aspectsChildren: Seq[Node] = xmls.flatMap(_ \\ "aspectj" \ "aspects" \ "_")
    val weaverChildren: Seq[Node] = xmls.flatMap(_ \\ "aspectj" \ "weaver" \ "_")
    val options: String = xmls.map(x => (x \\ "aspectj" \ "weaver" \ "@options").text).mkString(" ").trim
    val weaverAttr = if (options.isEmpty) Null else new UnprefixedAttribute("options", options, Null)
    val aspects = new Elem(null, "aspects", Null, TopScope, false, aspectsChildren: _*)
    val weaver = new Elem(null, "weaver", weaverAttr, TopScope, false, weaverChildren: _*)
    val aspectj = new Elem(null, "aspectj", Null, TopScope, false, aspects, weaver)
    XML.save(file.toString, aspectj, "UTF-8", xmlDecl = false, dt)
    IO.append(file, IO.Newline.getBytes(IO.defaultCharset))
    Right(Seq(file -> path))
    }
    }

    // Use defaultMergeStrategy with a case for aop.xml
    // I like this better than the inline version mentioned in assembly's README
    val customMergeStrategy: String => MergeStrategy = {
    case PathList("META-INF", "aop.xml") =>
    aopMerge
    case s =>
    defaultMergeStrategy(s)
    }

    // Use the customMergeStrategy in your settings
    mergeStrategy in assembly := customMergeStrategy