2009-07-12 12 views
14

Ich benutze ProGuard, um meinen Code zu verschleiern. Mein Projekt besteht aus einigen Modulen, die unabhängig voneinander verschleiert sind.Obfuscating-Methode mit throws-Klausel

Eine Bibliothek enthält eine Schnittstelle;

public interface IFace { 
    public int methodA(boolean b) throws CustomException; 
} 

Eine andere Bibliothek bietet eine implmentation

public class IFaceImpl implements IFace { 
    @Override 
    public int methodA(boolean b) throws CustomException { 
     return 0; 
    } 
} 

Die Bibliothek mit der Schnittstelle zuerst gebaut wird, und die zweite gegen die verschleierten Version gebaut wird. Leider schlägt die Kompilierung auf @Override fehl, da die Schnittstelle die throws-Klausel nicht enthält.

Ich habe proguard die Schnittstelle und alle ihre Mitglieder behalten, aber ich kann nicht herausfinden, wie man die throws-Klausel hält.

Antwort

35

Ich fand es heraus.

-keepattributes Exceptions

+0

Vielen Dank! Dies war ein Lebensverschwender ohne deine Antwort. – Sileria

+0

Große Zeitersparnis. Vielen Dank. – dazed

0

Beispiel mit Maven:

<plugin> 
    <groupId>com.github.wvengen</groupId> 
    <artifactId>proguard-maven-plugin</artifactId> 
    <version>2.0.6</version> 
    <dependencies> 
     <dependency> 
      <groupId>net.sf.proguard</groupId> 
      <artifactId>proguard-base</artifactId> 
      <version>4.10</version> 
     </dependency> 
    </dependencies> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>proguard</goal> 
      </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <proguardVersion>4.10</proguardVersion> 
     <options> 
      <option>-keepattributes Exceptions</option> 
      <option>-keep public class some.package.SomeClass{*;}</option> 
     </options> 
     <libs> 
      <lib>${java.home}/lib/rt.jar</lib> 
      <lib>${java.home}/lib/jce.jar</lib> 
      <lib>${java.home}/lib/jsse.jar</lib> 
     </libs> 
    </configuration> 
</plugin>