Есть ли способ ввода аргументов при запуске приложения spring -boot (mvn spring -boot: run) из командной строки, а затем получить их в main()?
Получить аргументы командной строки из spring -boot: выполнить
Ответ 1
Глядя на исходный код плагина spring-boot-maven-plugin, я обнаружил, что вам нужно сделать:
mvn spring-boot:run -Drun.arguments="arg1,arg2"
Другой способ получить больше информации о том, какие параметры run
цель run
плагина spring-boot
- выполнить следующую команду:
mvn help:describe -Dcmd=spring-boot:run -Ddetail
Для Spring Boot 2.x исходный код находится здесь, и теперь вам нужно использовать -Dspring-boot.run.arguments="args1,args2"
Если вы используете Gradle и хотите иметь возможность передавать аргументы командной строки в задачу Gradle bootRun
, вам сначала нужно настроить, например, так:
bootRun {
if ( project.hasProperty('args') ) {
args project.args.split('\\s+')
}
}
и запустите задачу, используя gradle bootRun -Pargs="arg1 arg2"
Ответ 2
При передаче нескольких аргументов с использованием -Drun.arguments, если аргумент, в свою очередь, имеет значения, разделенные запятыми, то используется только первое значение каждого аргумента. Чтобы избежать этого, повторите аргумент столько раз, сколько количество значений.
Это более обходное решение. Не уверен, есть ли альтернатива, если разделитель не отличается - например, "|".
Например, проблема:
mvn spring-boot:run -Drun.arguments="--spring.profiles.active=test,dev"
Выбирает только "тестовый" профиль для указанной команды.
Обход проблемы:
mvn spring-boot:run -Drun.arguments="--spring.profiles.active=test,--spring.profiles.active=dev"
Выбирает профили "dev" и "test" для указанной команды.
Ответ 3
Имейте в виду: способ передачи аргументов зависит от основной версии spring-boot
.
TL;DR
Для Spring Boot 1:
mvn spring-boot:run -Drun.arguments="argOne,argTwo"
Для Spring Boot 2:
mvn spring-boot:run -Dspring-boot.run.arguments="argOne,argTwo"
1) версия spring-boot-maven-plugin
и используемая версия Spring Boot
должны быть выровнены.
В соответствии с основной используемой версией Spring Boot (1
или 2
), действительно необходимо использовать spring-boot-maven-plugin
в версии 1
или 2
.
Если ваш pom.xml
наследуется от spring-boot-starter-parent
:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>ONE_OR_TWO_VERSION</version>
</parent>
В вашем pom, версия используемого плагина даже не должна быть указана, так как эта зависимость плагина наследуется:
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
...
</configuration>
</plugin>
</plugins>
Если ваш pom.xml
не наследуется от spring-boot-starter-parent
, не забудьте выровнять версию spring-boot-maven-plugin
с точной версией spring boot
вы хотите использовать.
2) Передача аргументов в командной строке с помощью spring-boot-maven-plugin: 1.XX
Для одного аргумента:
mvn spring-boot:run -Drun.arguments="argOne"
для нескольких:
mvn spring-boot:run -Drun.arguments="argOne,argTwo"
Страница плагина maven документирует это:
Name Type Since Description
arguments | String[] | 1.0 | Arguments that should be passed
to the application. On command line use
commas to separate multiple arguments.
User property is: run.arguments.
3) Передача аргументов в командной строке с помощью spring-boot-maven-plugin: 2.XX
Для одного аргумента:
mvn spring-boot:run -Dspring-boot.run.arguments="argOne"
для нескольких:
mvn spring-boot:run -Dspring-boot.run.arguments="argOne,argTwo"
Я не нашел документации по плагину для версии 2.XX, которая ссылается на это.
Но класс org.springframework.boot.maven.AbstractRunMojo
из spring-boot-maven-plugin:2.0.0.M3
ссылается на это свойство пользователя:
public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo
...
@Parameter(property="spring-boot.run.arguments")
private String[] arguments;
...
protected RunArguments resolveApplicationArguments(){
RunArguments runArguments = new RunArguments(this.arguments);
addActiveProfileArgument(runArguments);
return runArguments;
}
...
}
4) Подсказка: при передаче более одного аргумента учитываются пробелы между запятыми.
mvn spring-boot:run -Dspring-boot.run.arguments="argOne,argTwo"
будет интерпретироваться как ["argOne", "argTwo"]
Но это:
mvn spring-boot:run -Dspring-boot.run.arguments="argOne, argTwo"
будет интерпретироваться как ["argOne", " argTwo"]
Ответ 4
И если вы используете Eclipse...
| Parameter Name | Value | | run.arguments | "--name=Adam" |
Ответ 5
Spring Boot 1 как 2 обеспечивает способ передачи нескольких профилей в качестве аргумента и позволяет избежать проблемы, связанной с запятой, используемой как разделитель между аргументами, и значениями, передаваемыми в качестве активного профиля.
Поэтому вместо того, чтобы писать:
mvn spring-boot:run -Dspring-boot.run.arguments=--spring.profiles.active=test,--spring.profiles.active=dev
используйте свойство profiles
Spring Boot Maven, которое является ярлыком удобства для spring.profiles.active
например:
Пользовательское свойство Maven отличается в зависимости от версии Spring Boot.
Для Spring Boot 1. 4+, это run.profiles
:
mvn spring-boot:run -Drun.profiles=dev,test
Для Spring Boot 2 это spring-boot.run.profiles
:
mvn spring-boot:run -Dspring-boot.run.profiles=dev,test
Из документации плагина:
профили:
Пружинные профили для активации. Удобный ярлык для указания аргумента spring.profiles.active. В командной строке используйте запятые для разделения нескольких профилей.
Тип: java.lang.String []
С: 1.3
Требуется: нет
Свойство пользователя: spring-boot.run.profiles
Ответ 6
Это то, что сработало для меня (spring-boot v1.4.3.RELEASE
),
mvn spring-boot:run -Dspring.profiles.active=test,local -Dlogback-debug=true
Ответ 7
Для последней версии Spring используйте -Dspring-boot.run.arguments =, как показано в примере ниже
spring-boot:run -Djasypt.encryptor.password=temp -Dspring-boot.run.arguments="OU,Grade"