2016-01-17 19 views
10

Ho un progetto con il file pom.xml indicato di seguito. Quando ho Eseguire il comando mvn clean compile assembly:single install voglio Maven per generare un JAR, che contieneProGuard non offusca JAR con le dipendenze

  • tutte le dipendenze e le
  • versione offuscato del mio codice.

Non funziona: il mio codice non è offuscato nel file "jar-with-dependencies".

Quando eseguo mvn clean compile install il file risultante contiene codice offuscato della mia applicazione, ma nessuna dipendenza.

Cosa posso fare per avere un file JAR con tutte le dipendenze e il mio codice offuscato?

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.mycompany</groupId> 
    <artifactId>myproduct</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>jar</packaging> 
    <properties> 
     <restlet-version>2.3.5</restlet-version> 
    </properties> 
    <dependencies> 
     <dependency> 
      <groupId>org.spongepowered</groupId> 
      <artifactId>spongeapi</artifactId> 
      <version>3.0.0</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.12</version> 
     </dependency> 
     <dependency> 
      <groupId>org.easytesting</groupId> 
      <artifactId>fest-assert-core</artifactId> 
      <version>2.0M8</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.mockito</groupId> 
      <artifactId>mockito-core</artifactId> 
      <version>1.10.19</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.restlet.jse</groupId> 
      <artifactId>org.restlet</artifactId> 
      <version>${restlet-version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.restlet.jse</groupId> 
      <artifactId>org.restlet.ext.jackson</artifactId> 
      <version>${restlet-version}</version> 
     </dependency> 
     <dependency> 
      <groupId>com.googlecode.json-simple</groupId> 
      <artifactId>json-simple</artifactId> 
      <version>1.1.1</version> 
     </dependency> 
    </dependencies> 
    <build> 
     <resources> 
      <resource> 
       <directory>${project.basedir}/src/main/resources</directory> 
       <filtering>true</filtering> 
      </resource> 
     </resources> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.3</version> 
       <configuration> 
        <source>1.8</source> 
        <target>1.8</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>templating-maven-plugin</artifactId> 
       <version>1.0-alpha-3</version> 
       <executions> 
        <execution> 
         <id>filter-src</id> 
         <goals> 
          <goal>filter-sources</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <configuration> 
        <descriptorRefs> 
         <descriptorRef>jar-with-dependencies</descriptorRef> 
        </descriptorRefs> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>com.github.wvengen</groupId> 
       <artifactId>proguard-maven-plugin</artifactId> 
       <version>2.0.8</version> 
       <executions> 
        <execution> 
         <phase>package</phase> 
         <goals><goal>proguard</goal></goals> 
        </execution> 
       </executions> 
       <configuration> 
        <proguardVersion>5.2</proguardVersion> 
        <options> 
         <option>-allowaccessmodification</option> 
         <option>-dontoptimize</option> 
         <option>-dontshrink</option> 
         <option>-dontnote</option> 
         <option>-keepattributes Signature</option> 
         <option>-keep class com.mycompany.MyPlugin { *; }</option> 
        </options> 
        <libs> 
         <lib>${java.home}/lib/rt.jar</lib> 
        </libs> 
        <dependencies> 
         <dependency> 
          <groupId>net.sf.proguard</groupId> 
          <artifactId>proguard-base</artifactId> 
          <version>5.2</version> 
          <scope>runtime</scope> 
         </dependency> 
        </dependencies> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

Update 1 (2016/01/17 19:54 MSK): modificato la configurazione ProGuard come mostrato di seguito, ma mvn clean compile assembly:single produce ancora un vaso con file di classe unobfuscated.

<plugin> 
    <groupId>com.github.wvengen</groupId> 
    <artifactId>proguard-maven-plugin</artifactId> 
    <version>2.0.8</version> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals><goal>proguard</goal></goals> 
     </execution> 
    </executions> 
    <configuration> 
     <proguardVersion>5.2</proguardVersion> 
     <options> 
      <option>-allowaccessmodification</option> 
      <option>-dontoptimize</option> 
      <option>-dontshrink</option> 
      <option>-dontnote</option> 
      <option>-keepattributes Signature</option> 
      <option>-keep class com.mycompany.MyPlugin { *; }</option> 
     </options> 
     <injar>${project.build.finalName}-jar-with-dependencies.jar</injar> 
     <libs> 
      <lib>${java.home}/lib/rt.jar</lib> 
     </libs> 
     <dependencies> 
      <dependency> 
       <groupId>net.sf.proguard</groupId> 
       <artifactId>proguard-base</artifactId> 
       <version>5.2</version> 
       <scope>runtime</scope> 
      </dependency> 
     </dependencies> 
    </configuration> 
</plugin> 

Aggiornamento 2 (2016/01/17 20:29 MSK):mvn clean compile assembly:single install fallisce. Gli ultimi messaggi possono essere visti here.

risposta

9

proguard-maven-plugin offuscerà l'artefatto principale del progetto, non l'artefatto secondario jar-with-dependencies generato da maven-assembly-plugin.

è necessario configurare il plugin per offuscare la jar-with-dependencies specificando l'attributo injar:

Specifica il nome vaso ingresso (o guerre, le orecchie, cerniere) dell'applicazione da elaborare.

<injar>${project.build.finalName}-jar-with-dependencies.jar</injar> 

Ora, c'è anche un problema nel l'ordine di esecuzione di plugin nel vostro POM: dobbiamo fare in modo che il maven-assembly-plugin viene eseguita prima della proguard-maven-plugin. Pertanto, è meglio definire un'esecuzione esplicita per il maven-assembly-plugin associato alla fase package invece di richiamarlo manualmente dalla riga di comando con assembly:single. Questa sarebbe la configurazione:

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <executions> 
     <execution> 
      <id>assembly</id> 
      <goals> 
       <goal>single</goal> 
      </goals> 
      <phase>package</phase> 
      <configuration> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

e poi, basta fare in modo che la configurazione proguard-maven-plugin plugin è dopo che nel vostro POM.

Avendo fatto ciò, invocando Maven con mvn clean install si otterrà un vaso offuscato con dipendenze.


Per provare con il tuo attuale POM, ho aggiunto due repository:

  • https://repo.spongepowered.org/maven per risolvere il spongeapi dipendenza.
  • http://maven.restlet.com per risolvere le dipendenze org.restlet.jse.

Con quei 2 dipendenze, gli avvertimenti sono stati generati dal ProGuard perché la dipendenza org.restlet.ext.jackson utilizza com.sun.msv.* classi che non sono sulla buildpath. Dato che immagino che il tuo codice funzioni attualmente, vuol dire che non è necessario includere quelle classi e che tali avvisi possono essere ignorati. Come tale, ho aggiunto l'opzione -dontwarn in modo che ProGuard non commetta errori quando c'è un avviso.

Il POM finale per il quale sono stato in grado di offuscare con successo il vaso con le dipendenze è la seguente:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.mycompany</groupId> 
    <artifactId>myproduct</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <repositories> 
     <repository> 
      <id>spongepowered</id> 
      <url>https://repo.spongepowered.org/maven</url> 
     </repository> 
     <repository> 
      <id>restlet</id> 
      <url>http://maven.restlet.com</url> 
     </repository> 
    </repositories> 
    <properties> 
     <restlet-version>2.3.5</restlet-version> 
    </properties> 
    <build> 
     <resources> 
      <resource> 
       <directory>${project.basedir}/src/main/resources</directory> 
       <filtering>true</filtering> 
      </resource> 
     </resources> 
     <plugins> 
      <plugin> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.3</version> 
       <configuration> 
        <source>1.8</source> 
        <target>1.8</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>templating-maven-plugin</artifactId> 
       <version>1.0-alpha-3</version> 
       <executions> 
        <execution> 
         <id>filter-src</id> 
         <goals> 
          <goal>filter-sources</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <executions> 
        <execution> 
         <id>assembly</id> 
         <goals> 
          <goal>single</goal> 
         </goals> 
         <phase>package</phase> 
         <configuration> 
          <descriptorRefs> 
           <descriptorRef>jar-with-dependencies</descriptorRef> 
          </descriptorRefs> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
       <groupId>com.github.wvengen</groupId> 
       <artifactId>proguard-maven-plugin</artifactId> 
       <version>2.0.8</version> 
       <executions> 
        <execution> 
         <phase>package</phase> 
         <goals><goal>proguard</goal></goals> 
         <configuration> 
          <injar>${project.build.finalName}-jar-with-dependencies.jar</injar> <!-- make sure to obfuscate the jar with dependencies --> 
          <proguardVersion>5.2</proguardVersion> 
          <options> 
           <option>-allowaccessmodification</option> 
           <option>-dontoptimize</option> 
           <option>-dontshrink</option> 
           <option>-dontnote</option> 
           <option>-dontwarn</option> <!-- added option to ignore com.sun missing classes --> 
           <option>-keepattributes Signature</option> 
           <option>-keep class com.mycompany.MyPlugin { *; }</option> 
          </options> 
          <libs> 
           <lib>${java.home}/lib/rt.jar</lib> 
          </libs> 
          <dependencies> 
           <dependency> 
            <groupId>net.sf.proguard</groupId> 
            <artifactId>proguard-base</artifactId> 
            <version>5.2</version> 
            <scope>runtime</scope> 
           </dependency> 
          </dependencies> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
    <dependencies> 
     <dependency> 
      <groupId>org.spongepowered</groupId> 
      <artifactId>spongeapi</artifactId> 
      <version>3.0.0</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.12</version> 
     </dependency> 
     <dependency> 
      <groupId>org.easytesting</groupId> 
      <artifactId>fest-assert-core</artifactId> 
      <version>2.0M8</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.mockito</groupId> 
      <artifactId>mockito-core</artifactId> 
      <version>1.10.19</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.restlet.jse</groupId> 
      <artifactId>org.restlet</artifactId> 
      <version>${restlet-version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.restlet.jse</groupId> 
      <artifactId>org.restlet.ext.jackson</artifactId> 
      <version>${restlet-version}</version> 
     </dependency> 
     <dependency> 
      <groupId>com.googlecode.json-simple</groupId> 
      <artifactId>json-simple</artifactId> 
      <version>1.1.1</version> 
     </dependency> 
    </dependencies> 
</project> 
+0

mi sono bloccato con lo stesso problema e non ho ricevuto la tua risposta. Perché hai bisogno di aggiungere i repository? Le dipendenze sono già specificate nel pom. Perché Proguard ha bisogno di più? Inoltre, dove trovi il repository per ogni dipendenza? Ti dispiacerebbe dare un'occhiata a http://stackoverflow.com/questions/36150297/how-to-assembly-a-project-after-using-proguard-maven-plugin?noredirect=1#comment59941093_36150297 – Sharcoux

Problemi correlati