executablewar ============= This package can be overlaid into a WAR file to make it executable, automatically loading the WEB-INF/lib directory into the classpath and launching a different main class. Add the magic block to your Maven pom.xml, setting the value of `Executable-War-Package` to the package of your main classes. With this magic in place, users can execute your WAR file as a standard JAR, including the class name on the command line: ==== java -jar your.war Action ... ==== At runtime the class `${Executable-War-Package}.${Action}` will be loaded dynamically from the WEB-INF/lib directory and its static main method will be invoked with all remaining arguments. Files under `WEB-INF/` may also be accessed by the built-in actions `--ls` (list files) and `--cat` (output content to standard out). This may be useful for user-level documentation to unpack resources packaged with the application. The `WEB-INF`/ prefix is assumed by these actions, and should not be specified on the command line. pom.xml magic ------------- ==== <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>ExecutableWarMain</mainClass> </manifest> <manifestEntries> <Executable-War-Package>your.package.prefix</Executable-War-Package> </manifestEntries> </archive> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>make-executable</id> <phase>generate-resources</phase> <goals> <goal>unpack</goal> </goals> <configuration> <artifactItems> <artifactItem> <groupId>gerrit</groupId> <artifactId>executablewar</artifactId> <overWrite>true</overWrite> <outputDirectory>${project.build.directory}/executablewar</outputDirectory> <includes>**/*.class</includes> </artifactItem> </artifactItems> </configuration> </execution> </executions> </plugin> <plugin> <artifactId>maven-antrun-plugin</artifactId> <executions> <execution> <id>fix-output</id> <phase>process-classes</phase> <configuration> <tasks> <property name="d" location="${basedir}/target/${project.name}-${project.version}"/> <copy todir="${d}"> <fileset dir="${basedir}/target/executablewar" includes="**/*"/> </copy> </tasks> </configuration> <goals> <goal>run</goal> </goals> </execution> </executions> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>gerrit</groupId> <artifactId>executablewar</artifactId> <version>1.0-SNAPSHOT</version> <scope>provided</scope> </dependency> </dependencies> ====