Skip to content

Use bomDeps when importing Maven projects #4067

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 9 commits into
base: main
Choose a base branch
from
17 changes: 12 additions & 5 deletions main/init/buildgen/src/mill/main/buildgen/BuildGenUtil.scala
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ object BuildGenUtil {
|
|${renderIvyDeps(scopedDeps.testIvyDeps)}
|
|${renderBomModuleDeps(scopedDeps.testBomModuleDeps)}
|
|${renderModuleDeps(scopedDeps.testModuleDeps)}
|
|${renderCompileIvyDeps(scopedDeps.testCompileIvyDeps)}
Expand All @@ -86,10 +88,14 @@ object BuildGenUtil {
|
|${renderRepositories(repositories)}
|
|${renderDepManagement(scopedDeps.depManagement)}
|
|${renderBomIvyDeps(scopedDeps.mainBomIvyDeps)}
|
|${renderIvyDeps(scopedDeps.mainIvyDeps)}
|
|${renderBomModuleDeps(scopedDeps.mainBomModuleDeps)}
|
|${renderModuleDeps(scopedDeps.mainModuleDeps)}
|
|${renderCompileIvyDeps(scopedDeps.mainCompileIvyDeps)}
Expand All @@ -105,11 +111,6 @@ object BuildGenUtil {
|${renderPublishVersion(publishVersion)}
|
|${renderPomPackaging(packaging)}
|
|${
if (pomParentArtifact == null) ""
else renderPomParentProject(renderArtifact(pomParentArtifact))
}
|
|${renderPublishProperties(Nil)}
|
Expand Down Expand Up @@ -355,12 +356,18 @@ object BuildGenUtil {
if (dirs.nonEmpty && dirs.last == name) "" // skip default
else s"def artifactName = ${escape(name)}"

def renderDepManagement(args: IterableOnce[String]): String =
optional("def depManagement = super.depManagement() ++ Seq", args)

def renderBomIvyDeps(args: IterableOnce[String]): String =
optional("def bomIvyDeps = super.bomIvyDeps() ++ Seq", args)

def renderIvyDeps(args: IterableOnce[String]): String =
optional("def ivyDeps = super.ivyDeps() ++ Seq", args)

def renderBomModuleDeps(args: IterableOnce[String]): String =
optional("def bomModuleDeps = super.bomModuleDeps ++ Seq", args)

def renderModuleDeps(args: IterableOnce[String]): String =
optional("def moduleDeps = super.moduleDeps ++ Seq", args)

Expand Down
6 changes: 4 additions & 2 deletions main/init/buildgen/src/mill/main/buildgen/ir.scala
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,6 @@ case class IrBuild(
pomSettings: IrPom,
publishVersion: String,
packaging: String,
pomParentArtifact: IrArtifact,
resources: Seq[os.SubPath],
testResources: Seq[os.SubPath],
publishProperties: Seq[(String, String)]
Expand All @@ -96,6 +95,7 @@ case class IrScopedDeps(
namedIvyDeps: Seq[(String, String)] = Nil,
mainBomIvyDeps: SortedSet[String] = SortedSet(),
mainIvyDeps: SortedSet[String] = SortedSet(),
mainBomModuleDeps: SortedSet[String] = SortedSet(),
mainModuleDeps: SortedSet[String] = SortedSet(),
mainCompileIvyDeps: SortedSet[String] = SortedSet(),
mainCompileModuleDeps: SortedSet[String] = SortedSet(),
Expand All @@ -104,9 +104,11 @@ case class IrScopedDeps(
testModule: Option[String] = None,
testBomIvyDeps: SortedSet[String] = SortedSet(),
testIvyDeps: SortedSet[String] = SortedSet(),
testBomModuleDeps: SortedSet[String] = SortedSet(),
testModuleDeps: SortedSet[String] = SortedSet(),
testCompileIvyDeps: SortedSet[String] = SortedSet(),
testCompileModuleDeps: SortedSet[String] = SortedSet()
testCompileModuleDeps: SortedSet[String] = SortedSet(),
depManagement: SortedSet[String] = SortedSet()
)

case class IrBaseInfo(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -163,8 +163,6 @@ object GradleBuildGenMain extends BuildGenBase[ProjectModel, JavaModel.Dep] {
pomSettings = if (baseInfo.noPom) extractPomSettings(project) else null,
publishVersion = if (version == baseInfo.publishVersion) null else version,
packaging = getPomPackaging(project),
// not available
pomParentArtifact = null,
// skipped, requires relatively new API (JavaPluginExtension.getSourceSets)
resources = Nil,
testResources = Nil,
Expand Down
69 changes: 63 additions & 6 deletions main/init/maven/src/mill/main/maven/MavenBuildGenMain.scala
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,6 @@ object MavenBuildGenMain extends BuildGenBase[Model, Dependency] {
pomSettings = if (baseInfo.noPom) extractPomSettings(model) else null,
publishVersion = if (version == baseInfo.publishVersion) null else version,
packaging = model.getPackaging,
pomParentArtifact = mkPomParent(model.getParent),
resources =
processResources(model.getBuild.getResources, getMillSourcePath(model))
.filterNot(_ == mavenMainResourceDir),
Expand All @@ -128,7 +127,9 @@ object MavenBuildGenMain extends BuildGenBase[Model, Dependency] {
def getMillSourcePath(model: Model): Path = os.Path(model.getProjectDirectory)

def getSuperTypes(cfg: Config, baseInfo: IrBaseInfo, build: Node[Model]): Seq[String] = {
Seq("RootModule") ++
val isBom = build.value.getPackaging == "pom"
val bomType = if (isBom) Seq("BomModule") else Nil
Seq("RootModule") ++ bomType ++
cfg.shared.baseModule.fold(getModuleSupertypes(cfg))(Seq(_))
}

Expand Down Expand Up @@ -169,9 +170,12 @@ object MavenBuildGenMain extends BuildGenBase[Model, Dependency] {
dep.getExclusions.iterator().asScala.map(x => (x.getGroupId, x.getArtifactId))
)

def mkPomParent(parent: Parent): IrArtifact =
if (null == parent) null
else IrArtifact(parent.getGroupId, parent.getArtifactId, parent.getVersion)
def interpParentIvy(parent: Parent): String =
BuildGenUtil.renderIvyString(
parent.getGroupId,
parent.getArtifactId,
parent.getVersion
)

def extractPomSettings(model: Model): IrPom = {
IrPom(
Expand Down Expand Up @@ -206,13 +210,34 @@ object MavenBuildGenMain extends BuildGenBase[Model, Dependency] {
val hasTest = os.exists(os.Path(model.getProjectDirectory) / "src/test")
val ivyDep: Dependency => String = {
cfg.shared.depsObject.fold(interpIvy(_)) { objName => dep =>
{
if (dep.getVersion == null)
interpIvy(dep)
else {
val depName = s"`${dep.getGroupId}:${dep.getArtifactId}`"
sd = sd.copy(namedIvyDeps = sd.namedIvyDeps :+ (depName, interpIvy(dep)))
s"$objName.$depName"
}
}
}
val parentIvyDep: Parent => String = {
cfg.shared.depsObject.fold(interpParentIvy(_)) { objName => parent =>
{
val parentName = s"`${parent.getGroupId}:${parent.getArtifactId}`"
sd = sd.copy(namedIvyDeps = sd.namedIvyDeps :+ (parentName, interpParentIvy(parent)))
s"$objName.$parentName"
}
}
}

for (parent <- Option(model.getParent)) {
val id = (parent.getGroupId, parent.getArtifactId, parent.getVersion)
if (packages.isDefinedAt(id))
sd = sd.copy(mainBomModuleDeps = sd.mainBomModuleDeps + packages(id))
else {
val dep = parentIvyDep(parent)
sd = sd.copy(mainBomIvyDeps = sd.mainBomIvyDeps + dep)
}
}

model.getDependencies.forEach { dep =>
val id = (dep.getGroupId, dep.getArtifactId, dep.getVersion)
Expand Down Expand Up @@ -253,6 +278,14 @@ object MavenBuildGenMain extends BuildGenBase[Model, Dependency] {
}
}

case "import" =>
if (packages.isDefinedAt(id))
sd = sd.copy(mainBomModuleDeps = sd.mainBomModuleDeps + packages(id))
else {
val ivyDep0 = ivyDep(dep)
sd = sd.copy(mainBomIvyDeps = sd.mainBomIvyDeps + ivyDep0)
}

case scope =>
println(s"ignoring $scope dependency $id")

Expand All @@ -261,6 +294,30 @@ object MavenBuildGenMain extends BuildGenBase[Model, Dependency] {
sd = sd.copy(testModule = testModulesByGroup.get(dep.getGroupId))
}
}

if (model.getDependencyManagement != null)
model.getDependencyManagement.getDependencies.forEach { dep =>
val id = (dep.getGroupId, dep.getArtifactId, dep.getVersion)
// packages.isDefinedAt(id) means dep refers to a module of the current build.
// Not sure what to do if we run into such a module in dep management.
if (!packages.isDefinedAt(id))
if (dep.getScope == "import") {
val ivy = ivyDep(dep)
sd = sd.copy(mainBomIvyDeps = sd.mainBomIvyDeps + ivy)
} else {
// Short-circuit ivyDep by calling interpIvy directly.
// This prevents depManagement to be filled with things like 'Deps.thing'.
// depManagement is also meant to centralize dependencies, so there's no need
// to add an extra redirection.
val ivy = interpIvy(dep)
if (dep.getScope != null && dep.getScope != "compile")
println(
s"ignoring scope '${dep.getScope}' of dependency $id in dependency management"
)
sd = sd.copy(depManagement = sd.depManagement + ivy)
}
}

sd
}

Expand Down
45 changes: 32 additions & 13 deletions main/init/maven/test/resources/expected/config/build.mill
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,28 @@ object Deps {
val `org.mockito:mockito-core` = ivy"org.mockito:mockito-core:1.8.5"
}

object `package` extends RootModule with MyModule {
object `package` extends RootModule with BomModule with MyModule {

def artifactName = "parent"

def pomPackagingType = PackagingType.Pom

object `multi-module` extends MyModule {
object `multi-module` extends BomModule with MyModule {

def artifactName = "multi-module-parent"

def javacOptions = super.javacOptions() ++
Seq("-source", "1.6", "-target", "1.6")

def depManagement = super.depManagement() ++ Seq(
ivy"javax.servlet.jsp:jsp-api:2.2",
ivy"javax.servlet:servlet-api:2.5",
ivy"junit:junit-dep:4.10",
ivy"org.hamcrest:hamcrest-core:1.2.1",
ivy"org.hamcrest:hamcrest-library:1.2.1",
ivy"org.mockito:mockito-core:1.8.5"
)

def pomPackagingType = PackagingType.Pom

def publishProperties = super.publishProperties() ++ Map(
Expand All @@ -40,11 +49,16 @@ object `package` extends RootModule with MyModule {
def javacOptions = super.javacOptions() ++
Seq("-source", "1.6", "-target", "1.6")

def pomParentProject = Some(Artifact(
"com.example.maven-samples",
"multi-module-parent",
"1.0-SNAPSHOT"
))
def depManagement = super.depManagement() ++ Seq(
ivy"javax.servlet.jsp:jsp-api:2.2",
ivy"javax.servlet:servlet-api:2.5",
ivy"junit:junit-dep:4.10",
ivy"org.hamcrest:hamcrest-core:1.2.1",
ivy"org.hamcrest:hamcrest-library:1.2.1",
ivy"org.mockito:mockito-core:1.8.5"
)

def bomModuleDeps = super.bomModuleDeps ++ Seq(build.`multi-module`)

def publishProperties = super.publishProperties() ++ Map(
("project.build.sourceEncoding", "utf-8"),
Expand All @@ -68,19 +82,24 @@ object `package` extends RootModule with MyModule {
def javacOptions = super.javacOptions() ++
Seq("-source", "1.6", "-target", "1.6")

def depManagement = super.depManagement() ++ Seq(
ivy"javax.servlet.jsp:jsp-api:2.2",
ivy"javax.servlet:servlet-api:2.5",
ivy"junit:junit-dep:4.10",
ivy"org.hamcrest:hamcrest-core:1.2.1",
ivy"org.hamcrest:hamcrest-library:1.2.1",
ivy"org.mockito:mockito-core:1.8.5"
)

def bomModuleDeps = super.bomModuleDeps ++ Seq(build.`multi-module`)

def moduleDeps = super.moduleDeps ++ Seq(build.`multi-module`.server)

def compileIvyDeps = super.compileIvyDeps() ++
Seq(Deps.`javax.servlet.jsp:jsp-api`, Deps.`javax.servlet:servlet-api`)

def pomPackagingType = "war"

def pomParentProject = Some(Artifact(
"com.example.maven-samples",
"multi-module-parent",
"1.0-SNAPSHOT"
))

def publishProperties = super.publishProperties() ++ Map(
("project.build.sourceEncoding", "utf-8"),
("project.reporting.outputEncoding", "utf-8")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import mill._
import mill.javalib._
import mill.javalib.publish._

object `package` extends RootModule with PublishModule with MavenModule {
object `package`
extends RootModule with BomModule with PublishModule with MavenModule {

def artifactName = "parent"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,23 @@ import mill._
import mill.javalib._
import mill.javalib.publish._

object `package` extends RootModule with PublishModule with MavenModule {
object `package`
extends RootModule with BomModule with PublishModule with MavenModule {

def artifactName = "multi-module-parent"

def javacOptions = super.javacOptions() ++
Seq("-source", "1.6", "-target", "1.6")

def depManagement = super.depManagement() ++ Seq(
ivy"javax.servlet.jsp:jsp-api:2.2",
ivy"javax.servlet:servlet-api:2.5",
ivy"junit:junit-dep:4.10",
ivy"org.hamcrest:hamcrest-core:1.2.1",
ivy"org.hamcrest:hamcrest-library:1.2.1",
ivy"org.mockito:mockito-core:1.8.5"
)

def pomSettings = PomSettings(
"Sample multi module Maven project with a working, deployable site.",
"com.example.maven-samples",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,17 @@ object `package` extends RootModule with PublishModule with MavenModule {
def javacOptions = super.javacOptions() ++
Seq("-source", "1.6", "-target", "1.6")

def depManagement = super.depManagement() ++ Seq(
ivy"javax.servlet.jsp:jsp-api:2.2",
ivy"javax.servlet:servlet-api:2.5",
ivy"junit:junit-dep:4.10",
ivy"org.hamcrest:hamcrest-core:1.2.1",
ivy"org.hamcrest:hamcrest-library:1.2.1",
ivy"org.mockito:mockito-core:1.8.5"
)

def bomModuleDeps = super.bomModuleDeps ++ Seq(build.`multi-module`)

def pomSettings = PomSettings(
"Logic.",
"com.example.maven-samples",
Expand All @@ -25,10 +36,6 @@ object `package` extends RootModule with PublishModule with MavenModule {

def publishVersion = "1.0-SNAPSHOT"

def pomParentProject = Some(
Artifact("com.example.maven-samples", "multi-module-parent", "1.0-SNAPSHOT")
)

object test extends MavenTests with TestModule.Junit4 {

def ivyDeps = super.ivyDeps() ++ Seq(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,17 @@ object `package` extends RootModule with PublishModule with MavenModule {
def javacOptions = super.javacOptions() ++
Seq("-source", "1.6", "-target", "1.6")

def depManagement = super.depManagement() ++ Seq(
ivy"javax.servlet.jsp:jsp-api:2.2",
ivy"javax.servlet:servlet-api:2.5",
ivy"junit:junit-dep:4.10",
ivy"org.hamcrest:hamcrest-core:1.2.1",
ivy"org.hamcrest:hamcrest-library:1.2.1",
ivy"org.mockito:mockito-core:1.8.5"
)

def bomModuleDeps = super.bomModuleDeps ++ Seq(build.`multi-module`)

def moduleDeps = super.moduleDeps ++ Seq(build.`multi-module`.server)

def compileIvyDeps = super.compileIvyDeps() ++
Expand All @@ -32,8 +43,4 @@ object `package` extends RootModule with PublishModule with MavenModule {

def pomPackagingType = "war"

def pomParentProject = Some(
Artifact("com.example.maven-samples", "multi-module-parent", "1.0-SNAPSHOT")
)

}
1 change: 1 addition & 0 deletions scalalib/src/mill/javalib/package.scala
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ package object javalib extends mill.scalalib.JsonFormatters {
type Assembly = mill.scalalib.Assembly

type JavaModule = mill.scalalib.JavaModule
type BomModule = mill.scalalib.BomModule

type NativeImageModule = mill.scalalib.NativeImageModule

Expand Down