diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4048d09a..11c1e6f6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,6 +32,10 @@ jobs: java: 11 distribution: temurin jobtype: sbt-1 + - os: windows-latest + java: 17 + distribution: temurin + jobtype: sbt-2 env: # define Java options for both official sbt and sbt-extras JAVA_OPTS: -Xms2048M -Xmx2048M -Xss6M -XX:ReservedCodeCacheSize=256M -Dfile.encoding=UTF-8 diff --git a/src/main/scala/sbtassembly/Assembly.scala b/src/main/scala/sbtassembly/Assembly.scala index 89ef0c99..af95005d 100644 --- a/src/main/scala/sbtassembly/Assembly.scala +++ b/src/main/scala/sbtassembly/Assembly.scala @@ -266,9 +266,12 @@ object Assembly { classByParentDir .flatMap { case (parentDir, file) => val originalTarget = parentDir.relativize(file).toString - classShader(originalTarget, () => new BufferedInputStream(new FileInputStream(file.toFile()))) + val sanitizedTarget = + if (originalTarget.contains('\\')) originalTarget.replace('\\', '/') + else originalTarget + classShader(sanitizedTarget, () => new BufferedInputStream(new FileInputStream(file.toFile()))) .map { case (shadedName, stream) => - Project(targetJarName, originalTarget, shadedName, stream) + Project(targetJarName, sanitizedTarget, shadedName, stream) } } } @@ -285,7 +288,8 @@ object Assembly { log ) val (jarFiles, jarFileEntries) = timed(Level.Debug, "Collect and shade dependency entries") { - filteredJars.par.map { jar => + val (externalJars, projectJars) = filteredJars.partition(externalDeps.contains) + (projectJars ++ externalJars).par.map { jar => val module = jar.metadata .get(moduleIDStr) .map(parseModuleIDStrAttribute) @@ -705,8 +709,7 @@ object PathList { private val sysFileSep = "/" def unapplySeq(path: String): Option[Seq[String]] = { - val sanitizedPath = if (path.contains('\\')) path.replace('\\', '/') else path - val split = sanitizedPath.split(sysFileSep) + val split = path.split(sysFileSep) if (split.isEmpty) Option.empty else Option(split.toList) } diff --git a/src/sbt-test/merging/merging/build.sbt b/src/sbt-test/merging/merging/build.sbt index 157e9423..2f8680c7 100644 --- a/src/sbt-test/merging/merging/build.sbt +++ b/src/sbt-test/merging/merging/build.sbt @@ -13,12 +13,15 @@ assemblyMergeStrategy := { oldStrategy(x) } name := "foo" -exportJars := true lazy val testmerge = (project in file(".")) .settings( assembly / assemblyJarName := "foo.jar", TaskKey[Unit]("check") := { + val s = streams.value + val projectAsJar = exportJars.value + val renameSuffix = if (projectAsJar) "foo-0.1" else "foo" + s.log.info(s"Checking with exportJars=$projectAsJar") IO.withTemporaryDirectory { dir => IO.unzip(crossTarget.value / "foo.jar", dir) mustContain(dir / "a", Seq("1", "2", "1", "3")) @@ -27,9 +30,9 @@ lazy val testmerge = (project in file(".")) mustContain(dir / "d", Seq("1", "2", "3")) mustContain(dir / "e", Seq("1")) mustNotExist(dir / "f") - mustContain(dir / "README_foo-0.1", Seq("resources")) + mustContain(dir / s"README_$renameSuffix", Seq("resources")) mustContain(dir / "README_1", Seq("1")) - mustContain(dir / "LICENSE_foo-0.1", Seq("resources")) + mustContain(dir / s"LICENSE_$renameSuffix", Seq("resources")) mustContain(dir / "LICENSE" / "a", Seq("1")) // 80f5a06 -- don't rename License.class mustExist(dir / "com" / "example" / "License.class") @@ -41,6 +44,7 @@ lazy val testmerge = (project in file(".")) mustExist(dir / "com" / "example" / "license" / "PublicDomain.class") mustExist(dir / "NOTICE" / "README_3.txt") mustExist(dir / "NOTICE" / "LICENSE_3.txt") + mustContain(dir / "META-INF" / "services" / "srv", Seq("local", "jar1", "jar2")) } }) diff --git a/src/sbt-test/merging/merging/lib/1.jar b/src/sbt-test/merging/merging/lib/1.jar index a00e3434..036e7610 100644 Binary files a/src/sbt-test/merging/merging/lib/1.jar and b/src/sbt-test/merging/merging/lib/1.jar differ diff --git a/src/sbt-test/merging/merging/lib/2.jar b/src/sbt-test/merging/merging/lib/2.jar index 117dbd82..63468d03 100644 Binary files a/src/sbt-test/merging/merging/lib/2.jar and b/src/sbt-test/merging/merging/lib/2.jar differ diff --git a/src/sbt-test/merging/merging/lib/3.jar b/src/sbt-test/merging/merging/lib/3.jar index a03e1ca1..eb5d3a9b 100644 Binary files a/src/sbt-test/merging/merging/lib/3.jar and b/src/sbt-test/merging/merging/lib/3.jar differ diff --git a/src/sbt-test/merging/merging/src/main/1/META-INF/services/srv b/src/sbt-test/merging/merging/src/main/1/META-INF/services/srv new file mode 100644 index 00000000..f0d332ea --- /dev/null +++ b/src/sbt-test/merging/merging/src/main/1/META-INF/services/srv @@ -0,0 +1 @@ +jar1 diff --git a/src/sbt-test/merging/merging/src/main/2/META-INF/services/srv b/src/sbt-test/merging/merging/src/main/2/META-INF/services/srv new file mode 100644 index 00000000..be67a056 --- /dev/null +++ b/src/sbt-test/merging/merging/src/main/2/META-INF/services/srv @@ -0,0 +1 @@ +jar2 diff --git a/src/sbt-test/merging/merging/src/main/resources/META-INF/services/srv b/src/sbt-test/merging/merging/src/main/resources/META-INF/services/srv new file mode 100644 index 00000000..40830374 --- /dev/null +++ b/src/sbt-test/merging/merging/src/main/resources/META-INF/services/srv @@ -0,0 +1 @@ +local diff --git a/src/sbt-test/merging/merging/test b/src/sbt-test/merging/merging/test index ceec1be2..7ae39cc9 100644 --- a/src/sbt-test/merging/merging/test +++ b/src/sbt-test/merging/merging/test @@ -1,6 +1,11 @@ -# check if the file gets created +> clean +> set ThisBuild / exportJars := false > assembly $ exists target/**/foo.jar +> check -# check if it says hello +> clean +> set ThisBuild / exportJars := true +> assembly +$ exists target/**/foo.jar > check