tags:

views:

43

answers:

3

Hi, I'm translating an Ant script to Maven 2 and I have this problem: the Ant script use a pretty simple java class to encrypt files this way:

<target name="encrypt">
    <java classname="DESEncrypter">
        <classpath>
            <pathelement path="...classpath for this thing..." />
        </classpath>
        <arg line="fileToEncrypt.properties fileEncrypted.properties" />
    </java>
</target>

This DESEncrypter is a compiled class which source doesn't belong to the project I am converting but is used similarly in other projects. Probably I have to create a maven plugin for this to reuse, but I don't want to do it now. My question is: in which directory do i put the DESEncrypter class and how do i invoke it? Using the exec:java plugin, may be? I don't think the encrypter belong to src, test or resources directories.

Obviously, I don't want to include the encrypter class in the final product, just the encrypted files.

+1  A: 

You might want to just use the AntRun plugin, it should let you accomplish anything from Ant with a minimum amount of fuss. You would need a dependency on the class/jar you were using, but by giving it a scope of test, or provided it won't package it in your final product.

mezmo
More elegant: add the artifact as a plugin dependency for the antrun plugin
seanizer
+2  A: 

My question is: in which directory do i put the DESEncrypter class and how do i invoke it? Using the exec:java plugin, may be? I don't think the encrypter belong to src, test or resources directories.

A very straightforward solution would be to use the Maven AntRun Plugin. Regarding the location of your encrypter, you could either:

  • put it in a separate module that you could declare as dependency OF the plugin (see this example)
  • keep it in the current module, in the source tree, and configure the Maven JAR Plugin to exclude it using excludes.
Pascal Thivent
+2  A: 

The third obvious answer (apart from exec:java and antrun) is GMaven, which lets you execute Groovy code either from an external class or inline from your pom. So if you only need a one-liner, embedding it in your pom is a quick and easy way to implement things (otherwise you should use an external script). BTW: if you don't know groovy: it's basically java with some additional syntax sugaring.

Here's a sample configuration (of course you have to replace the artifact and class you use):

<plugin>
    <groupId>org.codehaus.groovy.maven</groupId>
    <artifactId>gmaven-plugin</artifactId>
    <dependencies>
        <dependency>
            <groupId>your.library.com</groupId>
            <artifactId>your-library</artifactId>
            <version>1.2.3</version>
        </dependency>
    </dependencies>
    <executions>
        <execution>
            <phase>process-classes</phase>
            <!-- Or any other phase -->
            <goals>
                <goal>execute</goal>
            </goals>
            <configuration>
                <source><![CDATA[
                import com.encryption.*;
                new Encrypter().encrypt(
                    new File(project.build.outputDirectory, 
                                                    'fileToEncrypt.properties'),
                    new File(project.build.outputDirectory, 
                                                    'encryptedFile.properties')
                )
                ]]></source>
            </configuration>
        </execution>
    </executions>
</plugin>

(By making the encryption artifact a plugin dependency, you keep it out of your deployed dependencies, but this holds true for antrun and exec:java also)

seanizer
LOL, you did it again :)
Pascal Thivent
yeah, it's getting less often because I am currently crazy about AspectJ, but I always have to come back to GMaven, because it's so nice and easy :-)
seanizer