I managed to find a reasonably elegant solution to my problem using Maven environment variables.
The default values are defined as properties in the pom, and added to the exec plugin as arguments:
...
<properties>
<argumentA>defaultA</argumentA>
<argumentB>defaultB</argumentB>
</properties>
...
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<executable>java</executable>
<arguments>
<argument>-Djava.library.path=${project.build.directory}/lib</argument>
<argument>-classpath</argument>
<classpath />
<argument>com.example.app.MainClass</argument>
<argument>-a</argument>
<argument>${argumentA}</argument>
<argument>-b</argument>
<argument>${argumentB}</argument>
</arguments>
</configuration>
</plugin>
...
Now I can run with default parameters exactly as I did before:
mvn exec:exec
And I can easily override the defaults for each argument at the command line using:
mvn exec:exec -DargumentA=alternateA -DargumentB=alternateB