2009-05-19 6 views
17

Ich versuche, Maven mit ProGuard arbeiten zu lassen.Maven, Proguard und Assembly Probleme

Was ich will, erreichen, ist die folgende:

  • Run ProGuard über meine Quelldateien und produzieren Klassen verschleierten

  • Erstellen Sie eine Manifest-Datei, die die Hauptklasse verweist, so dass ich es ausführen kann als ein Glas

  • Entpacken Sie alle zugehörigen Bibliotheksgläser und erstellen Sie ein riesiges Glas, das sie alle enthält. Diese Datei sollte nur mit .class- und .xml-Dateien in Kontakt kommen.

  • Assemblieren Sie sie in. Zip-und tar.gz-Dateien, die verschiedene README.txt-Dateien und so weiter enthalten.

Bisher habe ich so etwas wie dieses bekam:

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <version>2.2</version> 
      <configuration> 
       <archive> 
        <manifest> 
         <mainClass>com.class.path.MainClass</mainClass> 
        </manifest> 
       </archive> 
       <includes> 
        <include>**/*.class</include> 
        <include>**/*.xml</include> 
       </includes> 
      </configuration> 
     </plugin> 

     <plugin> 
      <groupId>com.pyx4me</groupId> 
      <artifactId>proguard-maven-plugin</artifactId> 
      <configuration> 
       <options> 
        <option>-allowaccessmodification</option> 
       </options> 
       <obfuscate>true</obfuscate> 
       <injar>classes</injar> 
       <outjar>${project.build.finalName}.jar</outjar> 
       <outputDirectory>${project.build.directory}</outputDirectory> 
       <proguardInclude>src/main/assembly/proguard.conf</proguardInclude> 
       <libs> 
        lib/rt.jar</lib> 
       </libs> 
      </configuration> 
      <executions> 
       <execution> 
        <phase>process-classes</phase> 
        <goals> 
         <goal>proguard</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

     <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>assembly</id> 
        <phase>package</phase> 
        <goals> 
         <goal>assembly</goal> 
        </goals> 
        <configuration> 
         <descriptors> 
          <descriptor> 
           src/main/assembly/bin.xml 
          </descriptor> 
         </descriptors> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 

Aber ich bin keine Freude haben. Kann mir jemand dazu einen ungefähren Hinweis geben?

Vielen Dank im Voraus, Matt

+0

@starblue Maven nicht irgendein '[Baugruppen]' Konzept. "[Assembly]" ist jedoch ein sehr gültiger. Hören Sie also auf, sich so zu benehmen, als seien die Tags für eindeutige Domains, und schließen Sie alles aus, was nicht mit Ihrer Vision der Nutzung übereinstimmt. Tags dienen zum Festlegen, fügen weitere Einschränkungen hinzu. Verbiete mir nicht, einen Tag zu benutzen, der auch für Maven gilt. Das ist verdammt nervig. –

+0

http://maven.apache.org/plugins/maven-assembly-plugin/: Dieses Plugin erzeugt "Assemblies". – starblue

Antwort

9

Hier ist die Konfiguration, die gearbeitet hatte hat für mich

<plugin> 
    <groupId>com.pyx4me</groupId> 
    <artifactId>proguard-maven-plugin</artifactId> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>proguard</goal> 
      </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <obfuscate>true</obfuscate> 
     <options> 
      <option>-allowaccessmodification</option> 
      <option>-keep public class com.class.path.MainClass { public *; public static *; }</option> 
     </options> 
     <injar>${project.build.finalName}.jar</injar> 
     <outjar>${project.build.finalName}-small.jar</outjar> 
     <outputDirectory>${project.build.directory}</outputDirectory> 
     <libs> 
      <lib>${java.home}/lib/rt.jar</lib> 
      <lib>${java.home}/lib/jsse.jar</lib> 
     </libs> 
     <addMavenDescriptor>false</addMavenDescriptor> 
    </configuration> 
</plugin> 

Den letzten Glas wird die finalName-small.jar

+0

Gibt es einen Grund, warum Sie die Paketphase und nicht die Prozessklassenphase verwenden? Prozessklassen werden nach dem Kompilieren, aber vor dem Paket ausgeführt, sodass Sie auf Ziele/Klassen zugreifen können, bevor sie verstellt werden. – sal

+0

Es ist eine Weile her, aber soweit ich mich erinnere, habe ich herausgefunden, dass das Plugin grundsätzlich progard läuft, also mag es ein Glas zu bekommen und ein anderes auszugeben. Mit anderen Worten - viele Versuche und Fehler, diese funktioniert ... –

+0

Wie gehen Sie mit mehreren Maven-Modulen im selben Projekt um? führen Sie das Plugin in der Wurzel pom.xml, führen Sie es in Web-UI-Modul Assembly, etc? – Alex