Skip to content

Instantly share code, notes, and snippets.

@or-shachar
Created July 11, 2017 12:56
Show Gist options
  • Save or-shachar/fa174162b91554c655a1c0dc4d4068cd to your computer and use it in GitHub Desktop.
Save or-shachar/fa174162b91554c655a1c0dc4d4068cd to your computer and use it in GitHub Desktop.
coursier gets stuck
package com.example
import MavenCoursierResolver._
import coursier.maven.MavenRepository
import coursier.{Dependency, Module, Platform, Resolution}
import scala.concurrent.duration.DurationInt
class MavenCoursierResolver() {
private val repositories = MavenRemoteRepositories.getLocalValidRepositories.map(MavenRepository(_))
private def resolve( dependency: Dependency,
filter: Option[Dependency => Boolean] = None,
forceVersions: Map[Module, String] = Map.empty): Resolution =
Resolution(Set(dependency), filter = filter, forceVersions = forceVersions)
.process
.run(Platform.fetch(repositories))
.unsafePerformSyncFor(90.seconds)
def allDependenciesOf(module: MavenModule): Set[MavenModule] = {
val coursierDependency = toDependency(module)
val resolution = resolve(coursierDependency)
resolution.dependencies.map(toMavenModule) - module
}
def directDependenciesOf(module: MavenModule): Set[MavenModule] = {
val coursierDependency = toDependency(module)
val resolution = resolve(coursierDependency)
resolution.dependenciesOf(coursierDependency).map(toMavenModule).toSet
}
}
private case class MavenCoordinates(scope: Scope, packaging: String, module: MavenModule)
object MavenCoursierResolver {
private def toDependency(mavenModule: MavenModule): Dependency =
Dependency(Module(mavenModule.groupId, mavenModule.artifactId), mavenModule.version)
private def toMavenModule(dependency: Dependency) =
MavenModule(dependency.module.organization, dependency.module.name, dependency.version)
private def scopeOf(dependency: Dependency) = ScopeTranslation.fromMaven(dependency.configuration)
private def toMavenModules(dependencies: Set[Dependency]): Set[MavenModule] =
dependencies.map(toMavenModule)
private def toMavenModule(dependency: Dependency):MavenModule =
MavenModule(dependency.module.organization,dependency.module.name,dependency.version)
}
case class MavenModule(groupId:String,artifactId:String,version:String)
package com.example
import java.nio.file.Paths
import MavenCoursierResolverTest._
import org.specs2.mutable.SpecificationWithJUnit
class MavenCoursierResolverTest extends SpecificationWithJUnit {
"MavenCoursierResolver" should {
"Resolve direct dependencies of given maven module" in {
val module = ExternalModule(
groupId = "org.eclipse.jetty",
artifactId = "jetty-server",
version = "9.4.6.v20170531"
)
val directDeps : Set[ExternalModule] = resolver.directDependenciesOf(module)
val expectedDeps = Set(
ExternalModule("javax.servlet","javax.servlet-api","3.1.0"),
ExternalModule("org.eclipse.jetty","jetty-http","9.4.6.v20170531"),
ExternalModule("org.eclipse.jetty","jetty-io","9.4.6.v20170531")
)
directDeps must beEqualTo(expectedDeps)
}
"Resolve all dependencies of given maven module" in {
val module = ExternalModule(
groupId = "org.eclipse.jetty",
artifactId = "jetty-server",
version = "9.4.6.v20170531"
)
val allDeps : Set[ExternalModule] = resolver.allDependenciesOf(module)
val expectedDeps = Set(
ExternalModule("javax.servlet","javax.servlet-api","3.1.0"),
ExternalModule("org.eclipse.jetty","jetty-http","9.4.6.v20170531"),
ExternalModule("org.eclipse.jetty","jetty-io","9.4.6.v20170531"),
ExternalModule("org.eclipse.jetty","jetty-util","9.4.6.v20170531")
)
allDeps must beEqualTo(expectedDeps)
}
}
}
object MavenCoursierResolverTest {
val resolver = new MavenCoursierResolver()
}
package com.example
import java.nio.file.{Files, Paths}
import scala.xml.XML
object MavenRemoteRepositories {
val MavenCentralURL = "https://repo1.maven.org/maven2"
def onlyMavenCentral = Seq(MavenCentralURL)
def getLocalValidRepositories: Seq[String] = {
val settingsPath = Paths.get(sys.props.get("user.home").get,".m2","settings.xml")
if (!Files.exists(settingsPath)){
println("warning: settings.xml file not found, using maven central only")
return Seq.empty
}
val xml = XML.load(settingsPath.toUri.toURL)
MavenCentralURL +: (xml \\ "repositories" \\ "repository" \\ "url").map(_.text)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment