Created
July 11, 2017 12:56
-
-
Save or-shachar/fa174162b91554c655a1c0dc4d4068cd to your computer and use it in GitHub Desktop.
coursier gets stuck
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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