2016-01-17 13 views
10

Ich habe ein Projekt mit der pom.xml Datei unten angegeben. Wenn ich den Befehl mvn clean compile assembly:single install ausgeben will ich Maven eine JAR zu erzeugen, dieProGuard verdeckt JAR nicht mit Abhängigkeiten

  • alle Abhängigkeiten und
  • verschleierte Version meines Code enthält.

Es funktioniert nicht - mein Code ist nicht in der Datei "jar-with-dependencies" verschleiert.

Wenn ich mvn clean compile install ausführen, enthält die resultierende Datei verschleierten Code meiner Anwendung, aber keine Abhängigkeiten.

Was kann ich tun, um eine JAR-Datei mit allen Abhängigkeiten und meinem verschleierten Code zu erstellen?

<?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): die ProGuard Konfiguration geändert, wie unten gezeigt, aber mvn clean compile assembly:single produziert noch eine JAR mit unverschleierte Klassendateien.

<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> 

Update 2 (2016.01.17 20.29 MSK):mvn clean compile assembly:single install ausfällt. Die letzten Nachrichten sind zu sehen here.

Antwort

9

proguard-maven-plugin wird das primäre Artefakt Ihres Projekts verschleiern, nicht das sekundäre Artefakt jar-with-dependencies, dass die maven-assembly-plugin generiert.

Sie müssen das Plugin konfigurieren, dass die jar-with-dependencies durch die Angabe des injar Attribut zu verschleiern:

Gibt den Eingabe jar Namen (oder wars, Ohren, Reißverschlüsse) der Anwendung verarbeitet werden.

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

Jetzt gibt es auch ein Problem in der Reihenfolge der Ausführung von Plugins in Ihrem POM: Wir müssen dafür sorgen, dass die maven-assembly-plugin vor den proguard-maven-plugin ausgeführt wird. Daher ist es am besten, eine explizite Ausführung für maven-assembly-plugin zu definieren, die an die package-Phase gebunden ist, anstatt sie manuell über die Befehlszeile mit assembly:single aufzurufen. Dies wäre die Konfiguration:

<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> 

und dann, Sie müssen nur sicherstellen, dass die proguard-maven-plugin Plugin-Konfiguration nach, dass in Ihrem POM ist.

Wenn Sie das getan haben, führt das Aufrufen von Maven mit mvn clean install zu einem verschleierten Jar mit Abhängigkeiten.


mit Ihrem tatsächlichen POM Um zu testen, habe ich zwei Repositories:

  • https://repo.spongepowered.org/maven die spongeapi Abhängigkeit zu lösen.
  • http://maven.restlet.com, um die org.restlet.jse Abhängigkeiten aufzulösen.

Mit diesen 2 Abhängigkeiten wurden Warnungen von ProGuard erzeugt, weil die org.restlet.ext.jackson Abhängigkeit com.sun.msv.* Klassen verwendet, die nicht auf dem buildpath sind. Da ich denke, dass Ihr Code derzeit funktioniert, bedeutet dies, dass diese Klassen nicht einbezogen werden müssen und dass diese Warnungen ignoriert werden können. Daher habe ich die Option -dontwarn hinzugefügt, damit ProGuard bei einer Warnung keinen Fehler erkennt.

Der letzte POM, für die ich erfolgreich das Glas mit Abhängigkeiten verschleiern konnte, ist die folgende:

<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

ich mit dem gleichen Problem bin stecken und ich habe nicht die Antwort. Warum müssen Sie die Repositories hinzufügen? Die Abhängigkeiten sind bereits in der POM angegeben. Warum braucht Proguard mehr? Außerdem, wo finden Sie das Repository für jede Abhängigkeit? Würde es Ihnen etwas ausmachen, einen Blick auf http://stackoverflow.com/questions/36150297/how-to-assembly-a-project-after-using-proguard-maven-plugin?noredirect=1#comment59941093_36150297 zu werfen – Sharcoux