Forum Pplware
Java Maven Proguard - Versão de Impressão

+- Forum Pplware (http://forum.pplware.com)
+-- Fórum: Mais Tech (/forumdisplay.php?fid=11)
+--- Fórum: Programação e Web (/forumdisplay.php?fid=16)
+--- Tópico: Java Maven Proguard (/showthread.php?tid=7076)



Java Maven Proguard - Eng.Simões - 08-09-2010 19:57

Boa tarde.
Gostaria de uma pequena ajuda com um programa de ofuscação de código java.

Estou a desenvolver uma livraria em java no Eclipse.
Uso o maven para me gerir as dependências.

No final exporto a minha livraria e tenho dois ficheiros.
O out.jar e o out-comDependencias.jar.

Agora queria usar como referencia externa noutro projecto a minha livraria.

1º Problema:
Se usar o out-comDependencias.jar. que inclui as dependencias que o maven adicionou
por exemplo XmlRpc (org.apache.xmlrpc), consigo compilar direito e correr direito.

Se usar o out.jar consigo compilar correctamente mas ao executar o programa estoira pois não encontra o XmlRpc. . .

Conclui que devia usar o out-comDependencias.jar, corrijam-me se estiver errado e tiver algum problema no meu pom.

2º Problema.
Ao tentar ofuscar com o proguard estou a usar a seguinte configuração:
-injars out1.jar
-outjars out2.jar
-libraryjars /usr/lib/jvm/java-6-sun-1.6.0.20/jre/lib/rt.jar

-keep public class UseCase.App

-keepclasseswithmembernames class ** {
native <methods>;
}

-useuniqueclassmembernames
-dontnote

Já experimentei mil combinações diferentes mas achei por bem colocar uma básica.

Cenários:
Jar 1: Exportado a partir do novo projecto com livraria out.jar
Jar 2: Exportado a partir do novo projecto com livraria out-comDependencias.jar

Ao tentar passar o proguard no Jar1, ele funciona e como seria de esperar, o programa vai estoirar pois falta-lhe a referencia para o XmlRpc

Ao tentar passar o proguard no Jar2, não funciona.
O final do log é:

Warning: library class com.sun.org.apache.xml.internal.dtm.ref.IncrementalSAXSource depends on program class org.xml.sax.InputSource
Warning: there were 134 unresolved references to classes or interfaces.
You may need to specify additional library jars (using '-libraryjars'),
or perhaps the '-dontskipnonpubliclibraryclasses' option.
Warning: there were 2928 instances of library classes depending on program classes.
You must avoid such dependencies, since the program classes will
be processed, while the library classes will remain unchanged.
Error: Please correct the above warnings first.


Resumindo, são 2928 linhas a indicar que algo depende de algo no meu programa.

Segundo a página da proguard:
"Warning: library class ... depends on program class ...
If any of your library classes depend on your program classes, by extending, implementing or just referencing them, your processed code will generally be unusable. Program classes can depend on library classes, but not the other way around. Program classes are processed, while library classes always remain unchanged. It is therefore impossible to adapt references from library classes to program classes, for instance if the program classes are renamed. You should define a clean separation between program code and library code, and try again."

O que é mau. . .

Preciso de ajuda.
Tenho de gerar o binario final entretanto e preciso que os metodos presentes na biblioteca estejam escondidos.
Aceito outras soluções concorrentes ao proguard.

De notar que consigo ofuscar outros projectos, a principal questão aqui deve-se à minha livraria estar a usar o maven para gerir dependencias e agora o proguard não ver essas dependencias.
Já adicionei o repositorio do maven as configurações do proguard.
Ja experimentei usar o plugin do proguard no maven, nem assim . . .

Alguém consegue dar uma ajuda?

Agradecia muito


RE: Java Maven Proguard - Eng.Simões - 15-09-2010 14:38

Já encontrei uma solução.

Ofuscar a livraria tendo o cuidado em manter publicos as classes e metodos que quero usar depois.
Não passar as dependencias do maven.

No novo projecto é obrigatório incluir as dependencias anteriores incluidas no maven.
Se não se fizer isso, o projecto compila muito bem, mas quando necessitar desse código, vai tudo ao ar.