SBT: Guia Prático para Build, Teste e Empacotamento em Scala
SBT (Simple Build Tool) é a ferramenta de construção padrão para projetos Scala. Ele oferece uma maneira consistente e poderosa de gerenciar dependências, compilar código, executar testes e empacotar sua aplicação. Este guia fornece um passo a passo prático sobre como usar o SBT de forma eficaz.
Pré-requisitos
Antes de começar, certifique-se de ter o seguinte instalado:
- Java Development Kit (JDK) 8 ou superior
- SBT (geralmente instalado via gerenciador de pacotes do sistema, como `brew install sbt` no macOS ou `apt-get install sbt` no Linux)
- Um editor de texto ou IDE (IntelliJ IDEA, VS Code com Scala Metals, etc.)
Criando um Novo Projeto SBT
A maneira mais fácil de começar é criar um diretório para o seu projeto e usar o comando `sbt new` para gerar um projeto esqueleto. Existem vários templates disponíveis; usaremos o template básico `scala/hello-world.g8` neste exemplo.
mkdir meu-projeto-scala
cd meu-projeto-scala
sbt new scala/hello-world.g8
O SBT irá solicitar o nome da sua organização (organization) e o nome do projeto (name). Preencha-os de acordo com as suas necessidades. Por exemplo:
name [My Hello World App]: MeuProjeto
organization [com.example]: com.minhaorganizacao
Após a conclusão, você terá uma estrutura de diretório semelhante a esta:
meu-projeto-scala/
├── build.sbt
├── project/
│ └── plugins.sbt
└── src/
└── main/
└── scala/
└── Main.scala
Entendendo os Arquivos Principais
- build.sbt: Este é o arquivo de construção principal do seu projeto. Ele define as configurações do projeto, dependências e tarefas.
- project/plugins.sbt: Este arquivo é usado para adicionar plugins ao SBT que estendem sua funcionalidade.
- src/main/scala/: Este diretório contém o código fonte da sua aplicação.
Configurando o build.sbt
O arquivo `build.sbt` contém as definições do seu projeto. Aqui está um exemplo básico:
name := "MeuProjeto"
organization := "com.minhaorganizacao"
version := "1.0-SNAPSHOT"
scalaVersion := "2.13.8"
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.12" % "test"
Vamos analisar as principais configurações:
- name: Define o nome do seu projeto.
- organization: Define o identificador da sua organização.
- version: Define a versão do seu projeto. “1.0-SNAPSHOT” indica uma versão em desenvolvimento.
- scalaVersion: Define a versão do Scala que você está usando.
- libraryDependencies: Define as dependências do seu projeto. Neste caso, estamos adicionando ScalaTest para testes. O `%%` garante que a versão do Scala seja adicionada ao nome da dependência (artefato). `% “test”` indica que esta dependência é usada apenas durante os testes.
Adicionando Dependências
Para adicionar mais dependências, use a sintaxe `libraryDependencies +=` seguido pela string de dependência no formato “groupId” %% “artifactId” % “version”. Por exemplo, para adicionar a biblioteca Akka HTTP:
libraryDependencies += "com.typesafe.akka" %% "akka-http" % "10.2.9"
Não se esqueça de recarregar o SBT após modificar o `build.sbt`. Abra um terminal na raiz do seu projeto e execute o comando `sbt reload`.
Compilando e Executando
Para compilar seu projeto, execute o comando `sbt compile` no terminal.
sbt compile
Para executar sua aplicação (assumindo que você tenha um ponto de entrada `main` definido), use o comando `sbt run`.
sbt run
Se você tiver várias classes `main`, o SBT perguntará qual você deseja executar.
Testando sua Aplicação
Para executar os testes, use o comando `sbt test`.
sbt test
Certifique-se de ter as dependências de teste adequadas configuradas no `build.sbt`. O exemplo acima já inclui ScalaTest. Crie seus arquivos de teste no diretório `src/test/scala/`.
Um exemplo de teste usando ScalaTest poderia ser:
import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
class MeuTesteSpec extends AnyFlatSpec with Matchers {
"Uma soma" should "retornar o resultado correto" in {
1 + 1 should be (2)
}
}
Empacotando sua Aplicação
Existem várias maneiras de empacotar sua aplicação com o SBT. Uma das mais comuns é criar um JAR executável (uberjar) que contém todas as dependências.
Para fazer isso, você pode usar o plugin sbt-assembly. Adicione a seguinte linha ao `project/plugins.sbt`:
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "1.1.0")
Recarregue o SBT com `sbt reload`. Em seguida, execute o comando `sbt assembly`.
sbt assembly
Isso irá criar um JAR executável no diretório `target/scala-2.13/`. Você pode executar o JAR usando o comando `java -jar nome-do-jar.jar`.
Outra opção é empacotar sua aplicação como um container Docker. Para isso, você pode usar o plugin sbt-native-packager. Ele oferece suporte para vários formatos de pacote, incluindo Docker.
Primeiro, adicione o plugin ao `project/plugins.sbt`:
addSbtPlugin("com.github.sbt" % "sbt-native-packager" % "1.9.14")
Recarregue o SBT (`sbt reload`). Em seguida, no seu `build.sbt`, adicione:
import NativePackagerHelper._
enablePlugins(JavaAppPackaging)
maintainer := "[email protected]"
dockerBaseImage := "openjdk:11-jre-slim"
Execute o comando `sbt docker:publishLocal` para construir e publicar a imagem Docker localmente.
sbt docker:publishLocal
Você pode então executar o container Docker usando o comando `docker run nome-da-imagem`.
Dicas e Truques
- Use `~compile` para compilação automática: O SBT pode monitorar as alterações no seu código e recompilar automaticamente.
- `sbt console` para o REPL: Inicia o REPL Scala com as dependências do seu projeto já carregadas.
- `sbt dependencyTree` para visualizar dependências: Mostra a árvore de dependências completa do seu projeto, útil para identificar conflitos.
- Organize seu `build.sbt` com `settings`: Para projetos maiores, use `settings` para organizar as configurações e evitar repetição.
Conclusão
SBT é uma ferramenta essencial para o desenvolvimento de projetos Scala. Este guia forneceu uma visão geral prática de como usar o SBT para build, teste e empacotamento. Ao dominar os conceitos básicos, você poderá criar e gerenciar projetos Scala complexos de forma eficiente.
Perguntas Frequentes (FAQs)
Como resolvo conflitos de dependência no SBT?
Use o comando `sbt dependencyTree` para visualizar a árvore de dependências e identificar os conflitos. Você pode então excluir explicitamente versões conflitantes ou usar estratégias de resolução de conflitos no seu `build.sbt`.
Como defino variáveis de ambiente para minha aplicação no SBT?
Você pode definir variáveis de ambiente no seu `build.sbt` ou passá-las como argumentos ao executar o SBT. Por exemplo, use `javaOptions += “-Dmy.property=value”` no `build.sbt` ou `sbt -Dmy.property=value run` na linha de comando.
Como faço para adicionar um repositório Maven personalizado ao SBT?
Adicione `resolvers += “Meu Repositório” at “http://meu-repositorio.com/maven”` ao seu `build.sbt`. Substitua o URL pelo endereço correto do seu repositório Maven.
O que significa o erro “unresolved dependency” no SBT?
Este erro indica que o SBT não conseguiu encontrar uma dependência especificada no seu `build.sbt`. Verifique se a dependência está escrita corretamente, se o repositório correto está configurado e se você tem acesso à rede.
Como faço para atualizar a versão do SBT do meu projeto?
A versão do SBT usada para construir seu projeto é especificada em `project/build.properties`. Altere o valor da propriedade `sbt.version` para a versão desejada e recarregue o projeto (`sbt reload`).
Como executar um subprojeto específico em um projeto multi-módulo?
Use o comando `sbt projeto/run`, substituindo “projeto” pelo nome do subprojeto que você deseja executar.
