ProGuard para ofuscação e empacotamento de projetos Java.
Ofuscar e compactar JARs Java com ProGuard
Java promete bytecode portável — mas arquivo JAR é ZIP disfarçado. Abra qualquer .jar no 7-Zip e leia .class decompilado em minutos. Como arquiteto que entrega desktop e serviços a clientes TEK Softwares, não confundo ofuscação com segurança absoluta; trato como barreira de custo contra engenharia reversa casual e redução de tamanho de deploy. Atualizo este guia removendo atalhos obsoletos (download manual de rt.jar, build.xml gigante anexado) e focando ProGuard oficial integrado a Maven/Gradle em 2026.
O que ProGuard faz
ProGuard (GuardSquare) ofusca nomes, remove código morto, otimiza bytecode e pode shrink dependências não usadas. Objetivo: dificultar leitura humana e diminuir artefato final — não impedir determined attacker com tempo ilimitado.
Integração Maven moderna
Use plugin oficial no pom.xml — sem copiar proguard.jar manualmente para raiz do projeto:
<plugin>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<version>2.6.1</version>
<executions>
<execution>
<phase>package</phase>
<goals><goal>proguard</goal></goals>
</execution>
</executions>
</plugin>
Arquivo proguard.conf versionado lista keep rules para reflexão, serialização, JNI e entry point main.
Regras keep essenciais
-keep public class com.tek.app.Main { public static void main(java.lang.String[]); }- Manter anotações JAX-RS/JPA se usar reflexão runtime.
- Manter enum values serializados em API pública.
- Não ofuscar demais libs Spring Boot sem testar — beans por nome quebram.
Gradle alternativa
plugins { id 'com.guardsquare.proguard' version '7.6.0' }
proguard { configuration file('proguard-rules.pro') }
Fat JAR versus modular
Empacotar todas libs em um uber-jar simplifica entrega desktop; ProGuard shrink antes do shade plugin. Cuidado: assinatura JAR e manifest Main-Class corretos. Teste execução pós-ofuscação em máquina limpa — erro comum ClassNotFoundException em classe removida agressivamente.
Não use rt.jar manual
Post antigo sugeria baixar rt.jar — obsoleto desde modular JDK 9+. ProGuard consome jmods ou classpath do JDK instalado. Configure <javaHome> no plugin ou use toolchain Maven 17/21. Detalhes ambiente Mac: JAVA_HOME no Mac.
Testes pós-ofuscação
Suite automatizada roda no JAR ofuscado antes de release. Smoke test manual: login, fluxo fiscal crítico, impressão. CI bloqueia se testes falham — CI/CD enxuto.
Limitações honestas
Decompiladores (CFR, Fernflower) recuperam lógica com esforço. Segredos em código cliente são sempre extraíveis — use servidor para chaves. Ofuscação protege IP comercial moderadamente, não dados sensíveis.
Alternativas
DashO comercial, GraalVM native-image (binário sem bytecode JVM clássico), mover lógica sensível para API backend. Microsserviços reduzem superfície desktop — quando migrar.
Debugging stack trace ofuscado
Gere mapping.txt ProGuard; guarde por release semver. Deobfuscate stack produção com retrace.sh. Sem mapping, incident P1 vira adivinhação.
Assinatura JAR e notarização Mac
codesign app bundle Mac entrega desktop; Apple notarization gatekeeper. Ofuscação não remove necessidade certificado Developer ID.
Legal e licenças
Verifique licença ProGuard commercial se app enterprise grande. LGPL dependencies shaded — compliance review cliente banco.
R8 Android versus ProGuard JVM
Android Gradle Plugin R8 default — conceitos keep rules similares. Desktop/server JVM ainda ProGuard ou GraalVM native. Não misture doc Android com ERP server confundindo time.
Spring Boot executable jar
spring-boot-maven-plugin repackage antes proguard ou proguard after repackage — ordem importa teste ambas. libs spring-boot-starter-web keep controllers mappings annotations.
Distribuição cliente TEK
Checksum SHA256 publicado download portal. Assinatura GPG opcional enterprise. Changelog versão ofuscada mapping archived secure S3.
Pipeline release TEK desktop
Tag git semver maven package proguard verify tests sign notarize mac upload portal checksum customer email release notes bullets fix feature sem jargon interno. Cliente baixa uma vez jar unico nao precisa classpath manual.
Obfuscation level adjust: -dontoptimize first release debug perf issue then enable optimize incremental. Tradeoff startup time jar size stack trace readability operacao.
Shrink versus optimize tradeoffs
ProGuard shrink remove classe aparentemente morta reflexao Spring Hibernate keep rules extensas teste regressao completo pos shrink. Optimize pode quebrar serializacao gson jackson campos renomeados configure dontwarn dontnote incremental.
Entrega cliente enterprise checklist
Artefato assinado digitalmente changelog semver mapping proguard archived suporte seis meses instruções JAVA_HOME link blog mac windows linux tripla plataforma se escopo multi OS. Treinamento uma hora gravado instalacao licenca seat count honrado.
Mantenha branch release/* protegida tags assinadas GPG opcional política empresa. Histórico git limpo facilita bisect quando cliente reporta bug versão 2.4.1 — reproduz exato commit tag not jar nome genérico app.jar.
Prática adicional TEK Softwares: revise este tópico com stakeholder operacional antes de fechar sprint — alinhamento negócio evita retrabalho custoso em produção fiscal e integrações críticas ERP que atendem milhares documentos eletrônicos mensais sem downtime planejado inadequado.
Documente lições aprendidas DECISIONS.md link artigos relacionados blog tiagoek manutenção longo prazo conteúdo AdSense qualidade leitor desenvolvedor arquiteto tom primeira pessoa experiência vinte anos mercado brasileiro software sob medida impressão 3D marca TEK unificada confiança cliente indicacao orgânica composição juros reputação técnica honestidade entrega previsível pipeline verde segurança prepared statement parametros pentaho cfop correto.
Conclusão
Ofuscar e compactar projetos Java com ProGuard oficial via Maven/Gradle é caminho sustentável em 2026 — sem build.xml arquivado nem rt.jar pirata. Documente keep rules, teste artefato final e combine com arquitetura que não confia em obscuridade. Na TEK Softwares, cliente recebe JAR único ofuscado + checksum SHA256 — profissionalismo que complementa qualidade do código fonte interno.