From af556b297a5b7009722d2a3a0bdd2a7e93307dff Mon Sep 17 00:00:00 2001 From: xuwei-k <6b656e6a69@gmail.com> Date: Sun, 5 Apr 2026 16:17:05 +0900 Subject: [PATCH] Add sbt 2 cross build setting --- .github/workflows/ci.yml | 6 +++++- .github/workflows/release.yml | 2 +- .scalafmt.conf | 2 +- build.sbt | 12 +++++++++++- src/main/scala/sbtpomreader/MavenHelper.scala | 15 ++++++++------- .../sbtpomreader/MavenProjectHelper.scala | 18 +++++++++--------- .../sbtpomreader/MavenUserSettingsHelper.scala | 8 ++++---- src/main/scala/sbtpomreader/SbtPomKeys.scala | 1 + 8 files changed, 40 insertions(+), 24 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 13c4710..d2721a7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,7 +38,11 @@ jobs: - uses: sbt/setup-sbt@v1 - name: Test shell: bash - run: sbt -v clean +test +scripted + run: sbt -v clean test scripted + - name: Test sbt 2 + shell: bash + if: ${{ matrix.java != '8' }} + run: sbt -v "++ 3.x" test # TODO enable scripted test - name: Ensure formatting shell: bash run: sbt -v clean scalafmtSbtCheck scalafmtCheckAll diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f7f5442..46904b1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,7 +20,7 @@ jobs: uses: actions/setup-java@v5 with: distribution: "zulu" - java-version: "8" + java-version: "17" cache: sbt - uses: sbt/setup-sbt@v1 - name: Release diff --git a/.scalafmt.conf b/.scalafmt.conf index 6347eb3..6d9d19d 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -1,4 +1,4 @@ -version = "3.8.0" +version = "3.11.0" maxColumn = 120 project.git = true runner.dialect = scala212source3 diff --git a/build.sbt b/build.sbt index cf019aa..f4fa3ac 100644 --- a/build.sbt +++ b/build.sbt @@ -19,6 +19,14 @@ lazy val root = (project in file(".")) .enablePlugins(SbtPlugin) .settings(nocomma { name := "sbt-pom-reader" + scalacOptions ++= { + scalaBinaryVersion.value match { + case "2.12" => + Seq("-release:8") + case _ => + Nil + } + } scalacOptions ++= Seq( "-Wconf:any:wv", "-Xlint:unused", @@ -46,10 +54,12 @@ lazy val root = (project in file(".")) scriptedLaunchOpts := scriptedLaunchOpts.value ++ Seq("-Dproject.version=" + version.value) scriptedLaunchOpts ++= Seq("-Dplugin.version=" + version.value) scriptedBufferLog := true + crossScalaVersions += "3.8.4" + addSbtPlugin("com.github.sbt" % "sbt2-compat" % "0.1.0") (pluginCrossBuild / sbtVersion) := { scalaBinaryVersion.value match { case "2.12" => "1.9.9" - case _ => "2.0.0-RC6" + case _ => "2.0.0" } } scriptedSbt := { diff --git a/src/main/scala/sbtpomreader/MavenHelper.scala b/src/main/scala/sbtpomreader/MavenHelper.scala index fb9b4c5..a832232 100644 --- a/src/main/scala/sbtpomreader/MavenHelper.scala +++ b/src/main/scala/sbtpomreader/MavenHelper.scala @@ -16,6 +16,7 @@ import org.apache.maven.model.{ Repository as PomRepository } import org.apache.maven.settings.Settings as MavenSettings +import sbtcompat.PluginCompat.* /** Helper object to extract maven settings. */ object MavenHelper { @@ -99,7 +100,7 @@ object MavenHelper { pr ++ sr }, // TODO - split into Compile/Test/Runtime/Console - scalacOptions ++= { + scalacOptions ++= Def.uncached { getScalacOptions(effectivePom.value) }, credentials ++= createSbtCredentialsFromUserSettings(effectivePom.value, effectiveSettings.value) @@ -132,10 +133,10 @@ object MavenHelper { } def getAdditionalSourcesPlugin(pom: PomModel): Seq[PomPlugin] = { - pom.getBuild.getPlugins.asScala filter { plugin => + pom.getBuild.getPlugins.asScala.filter { plugin => (plugin.getGroupId == "org.codehaus.mojo") && (plugin.getArtifactId == "build-helper-maven-plugin") - } + }.toSeq } def getAdditionalSourcesFromPlugin(pom: PomModel): Seq[String] = { @@ -226,7 +227,7 @@ object MavenHelper { case (Some(mScope), Some(mType)) if ("test-jar".equalsIgnoreCase(mType)) => mod .withConfigurations(Some(s"${mScope}->test")) - .intransitive + .intransitive() // tests // SCOPE case (Some(mScope), _) if (mvnClassifier.getOrElse("").equalsIgnoreCase("tests")) => @@ -247,7 +248,7 @@ object MavenHelper { def getDependencies(pom: PomModel): Seq[ModuleID] = { for { - dep <- pom.getDependencies.asScala + dep <- pom.getDependencies.asScala.toSeq } yield convertDep(dep) } @@ -263,7 +264,7 @@ object MavenHelper { def getPomResolvers(pom: PomModel): Seq[Resolver] = { for { - repo <- pom.getRepositories.asScala + repo <- pom.getRepositories.asScala.toSeq // TODO - Support other layouts if repo.getLayout == "default" } yield repo.getId at repo.getUrl @@ -276,7 +277,7 @@ object MavenHelper { def getServerRealm(method: String, uri: String): Option[String] = { // This is consigned to a Try until proper handling of offline mode. Try { - val con = url(uri).openConnection.asInstanceOf[java.net.HttpURLConnection] + val con = new java.net.URI(uri).toURL.openConnection.asInstanceOf[java.net.HttpURLConnection] con setRequestMethod method if (con.getResponseCode == 401) { val authRealmConfigs = con.getHeaderField("WWW-Authenticate") diff --git a/src/main/scala/sbtpomreader/MavenProjectHelper.scala b/src/main/scala/sbtpomreader/MavenProjectHelper.scala index 56bc263..56b6b7a 100644 --- a/src/main/scala/sbtpomreader/MavenProjectHelper.scala +++ b/src/main/scala/sbtpomreader/MavenProjectHelper.scala @@ -1,6 +1,6 @@ package sbtpomreader -import sbt.* +import sbt.{ given, * } import scala.collection.JavaConverters.* @@ -103,16 +103,16 @@ object MavenProjectHelper { // TODO - Configure debugging output.... val currentProject: Project = ( Project(makeProjectName(current.model, overrideRootProjectName), current.dir) - // First pull in settings from pom - settings (useMavenPom*) + // First pull in settings from pom + .settings(useMavenPom*) // Now update depends on relationships with actual configurations - dependsOn (projectsWithModules.map { case (p, m) => new ClasspathDependency(p, m.configurations) }*) + .dependsOn(projectsWithModules.map { case (p, m) => new ClasspathDependency(p, m.configurations) }*) // Now fix aggregate relationships - aggregate (aggregates.map(x => x: ProjectReference)*) + .aggregate(aggregates.map(x => x: ProjectReference)*) // Now remove any inter-project dependencies we pulled in from the maven pom. // TODO - Maybe we can fix the useMavenPom settings so we don't need to // post-filter artifacts? - settings ( + .settings( Keys.libraryDependencies := { val depIds = getDepsFor(current).map(_.id).toSet Keys.libraryDependencies.value.filterNot { dep => @@ -146,7 +146,7 @@ object MavenProjectHelper { // An unsorted walk of the tree def allProjectsInTree(tree: ProjectTree): Seq[ProjectTree] = tree match { - case x: SimpleProject => Seq(x) + case x: SimpleProject => Seq(x) case agg: AggregateProject => Seq(agg) ++ agg.children.flatMap(allProjectsInTree) } @@ -156,7 +156,7 @@ object MavenProjectHelper { for (project <- projects) yield { val deps = for { - dep <- Option(project.model.getDependencies).map(_.asScala).getOrElse(Nil) + dep <- Option(project.model.getDependencies).map(_.asScala.toSeq).getOrElse(Nil) depId = makeId(dep.getGroupId, dep.getArtifactId, dep.getVersion) pdep <- projects if pdep.id == depId @@ -168,7 +168,7 @@ object MavenProjectHelper { def getChildProjectPoms(pom: PomModel, pomFile: File): Seq[File] = for { - childDirName <- Option(pom.getModules) map (_.asScala) getOrElse Nil + childDirName <- Option(pom.getModules) map (_.asScala.toSeq) getOrElse Nil childPom = pomFile.getParentFile / childDirName / "pom.xml" if childPom.exists } yield childPom diff --git a/src/main/scala/sbtpomreader/MavenUserSettingsHelper.scala b/src/main/scala/sbtpomreader/MavenUserSettingsHelper.scala index 3dd6307..7eed62e 100644 --- a/src/main/scala/sbtpomreader/MavenUserSettingsHelper.scala +++ b/src/main/scala/sbtpomreader/MavenUserSettingsHelper.scala @@ -33,7 +33,7 @@ object MavenUserSettingsHelper { def getUserResolvers(settings: MavenSettings): Seq[Resolver] = { val profiles = settings.getProfilesAsMap for { - profileName <- settings.getActiveProfiles.asScala + profileName <- settings.getActiveProfiles.asScala.toSeq profile <- Option(profiles.get(profileName)).toSeq repo <- profile.getRepositories.asScala } yield repo.getId at repo.getUrl @@ -43,7 +43,7 @@ object MavenUserSettingsHelper { def getUserRemoteRepositories(settings: MavenSettings): Seq[RemoteRepository] = { val profiles = settings.getProfilesAsMap for { - profileName <- settings.getActiveProfiles.asScala + profileName <- settings.getActiveProfiles.asScala.toSeq profile <- Option(profiles.get(profileName)).toSeq repo <- profile.getRepositories.asScala } yield new RemoteRepository.Builder(repo.getId, repo.getLayout, repo.getUrl).build() @@ -52,7 +52,7 @@ object MavenUserSettingsHelper { /** Extract the server credentials from the given settings file. */ def serverCredentials(settings: MavenSettings): Seq[ServerCredentials] = for { - s <- settings.getServers.asScala + s <- settings.getServers.asScala.toSeq } yield ServerCredentials(s.getId, s.getUsername, s.getPassword) /** Associates server credentials defined in the settings with repositories referenced in the POM. */ @@ -63,7 +63,7 @@ object MavenUserSettingsHelper { ): Seq[(PomRepository, ServerCredentials)] = { // TODO: handle repos in settings.xml for { - repo <- pom.getRepositories.asScala + repo <- pom.getRepositories.asScala.toSeq cred <- creds if cred.id == repo.getId } yield (repo -> cred) diff --git a/src/main/scala/sbtpomreader/SbtPomKeys.scala b/src/main/scala/sbtpomreader/SbtPomKeys.scala index af38e10..5e578c9 100644 --- a/src/main/scala/sbtpomreader/SbtPomKeys.scala +++ b/src/main/scala/sbtpomreader/SbtPomKeys.scala @@ -20,6 +20,7 @@ trait SbtPomKeys { lazy val effectivePom = SettingKey[Model]("mvn-effective-pom", "Reads the maven effective pom.") lazy val effectiveSettings = SettingKey[Option[MavenSettings]]("mvn-effective-settings", "The effective maven settings model.") + @transient lazy val showEffectivePom = TaskKey[Unit]("show-effective-pom", "Displays the effective pom from maven.") lazy val mavenUserProperties = SettingKey[Map[String, String]]("maven-user-properties", "A map of user properties to be applied")