From dc2e4996f4edeb01ad5409ec02a52a5609896fc5 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Mon, 12 Mar 2018 11:18:19 +0100 Subject: [PATCH] Require Java 8 from now on --- appveyor.yml | 1 + cache/jvm/src/main/scala/coursier/Cache.scala | 22 ++-- .../scala/coursier/internal/FileUtil.scala | 59 +--------- .../src/main/scala/coursier/util/Base64.scala | 106 ------------------ .../scala-2.12/coursier/cli/Bootstrap.scala | 5 +- .../coursier/cli/SparkOutputHelper.scala | 3 +- .../coursier/cli/spark/Assembly.scala | 8 +- .../cli/CliBootstrapIntegrationTest.scala | 3 +- project/Settings.scala | 37 ++---- .../src/main/scala/coursier/IvyXml.scala | 4 +- .../scala/coursier/ResolutionException.scala | 10 +- scripts/travis.sh | 54 --------- .../src/test/scala/coursier/Platform.scala | 4 +- .../scala/coursier/test/CacheFetchTests.scala | 5 +- .../coursier/test/compatibility/package.scala | 6 +- 15 files changed, 50 insertions(+), 277 deletions(-) delete mode 100644 cache/jvm/src/main/scala/coursier/util/Base64.scala diff --git a/appveyor.yml b/appveyor.yml index 9f42b8bc7..46ccd8193 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -11,6 +11,7 @@ install: ) [System.IO.Compression.ZipFile]::ExtractToDirectory("C:\sbt-bin.zip", "C:\sbt") } + - cmd: SET JAVA_HOME=C:\Program Files\Java\jdk1.8.0 - cmd: SET PATH=C:\sbt\sbt\bin;%JAVA_HOME%\bin;%PATH% - cmd: SET SBT_OPTS=-XX:MaxPermSize=2g -Xmx4g - git submodule update --init --recursive diff --git a/cache/jvm/src/main/scala/coursier/Cache.scala b/cache/jvm/src/main/scala/coursier/Cache.scala index d8c4a47f0..005718682 100644 --- a/cache/jvm/src/main/scala/coursier/Cache.scala +++ b/cache/jvm/src/main/scala/coursier/Cache.scala @@ -10,11 +10,12 @@ import java.util.regex.Pattern import coursier.core.Authentication import coursier.ivy.IvyRepository import coursier.internal.FileUtil -import coursier.util.Base64.Encoder import scala.annotation.tailrec import java.io.{Serializable => _, _} -import java.nio.charset.Charset +import java.nio.charset.StandardCharsets.UTF_8 +import java.nio.file.{Files, StandardCopyOption} +import java.util.Base64 import coursier.util.{EitherT, Schedulable} @@ -34,9 +35,6 @@ object Cache { } } - // java.nio.charset.StandardCharsets.UTF_8 not available in Java 6 - private val UTF_8 = Charset.forName("UTF-8") - // Check SHA-1 if available, else be fine with no checksum val defaultChecksums = Seq(Some("SHA-1"), None) @@ -268,7 +266,9 @@ object Cache { ).r private def basicAuthenticationEncode(user: String, password: String): String = - (user + ":" + password).getBytes(UTF_8).toBase64 + Base64.getEncoder.encodeToString( + s"$user:$password".getBytes(UTF_8) + ) /** * Returns a `java.net.URL` for `s`, possibly using the custom protocol handlers found under the @@ -334,9 +334,8 @@ object Cache { var success = false try { c.setRequestMethod("HEAD") - val len = Some(c.getContentLength) // TODO Use getContentLengthLong when switching to Java >= 7 - .filter(_ >= 0) - .map(_.toLong) + val len = Some(c.getContentLengthLong) + .filter(_ >= 0L) // TODO 404 Not found could be checked here @@ -581,8 +580,7 @@ object Cache { else if (responseCode(conn) == Some(401)) Left(FileError.Unauthorized(url, realm = realm(conn))) else { - // TODO Use the safer getContentLengthLong when switching back to Java >= 7 - for (len0 <- Option(conn.getContentLength) if len0 >= 0L) { + for (len0 <- Option(conn.getContentLengthLong) if len0 >= 0L) { val len = len0 + (if (partialDownload) alreadyDownloaded else 0L) logger.foreach(_.downloadLength(url, len, alreadyDownloaded, watching = false)) } @@ -601,7 +599,7 @@ object Cache { withStructureLock(cache) { file.getParentFile.mkdirs() - FileUtil.atomicMove(tmp, file) + Files.move(tmp.toPath, file.toPath, StandardCopyOption.ATOMIC_MOVE) } for (lastModified <- Option(conn.getLastModified) if lastModified > 0L) diff --git a/cache/jvm/src/main/scala/coursier/internal/FileUtil.scala b/cache/jvm/src/main/scala/coursier/internal/FileUtil.scala index 5a6970101..1ad5f4d1f 100644 --- a/cache/jvm/src/main/scala/coursier/internal/FileUtil.scala +++ b/cache/jvm/src/main/scala/coursier/internal/FileUtil.scala @@ -1,60 +1,10 @@ package coursier.internal -import java.io._ -import java.util.UUID +import java.io.{ByteArrayOutputStream, File, FileInputStream, FileOutputStream, InputStream} +import java.nio.file.Files -/** Java 6-compatible helpers mimicking NIO */ object FileUtil { - private object Java7 { - - import java.nio.file.{ Files, StandardCopyOption } - - def atomicMove(from: File, to: File): Unit = - Files.move(from.toPath, to.toPath, StandardCopyOption.ATOMIC_MOVE) - - def createTempDirectory(prefix: String): File = - Files.createTempDirectory(prefix).toFile - } - - private object Java6 { - def move(from: File, to: File): Unit = - if (!from.renameTo(to)) - throw new IOException(s"Cannot move $from to $to") - - def createTempDirectory(prefix: String): File = { - val tmpBaseDir = new File(sys.props("java.io.tmpdir")) - val tmpDir = new File(tmpBaseDir, s"$prefix-${UUID.randomUUID()}") - tmpDir.mkdirs() - tmpDir - } - } - - private def versionGteq(version: String, to: (Int, Int)): Boolean = - version.split('.').take(2).map(s => scala.util.Try(s.toInt).toOption) match { - case Array(Some(major), Some(minor)) => - Ordering[(Int, Int)].gteq((major, minor), (1, 7)) - case _ => false - } - - // Fine if set several times (if java7Available() is initially called concurrently) - @volatile private var java7AvailableOpt = Option.empty[Boolean] - private def java7Available(): Boolean = - java7AvailableOpt.getOrElse { - val available = sys.props.get("java.version").exists { version => - versionGteq(version, (1, 7)) - } - java7AvailableOpt = Some(available) - available - } - - /** Not guaranteed to be atomic on Java 6 */ - def atomicMove(from: File, to: File): Unit = - if (java7Available()) - Java7.atomicMove(from, to) - else - Java6.move(from, to) - def write(file: File, bytes: Array[Byte]): Unit = { var fos: FileOutputStream = null try { @@ -93,9 +43,6 @@ object FileUtil { } def createTempDirectory(prefix: String): File = - if (java7Available()) - Java7.createTempDirectory(prefix) - else - Java6.createTempDirectory(prefix) + Files.createTempDirectory(prefix).toFile } \ No newline at end of file diff --git a/cache/jvm/src/main/scala/coursier/util/Base64.scala b/cache/jvm/src/main/scala/coursier/util/Base64.scala deleted file mode 100644 index 58cf0c888..000000000 --- a/cache/jvm/src/main/scala/coursier/util/Base64.scala +++ /dev/null @@ -1,106 +0,0 @@ -package coursier.util - -import scala.collection.mutable.ArrayBuilder - -/** - * Base64 encoder - * @author Mark Lister - * This software is distributed under the 2-Clause BSD license. See the - * LICENSE file in the root of the repository. - * - * Copyright (c) 2014 - 2015 Mark Lister - * - * The repo for this Base64 encoder lives at https://github.com/marklister/base64 - * Please send your issues, suggestions and pull requests there. - */ - -object Base64 { - - final case class B64Scheme(encodeTable: Array[Char], strictPadding: Boolean = true, - postEncode: String => String = identity, - preDecode: String => String = identity) { - lazy val decodeTable = { - val b: Array[Int] = new Array[Int](256) - for (x <- encodeTable.zipWithIndex) { - b(x._1) = x._2.toInt - } - b - } - } - - val base64 = new B64Scheme((('A' to 'Z') ++ ('a' to 'z') ++ ('0' to '9') ++ Seq('+', '/')).toArray) - val base64Url = new B64Scheme(base64.encodeTable.dropRight(2) ++ Seq('-', '_'), false, - _.replaceAllLiterally("=", "%3D"), - _.replaceAllLiterally("%3D", "=")) - - implicit class SeqEncoder(s: Seq[Byte]) { - def toBase64(implicit scheme: B64Scheme = base64): String = Encoder(s.toArray).toBase64 - } - - implicit class Encoder(b: Array[Byte]) { - val r = new StringBuilder((b.length + 3) * 4 / 3) - lazy val pad = (3 - b.length % 3) % 3 - - def toBase64(implicit scheme: B64Scheme = base64): String = { - def sixBits(x: Byte, y: Byte, z: Byte): Unit = { - val zz = (x & 0xff) << 16 | (y & 0xff) << 8 | (z & 0xff) - r += scheme.encodeTable(zz >> 18) - r += scheme.encodeTable(zz >> 12 & 0x3f) - r += scheme.encodeTable(zz >> 6 & 0x3f) - r += scheme.encodeTable(zz & 0x3f) - } - for (p <- 0 until b.length - 2 by 3) { - sixBits(b(p), b(p + 1), b(p + 2)) - } - pad match { - case 0 => - case 1 => sixBits(b(b.length - 2), b(b.length - 1), 0) - case 2 => sixBits(b(b.length - 1), 0, 0) - } - r.length = (r.length - pad) - r ++= "=" * pad - scheme.postEncode(r.toString()) - } - } - - implicit class Decoder(s: String) { - - def toByteArray(implicit scheme: B64Scheme = base64): Array[Byte] = { - val pre = scheme.preDecode(s) - val cleanS = pre.replaceAll("=+$", "") - val pad = pre.length - cleanS.length - val computedPad = (4 - (cleanS.length % 4)) % 4 - val r = new ArrayBuilder.ofByte - - def threeBytes(a: Int, b: Int, c: Int, d: Int): Unit = { - val i = a << 18 | b << 12 | c << 6 | d - r += ((i >> 16).toByte) - r += ((i >> 8).toByte) - r += (i.toByte) - } - if (scheme.strictPadding) { - if (pad > 2) throw new java.lang.IllegalArgumentException("Invalid Base64 String: (excessive padding) " + s) - if (s.length % 4 != 0) throw new java.lang.IllegalArgumentException("Invalid Base64 String: (padding problem) " + s) - } - if (computedPad == 3) throw new java.lang.IllegalArgumentException("Invalid Base64 String: (string length) " + s) - try { - val s = (cleanS + "A" * computedPad) - for (x <- 0 until s.length - 1 by 4) { - val i = scheme.decodeTable(s.charAt(x)) << 18 | - scheme.decodeTable(s.charAt(x + 1)) << 12 | - scheme.decodeTable(s.charAt(x + 2)) << 6 | - scheme.decodeTable(s.charAt(x + 3)) - r += ((i >> 16).toByte) - r += ((i >> 8).toByte) - r += (i.toByte) - } - } catch { - case e: NoSuchElementException => throw new java.lang.IllegalArgumentException("Invalid Base64 String: (invalid character)" + e.getMessage + s) - } - val res = r.result - res.slice(0, res.length - computedPad) - } - - } - -} diff --git a/cli/src/main/scala-2.12/coursier/cli/Bootstrap.scala b/cli/src/main/scala-2.12/coursier/cli/Bootstrap.scala index 5b1b7dac7..a130b752d 100644 --- a/cli/src/main/scala-2.12/coursier/cli/Bootstrap.scala +++ b/cli/src/main/scala-2.12/coursier/cli/Bootstrap.scala @@ -2,6 +2,7 @@ package coursier package cli import java.io.{ByteArrayInputStream, ByteArrayOutputStream, File, FileInputStream, IOException} +import java.nio.charset.StandardCharsets.UTF_8 import java.nio.file.Files import java.nio.file.attribute.PosixFilePermission import java.util.Properties @@ -156,7 +157,7 @@ object Bootstrap extends CaseApp[BootstrapOptions] { entry.setTime(time) outputZip.putNextEntry(entry) - outputZip.write(content.getBytes("UTF-8")) + outputZip.write(content.getBytes(UTF_8)) outputZip.closeEntry() } @@ -207,7 +208,7 @@ object Bootstrap extends CaseApp[BootstrapOptions] { "exec java -jar " + options.options.javaOpt.map(s => "'" + s.replace("'", "\\'") + "'").mkString(" ") + " \"$0\" \"$@\"" ).mkString("", "\n", "\n") - try FileUtil.write(output0, shellPreamble.getBytes("UTF-8") ++ buffer.toByteArray) + try FileUtil.write(output0, shellPreamble.getBytes(UTF_8) ++ buffer.toByteArray) catch { case e: IOException => Console.err.println(s"Error while writing $output0${Option(e.getMessage).fold("")(" (" + _ + ")")}") sys.exit(1) diff --git a/cli/src/main/scala-2.12/coursier/cli/SparkOutputHelper.scala b/cli/src/main/scala-2.12/coursier/cli/SparkOutputHelper.scala index 291364499..3bfa043a2 100644 --- a/cli/src/main/scala-2.12/coursier/cli/SparkOutputHelper.scala +++ b/cli/src/main/scala-2.12/coursier/cli/SparkOutputHelper.scala @@ -1,6 +1,7 @@ package coursier.cli import java.io.{BufferedReader, File, InputStream, InputStreamReader, PipedInputStream, PipedOutputStream, PrintStream} +import java.nio.charset.StandardCharsets.UTF_8 import coursier.internal.FileUtil @@ -55,7 +56,7 @@ object SparkOutputHelper { if (!written) { println(s"Detected YARN app ID $id") Option(yarnAppFile.getParentFile).foreach(_.mkdirs()) - FileUtil.write(yarnAppFile, id.getBytes("UTF-8")) + FileUtil.write(yarnAppFile, id.getBytes(UTF_8)) written = true } } diff --git a/cli/src/main/scala-2.12/coursier/cli/spark/Assembly.scala b/cli/src/main/scala-2.12/coursier/cli/spark/Assembly.scala index 0c0ed04bc..ed2c01ad5 100644 --- a/cli/src/main/scala-2.12/coursier/cli/spark/Assembly.scala +++ b/cli/src/main/scala-2.12/coursier/cli/spark/Assembly.scala @@ -2,6 +2,8 @@ package coursier.cli.spark import java.io.{File, FileInputStream, FileOutputStream} import java.math.BigInteger +import java.nio.charset.StandardCharsets.UTF_8 +import java.nio.file.{Files, StandardCopyOption} import java.security.MessageDigest import java.util.jar.{Attributes, JarFile, JarOutputStream, Manifest} import java.util.regex.Pattern @@ -207,7 +209,7 @@ object Assembly { extraDependencies: Seq[String], options: CommonOptions, artifactTypes: Set[String], - checksumSeed: Array[Byte] = "v1".getBytes("UTF-8") + checksumSeed: Array[Byte] = "v1".getBytes(UTF_8) ): Either[String, (File, Seq[File])] = { val helper = sparkJarsHelper(scalaVersion, sparkVersion, yarnVersion, default, extraDependencies, options) @@ -240,7 +242,7 @@ object Assembly { md.update(checksumSeed) for (c <- checksums.sorted) { - val b = c.getBytes("UTF-8") + val b = c.getBytes(UTF_8) md.update(b, 0, b.length) } @@ -271,7 +273,7 @@ object Assembly { val tmpDest = new File(dest.getParentFile, s".${dest.getName}.part") // FIXME Acquire lock on tmpDest Assembly.make(jars, tmpDest, assemblyRules) - FileUtil.atomicMove(tmpDest, dest) + Files.move(tmpDest.toPath, dest.toPath, StandardCopyOption.ATOMIC_MOVE) Right((dest, jars)) }.left.map(_.describe) } diff --git a/cli/src/test/scala-2.12/coursier/cli/CliBootstrapIntegrationTest.scala b/cli/src/test/scala-2.12/coursier/cli/CliBootstrapIntegrationTest.scala index 8f6dce705..114aec9c8 100644 --- a/cli/src/test/scala-2.12/coursier/cli/CliBootstrapIntegrationTest.scala +++ b/cli/src/test/scala-2.12/coursier/cli/CliBootstrapIntegrationTest.scala @@ -1,6 +1,7 @@ package coursier.cli import java.io._ +import java.nio.charset.StandardCharsets.UTF_8 import java.util.zip.ZipInputStream import caseapp.core.RemainingArgs @@ -69,7 +70,7 @@ class CliBootstrapIntegrationTest extends FlatSpec with CliTestLib { val zis = new ZipInputStream(new ByteArrayInputStream(actualContent)) - val lines = new String(zipEntryContent(zis, "bootstrap-isolation-foo-jar-urls"), "UTF-8").lines.toVector + val lines = new String(zipEntryContent(zis, "bootstrap-isolation-foo-jar-urls"), UTF_8).lines.toVector val extensions = lines .map { l => diff --git a/project/Settings.scala b/project/Settings.scala index 27baf753d..f3bf9985d 100644 --- a/project/Settings.scala +++ b/project/Settings.scala @@ -31,32 +31,17 @@ object Settings { scalazBintrayRepository, sonatypeRepository("releases"), crossScalaVersions := Seq(scala212, scala211, scala210), // defined for all projects to trump sbt-doge - scalacOptions ++= { - val targetJvm = scalaBinaryVersion.value match { - case "2.10" | "2.11" => - Seq("-target:jvm-1.6") - case _ => - Seq() - } - - targetJvm ++ Seq( - "-feature", - "-deprecation", - "-language:higherKinds", - "-language:implicitConversions" - ) - }, - javacOptions ++= { - scalaBinaryVersion.value match { - case "2.10" | "2.11" => - Seq( - "-source", "1.6", - "-target", "1.6" - ) - case _ => - Seq() - } - }, + scalacOptions ++= Seq( + "-target:jvm-1.8", + "-feature", + "-deprecation", + "-language:higherKinds", + "-language:implicitConversions" + ), + javacOptions ++= Seq( + "-source", "1.8", + "-target", "1.8" + ), javacOptions.in(Keys.doc) := Seq() ) diff --git a/sbt-coursier/src/main/scala/coursier/IvyXml.scala b/sbt-coursier/src/main/scala/coursier/IvyXml.scala index 7a4140f75..3b4f72a03 100644 --- a/sbt-coursier/src/main/scala/coursier/IvyXml.scala +++ b/sbt-coursier/src/main/scala/coursier/IvyXml.scala @@ -1,5 +1,7 @@ package coursier +import java.nio.charset.StandardCharsets.UTF_8 + import coursier.internal.FileUtil import org.apache.ivy.core.module.id.ModuleRevisionId @@ -52,7 +54,7 @@ object IvyXml { val content0 = rawContent(currentProject, shadedConfigOpt) cacheIvyFile.getParentFile.mkdirs() log.info(s"Writing Ivy file $cacheIvyFile") - FileUtil.write(cacheIvyFile, content0.getBytes("UTF-8")) + FileUtil.write(cacheIvyFile, content0.getBytes(UTF_8)) // Just writing an empty file here... Are these only used? cacheIvyPropertiesFile.getParentFile.mkdirs() diff --git a/sbt-coursier/src/main/scala/coursier/ResolutionException.scala b/sbt-coursier/src/main/scala/coursier/ResolutionException.scala index f083c0ea3..9f8925a91 100644 --- a/sbt-coursier/src/main/scala/coursier/ResolutionException.scala +++ b/sbt-coursier/src/main/scala/coursier/ResolutionException.scala @@ -4,9 +4,7 @@ final class ResolutionException( val error: ResolutionError ) extends Exception( error.message, - error.cause.orNull -) { - // not using the 4-arg Exception constructor, only available with Java >= 7 - - setStackTrace(Array()) // don't keep stack trace around (improves readability from the SBT console) -} + error.cause.orNull, + true, + false // don't keep stack trace around (improves readability from the SBT console) +) diff --git a/scripts/travis.sh b/scripts/travis.sh index 3d68480e8..ef36001ef 100755 --- a/scripts/travis.sh +++ b/scripts/travis.sh @@ -134,52 +134,6 @@ checkBinaryCompatibility() { sbt ++${SCALA_VERSION} coreJVM/mimaReportBinaryIssues cacheJVM/mimaReportBinaryIssues } -testSbtCoursierJava6() { - sbt ++${SCALA_VERSION} coreJVM/publishLocal cache/publishLocal extra/publishLocal sbt-coursier/publishLocal - - git clone https://github.com/alexarchambault/scalacheck-shapeless.git - cd scalacheck-shapeless - git checkout e11ec8b2b069ee598b20ae3f3ad6e00f5edfd7ac - cd project - clean_plugin_sbt - cd project - clean_plugin_sbt - cd ../.. - docker run -it --rm \ - -v $HOME/.ivy2/local:/root/.ivy2/local \ - -v $(pwd):/root/project \ - -v $(pwd)/../bin:/root/bin \ - -e CI=true \ - openjdk:6-jre \ - /bin/bash -c "cd /root/project && /root/bin/sbt update" - cd .. - - # ensuring resolution error doesn't throw NoSuchMethodError - mkdir -p foo/project - cd foo - echo 'libraryDependencies += "foo" % "bar" % "1.0"' >> build.sbt - echo 'addSbtPlugin("io.get-coursier" % "sbt-coursier" % "'"$VERSION"'")' >> project/plugins.sbt - echo 'sbt.version=0.13.15' >> project/build.properties - docker run -it --rm \ - -v $HOME/.ivy2/local:/root/.ivy2/local \ - -v $(pwd):/root/project \ - -v $(pwd)/../bin:/root/bin \ - -e CI=true \ - openjdk:6-jre \ - /bin/bash -c "cd /root/project && /root/bin/sbt update || true" | tee -a output - grep "coursier.ResolutionException: Encountered 1 error" output - echo "Ok, found ResolutionException in output" - cd .. -} - -clean_plugin_sbt() { - mv plugins.sbt plugins.sbt0 - grep -v coursier plugins.sbt0 > plugins.sbt || true - echo ' -addSbtPlugin("io.get-coursier" % "sbt-coursier" % "'"$VERSION"'") - ' >> plugins.sbt -} - publish() { sbt ++${SCALA_VERSION} publish } @@ -231,10 +185,6 @@ else if is210 || is212; then runSbtCoursierTests fi - - if is210; then - testSbtCoursierJava6 - fi elif sbtShading; then if is210 || is212; then runSbtShadingTests @@ -250,10 +200,6 @@ else validateReadme checkBinaryCompatibility fi - - # Not using a jdk6 matrix entry with Travis as some sources of coursier require Java 7 to compile - # (even though it won't try to call Java 7 specific methods if it detects it runs under Java 6). - # The tests here check that coursier is nonetheless fine when run under Java 6. fi diff --git a/tests/jvm/src/test/scala/coursier/Platform.scala b/tests/jvm/src/test/scala/coursier/Platform.scala index dcfd3219a..a53b2c3df 100644 --- a/tests/jvm/src/test/scala/coursier/Platform.scala +++ b/tests/jvm/src/test/scala/coursier/Platform.scala @@ -1,7 +1,7 @@ package coursier import java.io._ -import java.nio.charset.Charset +import java.nio.charset.StandardCharsets.UTF_8 import coursier.interop.scalaz._ import coursier.util.EitherT @@ -25,8 +25,6 @@ object Platform { buffer.toByteArray } - private lazy val UTF_8 = Charset.forName("UTF-8") - def readFully(is: => InputStream): Task[Either[String, String]] = Task { val t = Try { diff --git a/tests/jvm/src/test/scala/coursier/test/CacheFetchTests.scala b/tests/jvm/src/test/scala/coursier/test/CacheFetchTests.scala index ca6fe0f57..21f4b3aeb 100644 --- a/tests/jvm/src/test/scala/coursier/test/CacheFetchTests.scala +++ b/tests/jvm/src/test/scala/coursier/test/CacheFetchTests.scala @@ -2,11 +2,10 @@ package coursier package test import java.io.File +import java.nio.file.Files import coursier.cache.protocol.TestprotocolHandler -import coursier.internal.FileUtil import coursier.interop.scalaz._ - import utest._ import scala.util.Try @@ -15,7 +14,7 @@ object CacheFetchTests extends TestSuite { def check(extraRepo: Repository): Unit = { - val tmpDir = FileUtil.createTempDirectory("coursier-cache-fetch-tests") + val tmpDir = Files.createTempDirectory("coursier-cache-fetch-tests").toFile def cleanTmpDir() = { def delete(f: File): Boolean = diff --git a/tests/jvm/src/test/scala/coursier/test/compatibility/package.scala b/tests/jvm/src/test/scala/coursier/test/compatibility/package.scala index 11e2ab0cc..567505275 100644 --- a/tests/jvm/src/test/scala/coursier/test/compatibility/package.scala +++ b/tests/jvm/src/test/scala/coursier/test/compatibility/package.scala @@ -1,6 +1,6 @@ package coursier.test -import java.nio.charset.StandardCharsets +import java.nio.charset.StandardCharsets.UTF_8 import java.nio.file.{Files, Paths} import coursier.interop.scalaz._ @@ -24,7 +24,7 @@ package object compatibility { } val is = res.openStream() - new String(Platform.readFullySync(is), "UTF-8") + new String(Platform.readFullySync(is), UTF_8) } private val baseRepo = { @@ -81,7 +81,7 @@ package object compatibility { if (fillChunks) { val path0 = baseResources.resolve(path) Files.createDirectories(path0.getParent) - Files.write(path0, content.getBytes(StandardCharsets.UTF_8)) + Files.write(path0, content.getBytes(UTF_8)) } }