diff --git a/.travis.yml b/.travis.yml index ff66ab86a..746c7cac9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,8 @@ -language: scala +version: ~> 1.0 # needed for imports + +import: scala/scala-dev:travis/default.yml -jdk: - - openjdk8 - - openjdk11 +language: scala scala: - 2.11.12 @@ -10,40 +10,19 @@ scala: - 2.13.1 env: - global: - # PGP_PASSPHRASE - - secure: "BYC1kEnHjNrINrHYWPGEuTTJ2V340/0ByzqeihLecjoZ75yrjWdsh6MI1JEUWgv5kb+58vLzib21JfnjsPK6Yb2bSXuCFCsEtJNh6RJKgxkWlCOzfTSh5I2wl7PCjRClRL6gseX2uTSvFjL4Z//pmxwxeXlLp7voQe4QAUq1+sE=" - # SONA_USER - - secure: "OpBwPc1GNvauageYOH3RscAa7wpZxgpmqDz15aigIKLNWzAhAtVUx0MleZ8rQeoqml6nrAvlnzuVHjKL2lVcjMPpjUis7bcQ5UAGK7tZK8x+qZNQxXmpXu8+pENwQA2yFaqt/xy7K5jFOrHJHTRxcPnyVG1yKakPWz53PPYUwbc=" - # SONA_PASS - - secure: "Xw7rI/qlML1nD2e2XwlakkhKAWNGZKqqE+Q3ntTvFpfHryl7KLCvVzJ4LIavnL6kGJaWOgy9vlSoEWn5g9nqHSfE31C/k5pY5nTMAKiwiJzfAS+r0asKXW2gmKhwtcTBkqyLVOZLCJSPVlFRQyfBJHY+Fs0L3KWcnMQgtBlyDhU=" - matrix: - # The empty SCALAJS_VERSION will only compile for the JVM - - SCALAJS_VERSION= - - SCALAJS_VERSION=0.6.32 - - SCALAJS_VERSION=1.0.0 + - SCALAJS_VERSION= ADOPTOPENJDK=8 + - SCALAJS_VERSION=0.6.32 ADOPTOPENJDK=8 + - SCALAJS_VERSION=1.0.0 ADOPTOPENJDK=8 + - SCALAJS_VERSION= ADOPTOPENJDK=11 matrix: exclude: - - jdk: openjdk11 - env: SCALAJS_VERSION=0.6.32 - - jdk: openjdk11 - env: SCALAJS_VERSION=1.0.0 - scala: 2.11.12 - env: SCALAJS_VERSION=1.0.0 + env: SCALAJS_VERSION=0.6.32 ADOPTOPENJDK=8 - scala: 2.11.12 - jdk: openjdk11 + env: SCALAJS_VERSION=1.0.0 ADOPTOPENJDK=8 -script: - - java -version - - node -v - - admin/build.sh +install: + - git fetch --tags # get all tags for sbt-dynver -before_cache: - - find $HOME/.sbt -name "*.lock" | xargs rm - - find $HOME/.ivy2/cache -name "ivydata-*.properties" | xargs rm -cache: - directories: - - $HOME/.ivy2/cache - - $HOME/.sbt/boot - - $HOME/.sbt/launchers +script: ./build.sh diff --git a/admin/README.md b/admin/README.md deleted file mode 100644 index 3e9d1bfa2..000000000 --- a/admin/README.md +++ /dev/null @@ -1,69 +0,0 @@ -## Tag Driven Releasing - -### Initial setup for the repository - -To configure tag driven releases from Travis CI. - - 1. Generate a key pair for this repository with `./admin/genKeyPair.sh`. - Edit `.travis.yml` and `admin/build.sh` as prompted. - 1. Publish the public key to https://pgp.mit.edu - 1. Store other secrets as encrypted environment variables with `./admin/encryptEnvVars.sh`. - Edit `.travis.yml` as prompted. - 1. Edit `.travis.yml` to use `./admin/build.sh` as the build script, - and edit that script to use the tasks required for this project. - Ensure that `RELEASE_COMBO` is `true` for build matrix combinations - that should be released to sonatype (when building a tag). - -It is important to add comments in `.travis.yml` to identify the name -of each environment variable encoded in a `secure` section. - -After these steps, your `.travis.yml` should contain config of the form: - -``` -language: scala - -jdk: - - openjdk6 - - oraclejdk8 - -scala: - - 2.11.12 - - 2.12.6 - -env: - global: - # PGP_PASSPHRASE - - secure: "XXXXXX" - # SONA_USER - - secure: "XXXXXX" - # SONA_PASS - - secure: "XXXXXX" - -script: admin/build.sh - -notifications: - email: - - a@b.com -``` - -If Sonatype credentials change in the future, step 3 can be repeated -without generating a new key. - -### Testing - - 1. Follow the release process below to create a dummy release (e.g., `v0.1.0-TEST1`). - Confirm that the release was staged to Sonatype but do not release it to Maven - central. Instead, drop the staging repository. - -### Performing a release - - 1. Create a GitHub "Release" with a corresponding tag (e.g., `v0.1.1`) via the GitHub - web interface. - 1. The release will be published using the Scala and JVM version combinations specified - in the travis build matrix where `[ "$RELEASE_COMBO" = "true" ]`. - - If you need to release against a different Scala version, create a new commit that modifies - `.travis.yml` and push a new tag, e.g., `v1.2.3#2.13.0-M5`. The suffix after `#` is ignored. - 1. Travis CI will schedule a build for this release. Review the build logs. - 1. Log into https://oss.sonatype.org/ and identify the staging repository. - 1. Sanity check its contents. - 1. Release staging repository to Maven and send out release announcement. diff --git a/admin/api-docs.sh b/admin/api-docs.sh deleted file mode 100755 index ece2b11e1..000000000 --- a/admin/api-docs.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/bin/bash - -### - # Copyright (C) 2019 LAMP/EPFL and Lightbend, Inc. - # - # Build API docs for scala-xml. - # - # Runs Scaladoc, then commits to the gh-pages branch, so they are - # published to https://docs.scala-lang.org/scala-xml/api/1.0.0/ - # - # Usage: - # ./admin/api-docs.sh SCALA-XML-VERSION SCALA-VERSION - # - # SCALA-XML-VERSION is the scala-xml version, e.g. v1.0.5 - # SCALA-VERSION is the Scala version, e.g. 2.11.12 - # - # Example: - # ./admin/api-docs.sh v1.0.6 2.12.0 - # - # Required dependencies: - # - sbt 1.x - # - git - # - rsync - ## - -set -e - -if [ -z "$1" ]; then - echo "Error: Missing scala-xml version" >&2 - exit 1 -elif [ -z "$2" ]; then - echo "Error: Missing Scala version" >&2 - exit 1 -fi - -SCALA_XML_VERSION=${1%%#*} # Cleanup tags, e.g. v1.1.1#2.13.0-M5#8 -SCALA_VERSION=$2 - -TARGET_DIR=${TARGET_DIR-./jvm/target} -API_DIR=$TARGET_DIR/scala-${SCALA_VERSION%.*}/api -GIT_DIR=${GIT_DIR-./jvm/target} -DOC_DIR=$GIT_DIR/api/${SCALA_XML_VERSION#v} - -git checkout $SCALA_XML_VERSION -sbt "++$SCALA_VERSION" doc -mkdir $GIT_DIR/api -rsync -a $API_DIR/ $DOC_DIR/ -echo "Initializing git directory in $GIT_DIR" -cd $GIT_DIR -git init -git remote add upstream git@github.com:scala/scala-xml.git -git fetch upstream gh-pages -git checkout gh-pages -git add -A ./api -git commit -m"Scaladoc for $SCALA_XML_VERSION with Scala $SCALA_VERSION" -echo "Please review the commit in $GIT_DIR and push upstream" - -exit 0 -## End of script - -## Rebuild the universe with: - -env JAVA_HOME=$(/usr/libexec/java_home -v 1.6) TARGET_DIR=./target ./admin/api-docs.sh v1.0.1 2.11.12 -env JAVA_HOME=$(/usr/libexec/java_home -v 1.6) TARGET_DIR=./target ./admin/api-docs.sh v1.0.2 2.11.12 -env JAVA_HOME=$(/usr/libexec/java_home -v 1.6) TARGET_DIR=./target ./admin/api-docs.sh v1.0.3 2.11.12 -env JAVA_HOME=$(/usr/libexec/java_home -v 1.6) TARGET_DIR=./target ./admin/api-docs.sh v1.0.4 2.11.12 -env JAVA_HOME=$(/usr/libexec/java_home -v 1.6) TARGET_DIR=./target ./admin/api-docs.sh v1.0.5 2.11.12 -env JAVA_HOME=$(/usr/libexec/java_home -v 1.8) TARGET_DIR=./target ./admin/api-docs.sh v1.0.6 2.12.0 -env JAVA_HOME=$(/usr/libexec/java_home -v 1.8) ./admin/api-docs.sh v1.1.0 2.12.4 -env JAVA_HOME=$(/usr/libexec/java_home -v 1.8) ./admin/api-docs.sh v1.1.1 2.12.6 -env JAVA_HOME=$(/usr/libexec/java_home -v 1.8) ./admin/api-docs.sh v1.2.0 2.12.8 diff --git a/admin/build.sh b/admin/build.sh deleted file mode 100755 index 87cccb83c..000000000 --- a/admin/build.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/bash - -set -e - -# Builds of tagged revisions are published to sonatype staging. - -# Travis runs a build on revisions, including on new tags. -# Builds for a tag have TRAVIS_TAG defined, which we use for identifying tagged builds. -# Checking the local git clone would not work because git on travis does not fetch tags. - -# The version number to be published is extracted from the tag, e.g., v1.2.3 publishes -# version 1.2.3 on all combinations of the travis matrix where `[ "$RELEASE_COMBO" = "true" ]`. - -# In order to build a previously released version against a new (binary incompatible) Scala release, -# a new commit that modifies (and prunes) the Scala versions in .travis.yml needs to be added on top -# of the existing tag. Then a new tag can be created for that commit, e.g., `v1.2.3#2.13.0-M5`. -# Everything after the `#` in the tag name is ignored. - -if [[ "$TRAVIS_JDK_VERSION" == "openjdk8" && "$TRAVIS_SCALA_VERSION" =~ 2\.1[123]\..* ]]; then - RELEASE_COMBO=true; -fi - -if [ "$SCALAJS_VERSION" = "" ]; then - projectPrefix="xml" -else - projectPrefix="xmlJS" -fi - -verPat="[0-9]+\.[0-9]+\.[0-9]+(-[A-Za-z0-9-]+)?" -tagPat="^v$verPat(#.*)?$" - -if [[ "$TRAVIS_TAG" =~ $tagPat ]]; then - tagVer=${TRAVIS_TAG} - tagVer=${tagVer#v} # Remove `v` at beginning. - tagVer=${tagVer%%#*} # Remove anything after `#`. - publishVersion='set every version := "'$tagVer'"' - - if [ "$RELEASE_COMBO" = "true" ]; then - currentJvmVer=$(java -version 2>&1 | awk -F '"' '/version/ {print $2}' | sed 's/^1\.//' | sed 's/[^0-9].*//') - echo "Releasing $tagVer with Scala $TRAVIS_SCALA_VERSION on Java version $currentJvmVer." - - publishTask="$projectPrefix/publishSigned" - - cat admin/gpg.sbt >> project/plugins.sbt - cp admin/publish-settings.sbt . - - # Copied from the output of genKeyPair.sh - K=$encrypted_6b8d67feaab7_key - IV=$encrypted_6b8d67feaab7_iv - openssl aes-256-cbc -K $K -iv $IV -in admin/secring.asc.enc -out admin/secring.asc -d - fi -fi - -sbt "++$TRAVIS_SCALA_VERSION" "$publishVersion" "$projectPrefix/clean" "$projectPrefix/test" "$projectPrefix/publishLocal" "$publishTask" diff --git a/admin/encryptEnvVars.sh b/admin/encryptEnvVars.sh deleted file mode 100755 index b62566798..000000000 --- a/admin/encryptEnvVars.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -# -# Encrypt sonatype credentials so that they can be -# decrypted in trusted builds on Travis CI. -# -set -e - -read -s -p 'SONA_USER: ' SONA_USER -travis encrypt SONA_USER="$SONA_USER" -read -s -p 'SONA_PASS: ' SONA_PASS -travis encrypt SONA_PASS="$SONA_PASS" diff --git a/admin/genKeyPair.sh b/admin/genKeyPair.sh deleted file mode 100755 index 17db3f39b..000000000 --- a/admin/genKeyPair.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/bash -# -# Generates a key pair for this repository to sign artifacts. -# Encrypt the private key and its passphrase in trusted builds -# on Travis CI. -# -set -e - -# Based on https://gist.github.com/kzap/5819745: -function promptDelete() { - if [[ -f "$1" ]]; then - echo About to delete $1, Enter for okay / CTRL-C to cancel - read - rm "$1" - fi -} -for f in admin/secring.asc.enc admin/secring.asc admin/pubring.asc; do promptDelete "$f"; done - -echo Generating key pair. Please enter 1. repo name 2. scala-internals@googlegroups.com, 3. a new passphrase -echo Be careful when using special characters in the passphrase, see http://docs.travis-ci.com/user/encryption-keys/#Note-on-escaping-certain-symbols -cp admin/gpg.sbt project -sbt 'set pgpReadOnly := false' \ - 'set pgpPublicRing := file("admin/pubring.asc")' \ - 'set pgpSecretRing := file("admin/secring.asc")' \ - 'pgp-cmd gen-key' -rm project/gpg.sbt - -echo ============================================================================================ -echo Encrypting admin/secring.asc. Update K and IV variables in admin/build.sh accordingly. -echo ============================================================================================ -travis encrypt-file admin/secring.asc -rm admin/secring.asc -mv secring.asc.enc admin - -echo ============================================================================================ -echo Encrypting environment variables. Add each to a line in .travis.yml. Include a comment -echo with the name of the corresponding variable -echo ============================================================================================ -read -s -p 'PGP_PASSPHRASE: ' PGP_PASSPHRASE -travis encrypt PGP_PASSPHRASE="$PGP_PASSPHRASE" - diff --git a/admin/gpg.sbt b/admin/gpg.sbt deleted file mode 100644 index 68ae46411..000000000 --- a/admin/gpg.sbt +++ /dev/null @@ -1,2 +0,0 @@ - -addSbtPlugin("com.typesafe.sbt" % "sbt-pgp" % "0.8.3") // only added when publishing, see build.sh diff --git a/admin/publish-settings.sbt b/admin/publish-settings.sbt deleted file mode 100644 index 026c6ee3e..000000000 --- a/admin/publish-settings.sbt +++ /dev/null @@ -1,8 +0,0 @@ -def env(key: String) = Option(System.getenv(key)).getOrElse("") - -inThisBuild(Seq( - pgpPassphrase := Some(env("PGP_PASSPHRASE").toArray), - pgpPublicRing := file("admin/pubring.asc"), - pgpSecretRing := file("admin/secring.asc"), - credentials += Credentials("Sonatype Nexus Repository Manager", "oss.sonatype.org", env("SONA_USER"), env("SONA_PASS")) -)) diff --git a/admin/pubring.asc b/admin/pubring.asc deleted file mode 100644 index df4501ad6..000000000 --- a/admin/pubring.asc +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- -Version: BCPG v1.49 - -mQENBFVQohwBCACi9Hupi/27JFgcRypkruHZNKXa4+QO380B5hp0UFUzJHBqEvUd -p9niOq30yCgfByLiPv2qr7g1lAg2DltH9WyN5zhp3MzOt/m1w66IwZqgCS364gtD -56udK2R6YCFMfiJxGXFsSbStfIoD8N5S++NJGv0GuFc2m3sSuTunRFoRWN4Dce0g -a16nyVR2dPfqOkL7LLzMR4Tl8VQFb36WPrFBmJKzZWxt0r2pQhEDMwItuZeKrBhm -K/RZWtNqiBO61JCBHfWZdpduUcTjlr5cW+jkRtw8La0qgglJcSN/sErQamAtU6vo -sdTZ2aQQZnYyVBt00yrLV+9Dq/dBS6cfV9NHABEBAAG0LHNjYWxhLXhtbCA8c2Nh -bGEtaW50ZXJuYWxzQGdvb2dsZWdyb3Vwcy5jb20+iQEcBBMBAgAGBQJVUKIcAAoJ -EO/sfqhmzEOuHtkH/25VVvDzMo85E8KlCtsnkD5Alb83zV1XF6+mZaRHikzKkQRz -phZEGaU6ee3V6CH5qXsmKTU2B1WaOYIdPkuBjwdpRPJbaX0zzrWUCCv1vLKDb+z2 -nlcg0AehMUM3UinbGR6QCh06p3O/tBokJvZM+Ng3pkXtLOS4HphRfindpy7+u1Y/ -szcIQS88AH1g5xPt8nwrh9VQbrYD04K20mLckGIWnjSzgFB9hntMF5arAP9Q1RkS -52xiOZB8RTZZCkFeHIdMKjjmoM9Vn/3JZzsy8Om4FWYa/l2fEExxKWFupvQetjFk -VTTOG+T7/WwVPQQ0xQLROgWL7z5UgxHly64WClA= -=/6/b ------END PGP PUBLIC KEY BLOCK----- diff --git a/admin/secring.asc.enc b/admin/secring.asc.enc deleted file mode 100644 index 626ff5d10..000000000 Binary files a/admin/secring.asc.enc and /dev/null differ diff --git a/build.sbt b/build.sbt index 3b2381f2d..79c8fd10c 100644 --- a/build.sbt +++ b/build.sbt @@ -1,27 +1,20 @@ -import sbtcrossproject.{crossProject, CrossType} -import ScalaModulePlugin._ - -crossScalaVersions in ThisBuild := List("2.12.10", "2.11.12", "2.13.1") +import sbtcrossproject.CrossPlugin.autoImport.{crossProject, CrossType} lazy val xml = crossProject(JSPlatform, JVMPlatform) .withoutSuffixFor(JVMPlatform) .crossType(CrossType.Full) .in(file(".")) - .settings(scalaModuleSettings) - .jvmSettings(scalaModuleSettingsJVM) + .settings(ScalaModulePlugin.scalaModuleSettings) + .jvmSettings(ScalaModulePlugin.scalaModuleSettingsJVM) .settings( name := "scala-xml", - version := "1.3.0-SNAPSHOT", - - // this line could be removed after https://github.com/scala/sbt-scala-module/issues/48 is fixed - licenses := Seq(("Apache-2.0", url("https://www.apache.org/licenses/LICENSE-2.0"))), // Compiler team advised avoiding the -Xfuture option for releases. // The output with -Xfuture should be periodically checked, though. scalacOptions ++= "-deprecation:false -feature -Xlint:-stars-align,-nullary-unit,_".split("\\s+").to[Seq], scalacOptions in Test += "-Xxml:coalescing", - mimaPreviousVersion := { + scalaModuleMimaPreviousVersion := { if (System.getenv("SCALAJS_VERSION") == "1.0.0") None else Some("1.2.0") }, @@ -36,25 +29,31 @@ lazy val xml = crossProject(JSPlatform, JVMPlatform) } }, - apiMappings ++= Map( - scalaInstance.value.libraryJar - -> url(s"http://www.scala-lang.org/api/${scalaVersion.value}/") - ) ++ { + apiURL := Some( + url(s"""https://scala.github.io/scala-xml/api/${"-.*".r.replaceAllIn(version.value, "")}/""") + ), + + apiMappings ++= scalaInstance.value.libraryJars.filter { file => + file.getName.startsWith("scala-library") && file.getName.endsWith(".jar") + }.map { libraryJar => + libraryJar -> + url(s"http://www.scala-lang.org/api/${scalaVersion.value}/") + }.toMap ++ { // http://stackoverflow.com/questions/16934488 Option(System.getProperty("sun.boot.class.path")).flatMap { classPath => - classPath.split(java.io.File.pathSeparator).filter(_.endsWith(java.io.File.separator + "rt.jar")).headOption + classPath.split(java.io.File.pathSeparator).find(_.endsWith(java.io.File.separator + "rt.jar")) }.map { jarPath => Map( file(jarPath) -> url("http://docs.oracle.com/javase/8/docs/api") ) } getOrElse { - // If everything fails, jam in the Java 9 base module. + // If everything fails, jam in Java 11 modules. Map( file("/modules/java.base") - -> url("http://docs.oracle.com/javase/9/docs/api"), + -> url("https://docs.oracle.com/en/java/javase/11/docs/api/java.base"), file("/modules/java.xml") - -> url("http://docs.oracle.com/javase/9/docs/api") + -> url("https://docs.oracle.com/en/java/javase/11/docs/api/java.xml") ) } } @@ -72,6 +71,3 @@ lazy val xml = crossProject(JSPlatform, JVMPlatform) fork in Test := false ) .jsConfigure(_.enablePlugins(ScalaJSJUnitPlugin)) - -lazy val xmlJVM = xml.jvm -lazy val xmlJS = xml.js diff --git a/build.sh b/build.sh new file mode 100755 index 000000000..11ca2bb0a --- /dev/null +++ b/build.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +set -e + +# Builds of tagged revisions are published to sonatype staging. + +# Travis runs a build on new revisions and on new tags, so a tagged revision is built twice. +# Builds for a tag have TRAVIS_TAG defined, which we use for identifying tagged builds. + +# sbt-dynver sets the version number from the tag +# sbt-travisci sets the Scala version from the travis job matrix + +# To back-publish an existing release for a new Scala / Scala.js / Scala Native version: +# - check out the tag for the version that needs to be published +# - change `.travis.yml` to adjust the version numbers and trim down the build matrix as necessary +# - commit the changes and tag this new revision with an arbitrary suffix after a hash, e.g., +# `v1.2.3#dotty-0.27` (the suffix is ignored, the version will be `1.2.3`) + +# We release on JDK 8 (for Scala 2.x and Dotty 0.x) +isReleaseJob() { + if [[ "$ADOPTOPENJDK" == "8" ]]; then + true + else + false + fi +} + +if [[ "$SCALAJS_VERSION" == "" ]]; then + projectPrefix="xml" +else + projectPrefix="xmlJS" +fi + +verPat="[0-9]+\.[0-9]+\.[0-9]+(-[A-Za-z0-9-]+)?" +tagPat="^v$verPat(#.*)?$" + +if [[ "$TRAVIS_TAG" =~ $tagPat ]]; then + releaseTask="ci-release" + if ! isReleaseJob; then + echo "Not releasing on Java $ADOPTOPENJDK with Scala $TRAVIS_SCALA_VERSION" + exit 0 + fi +fi + +# default is +publishSigned; we cross-build with travis jobs, not sbt's crossScalaVersions +export CI_RELEASE="$projectPrefix/publishSigned" +export CI_SNAPSHOT_RELEASE="$projectPrefix/publish" + +# default is sonatypeBundleRelease, which closes and releases the staging repo +# see https://github.com/xerial/sbt-sonatype#commands +# for now, until we're confident in the new release scripts, just close the staging repo. +export CI_SONATYPE_RELEASE="; sonatypePrepare; sonatypeBundleUpload; sonatypeClose" + +sbt clean $projectPrefix/test $projectPrefix/publishLocal $releaseTask diff --git a/project/build.properties b/project/build.properties index c0bab0494..a919a9b5f 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.2.8 +sbt.version=1.3.8 diff --git a/project/plugins.sbt b/project/plugins.sbt index 191a88fe8..c7107fa52 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,8 +1,6 @@ -addSbtPlugin("com.typesafe.sbt" % "sbt-osgi" % "0.9.5") - val scalaJSVersion = Option(System.getenv("SCALAJS_VERSION")).filter(_.nonEmpty).getOrElse("0.6.32") +addSbtPlugin("org.scala-lang.modules" % "sbt-scala-module" % "2.1.3") +addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.0.0") addSbtPlugin("org.scala-js" % "sbt-scalajs" % scalaJSVersion) -addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "0.6.1") -addSbtPlugin("org.scala-lang.modules" % "sbt-scala-module" % "2.0.0")