Mikel Cármenes Cavia wrote:
Well, that sure sounds like another very intelligent way to do it. Would you
mind sharing the portion of your POM that takes care of this sort of
functionality?
Ok, here we go ...
Step 1: list all the dependencies into a text file
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.0</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>resolve</goal>
</goals>
<configuration>
<excludeGroupIds>de.exentra</excludeGroupIds>
<outputFile>${project.build.directory}/dependencies.txt</outputFile>
</configuration>
</execution>
</executions>
</plugin>
Step2: fill out the proguard template
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.1-beta-1</version>
<executions>
<execution>
<phase>process-classes</phase>
<goals>
<goal>java</goal>
</goals>
<configuration>
<mainClass>com.xxx.ProguardConfigFilter</mainClass>
<arguments>
<argument>${project.build.directory}/dependencies.txt</argument>
<argument>${settings.localRepository}</argument>
<argument>${project.basedir}/proguard.conf.in</argument>
<argument>${project.build.directory}/proguard.conf</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
I'll leave the implementation of ProguardConfigFilter as an exercise to
the reader but it's fairly simple: read in the generated
dependencies.txt, build full paths to the jars in the local repository
and stuff that into the proguard.conf.in. Finally, write the result to
proguard.conf
Step 3: pack up all my project's classes into a single jar
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>process-classes</phase>
<goals>
<goal>attached</goal>
</goals>
<configuration>
<finalName>my-project-open</finalName>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>assembly.xml</descriptor>
</descriptors>
<attach>false</attach>
</configuration>
</execution>
</executions>
</plugin>
the assembly.xml is fairly simple, too but it assumes that all my
project's modules have the same groupId:
<assembly>
<id>deployment</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory></outputDirectory>
<outputFileNameMapping></outputFileNameMapping>
<unpack>true</unpack>
<scope>runtime</scope>
<includes>
<include>com.xxx:*</include>
</includes>
</dependencySet>
</dependencySets>
</assembly>
Step4: proguard
<plugin>
<groupId>com.pyx4me</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<version>2.0.2</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>proguard</goal>
</goals>
</execution>
</executions>
<configuration>
<proguardInclude>${project.build.directory}/proguard.conf</proguardInclude>
<includeDependency>false</includeDependency>
<injar>my-project-open.jar</injar>
<outjar>my-project.jar</outjar>
<libs>
<lib>${java.home}/lib/rt.jar</lib>
</libs>
</configuration>
</plugin>
Further, do you incorporate your "other" dependencies into
the jar after ProGuard is done with the obfuscation, or do you always keep
them outside?
As you might have seen from the steps above, my build is special in two
ways:
- we don't obfuscate any third party dependencies. The philosophy is
that you don't want to obfuscate something that's publicly available anyway.
- we pack up all our project's output into a single jar. That's due to
the fact that third party dependencies almost never change but our
project does. With this approach, deployment becomes easy: just swap out
a single jar and be done :-)
Thanks so much for the insight Dirk!
Hope this helps,
-dirk
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]