Run main class in test dir from maven with Java agent and Log4J configuration
It took a bit of help from Michal (on this StackOverflow post: Running main method from test class via maven) before I got this right. But here it is:
<profile>
<id>run-importer</id>
<properties>
<loadTimeWeaverArg>-javaagent:"${settings.localRepository}/org/springframework/spring-agent/2.5.6/spring-agent-2.5.6.jar"</loadTimeWeaverArg>
<log4JConfigArg>-Dlog4j.configuration=file:${project.build.directory}/path/to/log4j.properties</log4JConfigArg>
<mainClassArg>com.myorg.MyClass</mainClassArg>
<arg1>foo</arg1>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<executable>java</executable>
<classpathScope>test</classpathScope>
<arguments>
<argument>${log4JConfigArg}</argument>
<argument>${loadTimeWeaverArg}</argument>
<argument>-classpath</argument>
<classpath />
<argument>${mainClassArg}</argument>
<argument>${arg1}</argument>
</arguments>
</configuration>
</plugin>
</plugins>
</build>
</profile>
And I run it with the command line: mvn -e exec:exec -Prun-importer
The advantages of this approach:
- The whole purpose of this profile is to run "special code" that should never be deployed but needs to make use of code in src and test src.
- It leaves room in case this ever needs to be duplicated, so there is no "competition" regarding what gets run with
mvn -e exec:exec. - I can specify java agent, log4j and lots of other config using variables that already exist in the pom.
- I can override any of these arguments on the command line with
-Darg1="bar"