Running Java programs with the exec goal
Special treatment of some command line arguments and configuration parameters facilitate the running of Java programs in external processes.
Note: With the exec
goal, there are some confusion caused by the almost duplication of functionality between the arguments
and commandlineArgs
configuration parameters.
- If
commandlineArgs
is specified, it will be used as is, except for replacing %classpath and %modulepath with their matching path using dependencies - Otherwise if the property
exec.args
is specified, it will be used - Otherwise the list of argument, classpath and modulepath will be parsed and used
Command line
If specified as part of the exec.args
argument, the special string %classpath
will be replaced by the project classpath as computed by Maven. Same couunts for %modulepath
mvn exec:exec -Dexec.executable="java" [...] -Dexec.args="%classpath"
POM configuration
To execute Java programs, the Exec Maven Plugin helps by allowing the <classpath>
special argument:
<configuration>
<executable>java</executable>
<arguments>
<argument>-classpath</argument>
<!-- automatically creates the classpath using all project dependencies,
also adding the project build directory -->
<classpath/>
<argument>com.example.Main</argument>
...
</arguments>
</configuration>
-------------------
or if one wants to restrict the dependencies in the classpath:
-------------------
<configuration>
<executable>java</executable>
<arguments>
<argument>-classpath</argument>
<classpath>
<dependency>commons-io:commons-io</dependency>
<dependency>commons-lang:commons-lang</dependency>
</classpath>
<argument>com.example.Main</argument>
...
</arguments>
</configuration>
In case of the modules as supported since Java9 the configuration looks like
<configuration>
<executable>java</executable>
<arguments>
<argument>--module-path</argument> <!-- or -p -->
<!-- automatically creates the modulepath using all project dependencies,
also adding the project build directory -->
<modulepath/>
<argument>--module</argument> <!-- or -m -->
<argument>mymodule/com.example.Main</argument>
...
</arguments>
</configuration>