75
votes

I'm having problems with a maven dependency which is in my local respository.

SBT can't find it. Already set log level to debug, but not getting anything new.

The files are in the repository. I copy paste paths from the console to file explorer and they are there.

The output:

[debug]          trying file://c:/Users/userz/.m2/repository/com/twitter/naggati/2.0.0/naggati-2.0.0.pom

[debug]                 tried file://c:/Users/userz/.m2/repository/com/twitter/naggati/2.0.0/naggati-2.0.0.pom

[debug]         Local Maven Repository: resource not reachable for com/twitter#naggati;2.0.0: res=file://c:/Users/userz/.m2/repository/com/twitter/naggati/2.0
.0/naggati-2.0.0.pom

[debug]          trying file://c:/Users/userz/.m2/repository/com/twitter/naggati/2.0.0/naggati-2.0.0.jar

[debug]                 tried file://c:/Users/userz/.m2/repository/com/twitter/naggati/2.0.0/naggati-2.0.0.jar

[debug]         Local Maven Repository: resource not reachable for com/twitter#naggati;2.0.0: res=file://c:/Users/userz/.m2/repository/com/twitter/naggati/2.0
.0/naggati-2.0.0.jar

[debug]         Local Maven Repository: no ivy file nor artifact found for com.twitter#naggati;2.0.0

Edit: I added the path using scala file in project/build like described in http://code.google.com/p/simple-build-tool/wiki/LibraryManagement

"sbt can search your local Maven repository if you add it as a repository:"

val mavenLocal = "Local Maven Repository" at "file://"+Path.userHome+"/.m2/repository"

That made sbt look in the local repository. Before it didn't.

So the scala file looks like this:

import sbt._

class Foo(info: ProjectInfo) extends DefaultProject(info) {

val mavenLocal = "Local Maven Repository" at "file://c:/Users/userz/.m2/repository"

}

(I hardcoded Path.userHome to exclude possible error reason. As expected it didn't change anything).

4
You have to add the local maven repo to your build.sbt - leedm777
The repository is added, otherwise the script would not look there for the files. - User
How is the line that tells sbt to look for your dependency? If you have something like ... -> default, remove default from there. - fmpwizard
Actually I'm not using build.sbt. I'm using a scala file like described in code.google.com/p/simple-build-tool/wiki/LibraryManagement. Edited my post with more details. - User
ixx: That's SBT 0.7.x, and it's the legacy version. You should update to [SBT 0.11.x])github.com/harrah/xsbt/wiki), if possible. - leedm777

4 Answers

64
votes

You need three slashes after the file: specifier. This is because between the second and third slash, you have an optional hostname. Wikipedia has a good explanation of file: URL's

You're having a problem because the typical pattern of "file://"+Path.userHome+"/.m2/repository" assumes a Unix filesystem, where the path begins with a /, contains no :, and usually contains no spaces.

To have a non-hardcoded path that works on both Windows and Linux/Unix, use:

"Local Maven" at Path.userHome.asFile.toURI.toURL + ".m2/repository"
146
votes

Just add this line in the build.scala or build.sbt file

resolvers += Resolver.mavenLocal
21
votes

To get this to work for newer versions of sbt, add the following to build.sbt:

resolvers += "Local Maven Repository" at "file:///"+Path.userHome+"/.m2/repository"
3
votes

Watch out when you have a project defined, you'll need to include the resolver in the settings. Global resolver will not be identified.

Example:

lazy val core = (project in file("core")).
  settings(commonSettings: _*).
  settings(
    resolvers += Resolver.mavenLocal,
    name := "Core",
    libraryDependencies := coreDependencies
  )