Deploy SBT artifacts using Maven Artifact Resolver (formerly Eclipse Aether)
Scala
89
275 commits
updated Aug 27, 2026
Deploys sbt-artifacts using Maven Artifact Provider.
The same behaviour as Maven should be expected.
Cross-built for sbt 1.x and sbt 2.x.
addSbtPlugin("no.arktekk.sbt" % "aether-deploy" % "0.30.0")
/** OR **/
addSbtPlugin("no.arktekk.sbt" % "aether-deploy-signed" % "0.30.0") // For sbt-pgp 2.x support
Support sbt 2.x.
version is now sourced per-project (previously always taken from ThisBuild / version). Required to align with
sbt 2.x's bare-settings convention. See also
Migrating ThisBuild
in the sbt 2 migration guide.
Most builds are unaffected: version falls back to ThisBuild / version via sbt's standard scope delegation. The
change matters only if your build sets both ThisBuild / version and a different per-project version - publish
coordinates now match the project-scope value. To restore the old behaviour, set in the affected project:
version := (ThisBuild / version).value
Calling AetherArtifact.attach directly requires an implicit xsbti.FileConverter in scope. Supply it from the task
body (as below), or use the new attachSubArtifact helper, which does not
require either:
aetherArtifact := {
implicit val conv: xsbti.FileConverter = fileConverter.value
aetherArtifact.value.attach(myFileTask.value, "classifier", "ext")
}
If you call AetherPlugin.deployIt or AetherPlugin.installIt directly from a custom task, the trailing
TaskStreams parameter is no longer implicit - pass streams.value as a regular argument:
AetherPlugin.deployIt(repo, localRepo, artifact, creds, headers)(streams.value)
AetherPlugin.installIt(artifact, localRepo)(streams.value)
Only support new plugin layouts Remove aetherOldVersionMethod key
Support both old and new plugin layouts
Only one may be active at at time, so this differs from SBT.
Set key sbtPluginPublishLegacyMavenStyle := false to get new behaviour.
aether-deploy-signed now uses the new maven coordinates for sbt-pgp
sbt-pgp support now published separately, and requires aether-deploy-signed dependency declaration instead of
aether-deploy to support zero configuration use of SignedAetherPlugin.
If you want to use sbt-pgp you need to use version 2.0.1 or higher.
The version to be used by the aetherCoordinates will be scoped using ThisBuild, to work better with the release plugin.
To get the old behaviour you will need to add this to your build.sbt:
aetherOldVersionMethod := true
Logging level of progress has been changed from info to debug.
You can turn off the progress logging by adding this to your build.sbt:
import aether.AetherKeys._
logLevel in aetherDeploy := Level.Info
If you see errors similar to what is described in this ticket then you might want to check if you are using a global plugin.
There are known incompabilities with sbt-pgp if sbt-pgp is used as a global plugin.
publishTo := {
if ((version in ThisBuild).value.endsWith("SNAPSHOT")) {
Some(Opts.resolver.sonatypeSnapshots)
} else {
Some(Opts.resolver.sonatypeStaging)
}
}
This plugin is now an Autoplugin, so there is no need to add extra config to make it work.
overridePublishSettings
overridePublishLocalSettings
overridePublishBothSettings
overridePublishSignedSettings
overridePublishSignedLocalSettings
overridePublishSignedBothSettings
Attach a packaged-file task (e.g. a zip produced by Universal / packageBin) as a
sub-artefact alongside the main jar:
attachSubArtifact(Universal / packageBin, "dist", "zip")
credentials += Credentials(Path.userHome / ".sbt" / ".credentials")
To deploy to remote Maven repository.
sbt aetherDeploy
To deploy to local maven repository.
sbt aetherInstall
To deploy to remote Maven repository.
sbt publish
To deploy to local maven repository.
sbt publishLocal
Documentation for proxies can be found here
You will need to add the sbt-pgp-plugin as described here.
enablePlugins(SignedAetherPlugin) // Only required for 0.24.0 and below. SignedAetherPlugin is
// automatically enabled if sbt-pgp is enabled on the project.
disablePlugins(AetherPlugin) // Only required for 0.24.0 and below.
This should now allow aether-deploy task to work with the sbt-pgp-plugin
Scala
91.1%
Shell
8.9%
Deploy SBT artifacts using Maven Artifact Resolver (formerly Eclipse Aether)
Scala
89
275 commits
updated Aug 27, 2026
Deploys sbt-artifacts using Maven Artifact Provider.
The same behaviour as Maven should be expected.
Cross-built for sbt 1.x and sbt 2.x.
addSbtPlugin("no.arktekk.sbt" % "aether-deploy" % "0.30.0")
/** OR **/
addSbtPlugin("no.arktekk.sbt" % "aether-deploy-signed" % "0.30.0") // For sbt-pgp 2.x support
Support sbt 2.x.
version is now sourced per-project (previously always taken from ThisBuild / version). Required to align with
sbt 2.x's bare-settings convention. See also
Migrating ThisBuild
in the sbt 2 migration guide.
Most builds are unaffected: version falls back to ThisBuild / version via sbt's standard scope delegation. The
change matters only if your build sets both ThisBuild / version and a different per-project version - publish
coordinates now match the project-scope value. To restore the old behaviour, set in the affected project:
version := (ThisBuild / version).value
Calling AetherArtifact.attach directly requires an implicit xsbti.FileConverter in scope. Supply it from the task
body (as below), or use the new attachSubArtifact helper, which does not
require either:
aetherArtifact := {
implicit val conv: xsbti.FileConverter = fileConverter.value
aetherArtifact.value.attach(myFileTask.value, "classifier", "ext")
}
If you call AetherPlugin.deployIt or AetherPlugin.installIt directly from a custom task, the trailing
TaskStreams parameter is no longer implicit - pass streams.value as a regular argument:
AetherPlugin.deployIt(repo, localRepo, artifact, creds, headers)(streams.value)
AetherPlugin.installIt(artifact, localRepo)(streams.value)
Only support new plugin layouts Remove aetherOldVersionMethod key
Support both old and new plugin layouts
Only one may be active at at time, so this differs from SBT.
Set key sbtPluginPublishLegacyMavenStyle := false to get new behaviour.
aether-deploy-signed now uses the new maven coordinates for sbt-pgp
sbt-pgp support now published separately, and requires aether-deploy-signed dependency declaration instead of
aether-deploy to support zero configuration use of SignedAetherPlugin.
If you want to use sbt-pgp you need to use version 2.0.1 or higher.
The version to be used by the aetherCoordinates will be scoped using ThisBuild, to work better with the release plugin.
To get the old behaviour you will need to add this to your build.sbt:
aetherOldVersionMethod := true
Logging level of progress has been changed from info to debug.
You can turn off the progress logging by adding this to your build.sbt:
import aether.AetherKeys._
logLevel in aetherDeploy := Level.Info
If you see errors similar to what is described in this ticket then you might want to check if you are using a global plugin.
There are known incompabilities with sbt-pgp if sbt-pgp is used as a global plugin.
publishTo := {
if ((version in ThisBuild).value.endsWith("SNAPSHOT")) {
Some(Opts.resolver.sonatypeSnapshots)
} else {
Some(Opts.resolver.sonatypeStaging)
}
}
This plugin is now an Autoplugin, so there is no need to add extra config to make it work.
overridePublishSettings
overridePublishLocalSettings
overridePublishBothSettings
overridePublishSignedSettings
overridePublishSignedLocalSettings
overridePublishSignedBothSettings
Attach a packaged-file task (e.g. a zip produced by Universal / packageBin) as a
sub-artefact alongside the main jar:
attachSubArtifact(Universal / packageBin, "dist", "zip")
credentials += Credentials(Path.userHome / ".sbt" / ".credentials")
To deploy to remote Maven repository.
sbt aetherDeploy
To deploy to local maven repository.
sbt aetherInstall
To deploy to remote Maven repository.
sbt publish
To deploy to local maven repository.
sbt publishLocal
Documentation for proxies can be found here
You will need to add the sbt-pgp-plugin as described here.
enablePlugins(SignedAetherPlugin) // Only required for 0.24.0 and below. SignedAetherPlugin is
// automatically enabled if sbt-pgp is enabled on the project.
disablePlugins(AetherPlugin) // Only required for 0.24.0 and below.
This should now allow aether-deploy task to work with the sbt-pgp-plugin
Scala
91.1%
Shell
8.9%