Rodando o Play com SBT em tempo real
O Play Framework com SBT é uma combinação que muita gente usa no dia a dia, mas tem detalhes que não aparecem na documentação oficial. Quando você roda o projeto no modo desenvolvimento com play sbt ao vivo, ele recompila automaticamente e reinicia a aplicação sempre que detecta mudanças nos arquivos. Isso parece simples, mas na prática tem armadilhas.
Como fazer o play sbt ao vivo funcionar
O comando básico é bem direto. Se você já tem o projeto criado, entra na pasta e roda: sbt run
Isso inicia o servidor em modo debug, ouvindo na porta 9000 por padrão. O Reload funciona assim: o SBT monitora os arquivos .scala, .java e .conf do projeto. Quando detecta alteração, recompila e reinicia. A maioria dos devs acha que isso é instantâneo. Não é. Em projetos grandes, a recompilação pode levar de 30 segundos a 2 minutos. Eu já vi casos onde o tempo passava de 5 minutos porque tinha dependências mal configuradas ou importações circulares. O problema mais comum é o cache do SBT ficar corrompido. Quando isso acontece, a recompilação não respeita as alterações e o sistema reinicia com código antigo. A solução foi sempre limpar o cache com sbt clean e depois rodar novamente. Já perdi horas achando que era bug no código quando na verdade era apenas cache velho.
👉 Clique no botão abaixo para saber mais sobre o assunto!
O que a documentação não conta sobre dependências
Uma coisa que pega muita gente desprevenida são as dependências do Play que precisam estar na versão compatível com a JVM que você está usando. Eu tive um caso onde atualizei para o Java 17 e o Play travava na inicialização porque uma biblioteca de terceiros ainda não era compatível. O erro aparecia como uma exception genérica sem traceback útil. A solução foi forçar o uso do Java 11 naquele projeto específico através do arquivo ~/.sbtconfig ou usando javaHome no arquivo build.sbt. Outro ponto importante: o modo compileOnly das dependências. Muita gente coloca bibliotecas como compileOnly quando na verdade precisam ser runtime. O resultado é que a aplicação compila normalmente no SBT mas quebra quando você faz deploy. Sempre verifique se todas as dependências estão como implementation, a menos que tenha um motivo específico para usar compileOnly.
Problemas comuns e soluções práticas
O primeiro problema que todo mundo encontra é o servidor não reiniciar após mudar um arquivo. Geralmente isso acontece quando o arquivo modificado não está dentro do classpath do projeto. Verifique se o arquivo está em src/main/scala ou src/main/java. Arquivos em src/test/scala não acionam o reload do servidor principal. Outro caso frequente é a porta 9000 estar ocupada. O Play não substitui processos automaticamente. Se você tem outra instância rodando, precisa matar o processo com kill -9 ou usar fuser -k 9000/tcp. Já vi gente reiniciar o computador inteiro porque o SBT não conseguia iniciar.
Quando o projeto tem múltiplos subprojetos no build.sbt, o reload pode ser lento porque o SBT recompila tudo. Nesse caso, use sbt "project nome-do-projeto" run para rodar apenas o subprojeto desejado. Isso corta o tempo de inicialização pela metade em projetos monorepo. Sobre o play sbt ao vivo, a experiência real é que funciona muito bem para desenvolvimento local em projetos pequenos e médios. Para projetos grandes com muitas dependências externas, o tempo de recompilação pode se tornar um gargalo sério. Nesses casos, considerar o uso do Ammonite REPL ou do Scala CLI pode ser mais produtivo, embora ofereça menos funcionalidades de hot reload automáticas.