Переопределение exec-maven-plugin с помощью exec.mainClass

Я начал новый проект maven и настроил exec-maven-plugin для установки по умолчанию mainClass, и я могу выполнить, используя

mvn exec:java -q
Hello World!

Однако, если я попытаюсь указать другой основной класс в командной строке, это, похоже, будет проигнорировано:

mvn exec:java -Dexec.mainClass = "com.jamesmcguigan.kdt.App2" -q
Hello World!

Приведенная выше строка работает, если я закомментирую раздел exec-maven-plugin из pom.xml, но было бы неплохо установить значение по умолчанию в pom.xml для maven exec:java и иметь возможность переопределить это в cli для mvn exec:java -Dexec.mainClass = "com.jamesmcguigan.kdt.App2".

Или я пропустил что-то еще здесь?

Файлы

пом.xml

  <build>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.2.1</version>
        <executions>
          <execution>
            <goals>
              <goal>java</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <mainClass>com.jamesmcguigan.kdt.App</mainClass>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

src/main/java/com/jamesmcguigan/kdt/App.java

package com.jamesmcguigan.kdt;
public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
    }
}

src/main/java/com/jamesmcguigan/kdt/App2.java

package com.jamesmcguigan.kdt;
public class App2 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World 2!" );
    }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
1 355
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используйте свойство, т.е.:

<properties>
        ...
        <main.class>com.jamesmcguigan.kdt.App</main.class>
</properties>
...
<configuration>
         <mainClass>${main.class}</mainClass>
</configuration>

А потом: mvn exec:java -Dmain.class = "com.jamesmcguigan.kdt.App2" -q

Спасибо, это работает. Также можно использовать <exec.mainClass> в качестве имени переменной для обратной совместимости. И заметьте себе: не забывайте использовать mvn compile exec:java при встрече с ClassNotFoundError

James McGuigan 22.12.2020 01:59

Это ошибка плагина Maven Exec? Свойство -Dexec.mainClass должно работать согласно mojohaus.org/exec-maven-plugin/java-mojo.html. Такое же поведение с 1.6.0 и 3.0.0. Кажется, что конфигурация плагина в pom.xml переопределяет свойства командной строки, чего не должно происходить.

David Lakatos 16.11.2021 11:15

Чтобы переопределить основной класс и аргументы, например:

<project>
    ...
    <properties>
        <!-- default values -->
        <mainClass>${project.groupId}.${project.artifactId}.App</mainClass>
        <mainArgs/>
    </properties>
    ...
    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <configuration>
                    <mainClass>${mainClass}</mainClass>
                    <commandlineArgs>${mainArgs}</commandlineArgs>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Чтобы выполнить переопределение:

mvn compile exec:java -DmainClass=org.example.Main -DmainArgs = "arg1 arg2"

Другие вопросы по теме

Пропустить выполнение плагина сонара, если тесты maven пропущены
Kotlin/Java – несуществующая ссылка в аннотации Java для параметра свойства компиляции конструктора
Как добавить один файл в существующую версию временной метки моментального снимка в Sonatype Nexus
Не удается запустить программу «C:\Program Files (x86)\Java\jdk1.8.0_11\jre\bin\java.exe»: ошибка CreateProcess = 206, имя файла или расширение слишком длинное
Разверните приложение в образе микродокера payara из сценария оболочки
Получите номер версии зависимости из pom.xml с помощью командной строки и используйте этот номер версии, чтобы пометить образ докера
При сборке maven должен вызвать spring-boot-maven-plugin на шагах 1 и 3. Могу ли я избежать предупреждения «обнаружено дублирующее объявление плагина»?
Запуск тестов Maven
Экспорт проекта Maven с подпроектом в jar-файл
NetBeans – Maven – JaCoCo – невозможно добавить другой класс с тем же именем