26

I want to use the exec:java plugin to invoke the main class from command line. I can pass arguments from the command line using -Dexec.args="arg0 arg1 arg2", I don't know how to pass system properties. I tried '-Dexec.systemProperties="key=value"` but with no effect.

pom.xml looks like this:

  <plugin>  
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <configuration>
      <mainClass>ibis.structure.Structure</mainClass>
    </configuration>  
  </plugin>
Alexandru
  • 25,070
  • 18
  • 69
  • 78

4 Answers4

27

Try following for me it works properly

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <configuration>
                <mainClass>ibis.structure.Structure</mainClass>
                <systemProperties>
                    <systemProperty>
                        <key>someKey</key>
                        <value>someValue</value>
                    </systemProperty>
                </systemProperties>
            </configuration>
        </plugin>
mokshino
  • 1,435
  • 16
  • 11
19

There is no way to set the <systemProperties> parameter on the command line.

However, since exec:java is not forked, you can just pass a system property to maven and it will be picked up by exec:java as well.

mvn -Dkey=value exec:java -Dexec.mainClass=com.yourcompany.yourclass \
    -Dexec.args="arg1 arg2 arg3"
approxiblue
  • 6,982
  • 16
  • 51
  • 59
Sean Patrick Floyd
  • 292,901
  • 67
  • 465
  • 588
8

I just ran into a similar problem and I wanted to write a full answer for others that might come across this question.

Even though the question is not about pom.xml but about command line - it does not state how to do the same with pom.xml so here it is

    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>

                <goals>
                    <goal>java</goal>
                </goals>

                <configuration>
                     <mainClass>myPackage.MyMain</mainClass>
                      <systemProperties>
                          <property>
                              <key>myKey</key>
                              <value>myValue</value>
                          </property>
                      </systemProperties>
                </configuration>

            </plugin>
        </plugins>
    </build>

For the command line - I think Sean Patrick Floyd's answer is good - however, if you have something already defined in your pom.xml it will override it.

So running

 mvn exec:java -DmyKey=myValue

should also work for you.

You should also note that the exec plugin's documentations states the following

A list of system properties to be passed. 
Note: as the execution is not forked, some system properties required 
by the JVM cannot be passed here. 
Use MAVEN_OPTS or the exec:exec instead. See the user guide for more information.

So you can also do something like this

export MAVEN_OPTS=-DmyKey=myValue
mvn exec:java

and it should work the same way.

guy mograbi
  • 27,391
  • 16
  • 83
  • 122
0

For goal exec:

<artifactId>exec-maven-plugin</artifactId>
<executions>
    <execution>
        <goals>
            <goal>exec</goal>
        </goals>
        <configuration>
            <arguments>
                <argument>-Dsome.key=true</argument>
weberjn
  • 1,840
  • 20
  • 24