Wrestling with Scala dependencies

Having to deal with versioned dependencies has been a rude wake-up call with Scala. It seemed simple: the scalajs-react library setup guide shows you how to fold it in:

but, sadly, no joy

[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  ::          UNRESOLVED DEPENDENCIES         ::
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  :: com.github.japgolly.scalajs-react#core_sjs0.6_2.10;0.11.2: not found
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::

Ok. So where do I find this thing?

Finding scalajs-react

I had no idea. I had only a couple of repositories configured – https://jcenter.bintray.com and https://repo.typesafe.com/typesafe/ivy-releases/, and it clearly wasn’t finding them there – even if I used a browser to root around at those addresses.

Having no idea, I googled “maven scalajs-react” and immediately came to something that looked like a repository (but wasn’t) but did seem to be aware of scalajs-react: mvnrepository. I tried setting that as my repo in a few dumb ways, with no joy.

Rooting around on mvnrepository it looked like I could query information about core and other releases, getting as far as here and realising that it actually detailed repository locations – like central.maven.org. That looked more like it, and by digging around there I could find what looked like the packages I needed.

Getting hold of it - but not

I’m using Artifactory as a local offline cache as I do a lot of work on the train with an intermittent connection. It works fine, if you understand how the dependency resolution mechanism works. Turns out I didn’t. In Artefactory I added central.maven.org as a new remote repository, keyed as sbt-maven and updated my .sbt\repositories file, and attempted to rebuild.

Still without joy – SBT was attempting to download 0.6_2.10, and couldn’t find it. I did find that you could add a “from …” extension to the libraryDependencies setting, and that seemed to do the job, at least partly: it seemed to bypass Artefactory, and I didn’t really understand whether it was really working.

Realisation dawns

I asked StackOverflow, and although I didn’t get an answer, I did get some inspiration. sschaef pointed out that I couldn’t use a 2.11 library with Scala 2.10.

What?

Oh: it’s looking for 0.6_2.10 … and only core_sjs0.6_2.11 appears in the repository. The detail after the underscore probably represents the Scala version. Is that by convention, or something more structured? And why is it choosing 0.6?

I assume it’s 0.6 because that’s the latest version. There didn’t seem to be any 0.6 versions for 2.10, although there was a 0.5 – but nowhere could I specify 0.6 or 0.5. So I upgraded the Scala for the project to 2.11 – and everything worked.

Actually, more accurately I upgraded to 2.11 and modified the libraryDependencies call:

and finally, having gradually found my way there, I found that mvnrepository actually tells you which setting to use to get hold of it:

which, hopefully I’ll remember for next time.