Você não pode impedir a extração do conteúdo de um arquivo .jar, se encriptar seu arquivo .jar, precisaria de um programa próprio para conseguir carregar as classes dentro dele.
Um arquivo .jar
, nada mais é do que um “pacotão de arquivos” gerado no formato .zip
e não necessariamente ele precisa estar compactado.
Em princípio, você não distribui seu código-fonte (arquivos .java
) com um .jar
, ele deveria conter somente os .class
e recursos necessários para a execução de sua aplicação.
Mas, existem muitas ferramentas que tentam reconstruir um arquivo .java
a partir dos .class
descompilados, lembrando que o próprio JDK vem com um descompilador, o javap
.
O que você pode fazer para tornar seu código mais complicado de descompilar, é utilizar um ofuscador de código. Ofuscadores pegam o seu .class
e alteram algumas coisas nele, mas mantendo o contrato da compatibilidade com a especificação da máquina virtual java. Eles podem, por exemplo:
- criar sobrecargas de métodos com mesmo tipo de parâmetros, mas com retorno diferente;
- alterar os fluxos lógicos utilizando labels e instruções goto;
- utilizar a palavra reservada const em algumas variáveis;
Enfim, fazem a maior “bagunça” no bytecode, mas mantendo a compatibilidade com a máquina virtual Java. As alterações que citei por exemplo, não são válidas para o compilador Java, mas a máquina virtual suporta essas operações.
Então, se alguém usar alguma ferramenta de engenharia reversa, que gere arquivos .java
a partir dos .class
ofuscados, vai ser complicado refatorar esses fontes obtidos para poder compilá-los novamente.
Existem ofuscadores gratuitos como por exemplo o ProGuard e outros pagos, como o Zelix KlassMaster.