Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Publish SBT project to local directory

Tags:

maven

sbt

I am trying to publish some of my SBT projects on my personal webserver. As far as I know you usually export a SBT project as a Maven directory including a POM.xml, that contains the project definitions.

As Brian Clapper pointed out, you can publish such a Maven repository by creating several configuration files and using sbt publish. In his tutorial, the repository is transferred via FTP.

I want to push my Maven repository to the server manually so I have more control. Can you give me some hints, how to accomplish this?

like image 711
pvorb Avatar asked Jul 05 '12 16:07

pvorb


People also ask

Where is sbt local repository?

The publishLocal action is used to publish your project to your Ivy local file repository, which is usually located at $HOME/. ivy2/local/ . You can then use this project from other projects on the same machine.

How do I publish a local jar file?

sbt with the necessary settings - organization , name , version and possibly scalaVersion - and save it where the jar file is. You may've noticed, the build changes compile:package task to point at the jar file. That's it. Execute sbt publishLocal and the jar file should be in the Ivy2 local repository, i.e. ~/.

What is ThisBuild in sbt?

Typically, if a key has no associated value in a more-specific scope, sbt will try to get a value from a more general scope, such as the ThisBuild scope. This feature allows you to set a value once in a more general scope, allowing multiple more-specific scopes to inherit the value.


2 Answers

I figured out how you can do this. This solution creates a local Ivy repository, which is compatible with Maven.

You have to set the following values in your build.sbt:

name := "project-name"

organization := "org.example"

version := "0.0.0"

scalaVersion := "2.9.2"

publishTo := Some(Resolver.file("file", new File("/path/to/your/releases"))

After that, you can publish your release

sbt publish

This will print something like the following lines

[info] Set current project to project-name (in build file:/path/to/your/project/)
[info] Updating {file:/path/to/your/project/}default-2e51ea...
[info] Packaging /path/to/your/project/target/scala-2.9.2/project-name_2.9.2-0.0.0-S
NAPSHOT-sources.jar ...
[info] Resolving org.scala-lang#scala-library;2.9.2 ...
[info] Done packaging.
[info] Done updating.
[info] :: delivering :: org.example#project-name_2.9.2;0.0.0 :: 0.0.0 :: release :: Tue Jul 24 15:41:04 CEST 2012
[info]  delivering ivy file to /path/to/your/project/target/scala-2.9.2/ivy-0.0.0.xml
[info] Wrote /path/to/your/project/target/scala-2.9.2/project-name_2.9.2-0.0.0.pom
[info] Packaging /path/to/your/project/target/scala-2.9.2/project-name_2.9.2-0.0.0.jar ...
[info] Done packaging.
[info]  published project-name_2.9.2 to /path/to/your/releases/org/example/project-name_2.9.2/0.0.0-SNAPSHOT/project-name_2.9.2-0.0.0.pom
[info]  published project-name_2.9.2 to /path/to/your/releases/org/example/project-name_2.9.2/0.0.0-SNAPSHOT/project-name_2.9.2-0.0.0.jar
[info]  published project-name_2.9.2 to /path/to/your/releases/org/example/project-name_2.9.2/0.0.0-SNAPSHOT/project-name_2.9.2-0.0.0-sources.jar
[info]  published project-name_2.9.2 to /path/to/your/releases/org/example/project-name_2.9.2/0.0.0-SNAPSHOT/project-name_2.9.2-0.0.0-javadoc.jar
[success] Total time: 1 s, completed 24.07.2012 15:41:05

You can put the generated files on any web server (e.g. http://repo.example.org/) and use it in the build script of another project by adding the following lines to your build.sbt:

resolvers += "Personal repository" at "http://repo.example.org/"

libraryDependencies += "org.example" % "project-name" % "0.0.0"

For more information, see SBT: Getting Started Library Dependencies and SBT: Publishing.

like image 195
pvorb Avatar answered Sep 23 '22 12:09

pvorb


From sbt, you can use

project myproject
[myproject] $ publish-local

Which will publish to your local ivy directory (usually ~/.ivy2/local).

In the output you will see the paths of all the files:

[info] Done packaging.
[info] published myproject_2.9.1 to .../ivy2/...myproject.../poms/myproject_2.9.1.pom
[info] published myproject_2.9.1 to .../ivy2/...myproject.../jars/myproject_2.9.1.jar
[info] published myproject_2.9.1 to .../ivy2/...myproject.../srcs/myproject_2.9.1-sources.jar
[info] published myproject_2.9.1 to .../ivy2/...myproject.../docs/myproject_2.9.1-javadoc.jar
[info] published ivy to .../ivy2/...myproject.../ivys/ivy.xml

Then you can grab those files and upload them to your ftp server.

I would still recommend the approach described in the linked blogpost though. At least that's how we do it. Just a small note on storing credentials. Use the following sbt setting:

val credentials = Credentials(Path.userHome / ".ivy2" / ".my-credentials")

The credentials file will look like this:

realm=Sonatype Nexus Repository Manager
host=nexus.example.com
user=deployment
password=pass

The credentials are the same you use for logging in to the Nexus web interface.

like image 24
Martin Konicek Avatar answered Sep 23 '22 12:09

Martin Konicek