2009-05-19 14 views
17

J'essaie de faire fonctionner Maven avec ProGuard.Problèmes de Maven, Proguard et d'assemblage

Ce que je veux atteindre est le suivant:

  • Run ProGuard sur mes fichiers source et produire des classes brouillées

  • Créez un fichier manifeste qui fait référence à la classe principale afin que je puisse l'exécuter en tant que pot

  • Déballez tous les fichiers de bibliothèque associés et créez un grand fichier contenant tous les fichiers. Ce fichier ne doit contacter que les fichiers .class et .xml.

  • Assemblez-les dans des fichiers .zip et tar.gz contenant divers fichiers README.txt, etc.

Jusqu'à présent, j'ai quelque chose comme ceci:

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

Mais j'ai pas de joie. Quelqu'un peut-il me donner de vagues indications à ce sujet?

Merci à l'avance, Matt

+0

@starblue Maven ne pas tout concept [d'assemblées]. Cependant, '[assembly]' est très valide. Alors, s'il vous plaît, arrêtez de vous comporter comme les tags sont pour des domaines uniques, en excluant tout ce qui ne correspond pas à votre vision de leur utilisation. Les balises sont pour définir, ajouter plus de contraintes. Ne m'interdis pas d'utiliser un tag qui s'applique aussi à Maven. C'est flippant. –

+0

http://maven.apache.org/plugins/maven-assembly-plugin/: Ce plugin génère des "assemblages". – starblue

Répondre

9

Voici la configuration qui avait travaillé pour moi

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

Le pot final est le finalName-small.jar

+0

Y a-t-il une raison pour laquelle vous utilisez la phase package et non la phase classes-processus? Les classes de processus s'exécutent après la compilation mais avant le paquet afin que vous puissiez accéder à la cible/aux classes avant qu'elles ne soient corrompues. – sal

+0

Cela fait un moment, mais autant que je me souvienne, j'ai découvert que le plugin fonctionne en principe avec proguard, donc il aime bien en prendre un et en émettre un autre. En d'autres termes - beaucoup d'essais et d'erreurs, celui-ci fonctionne ... –

+0

comment gérez-vous plusieurs modules Maven dans le même projet? est-ce que vous exécutez le plugin dans la racine pom.xml, l'exécutez-vous dans l'assemblage du module web ui, etc? – Alex