이 글에서는 Window 에 기본으로 깔려있는
Windows Powershell
또는
수동으로 설치하는PowerShell
을 기본 CLI 로 가정하고 작성한 글입니다.
유의하시기 바랍니다!
maven 을 설치해서 mvn
명령어를 쓰려는 경우가 있습니다.
하지만 이런 방식으로 하면 자신의 maven 버전과 spring boot initilizer 가 만들어준
프로젝트의 maven 버전 사이에 차이가 발생할 수 있습니다.
이런 버전 차이로 인해 버그가 발생할 수 있으므로,
spring 프로젝트 생성 시에 자동으로 루트 경로에 만들어지는
mvnw (= maven wrapper)
를 사용하시기 바랍니다.
# 예시:
mvn clean package # ❌
.\mvnw clean package # 👌
어쩌다 한번씩 인코딩 문제로 인해서 제대로 명령어가 실행이 안되는 경우가 있습니다.
그럴 때는 pom.xml
에서 <properties>
에 <project.build.sourceEncoding>
태그를
UTF-8
로 설정하시고 다시 실행해보시 바랍니다.
<properties>
<java.version>11</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
spring-boot:run
은 결국 maven 으로 도는 명령어고,
maven 은 다시 java 기반으로 도는 프로그램입니다.
이러다보니, 환경변수로 JAVA_HOME 을 세팅하지 않으면
잘되지 동작을 안합니다. 이때는 즉석에서 JAVA_HOME 을 적용시키고 명령어를
실행시키시면 편합니다.
powershell 를 켜고, mvnw 가 있는 프로젝트 루트 경로로 가서
아래처럼 명령어를 입력하면 됩니다!
$env:JAVA_HOME="C:\Users\dailycode\Desktop\openjdk-11.0.2_windows-x64_bin"
.\mvnw spring-boot:run
참고로 powershell 에서 전역변수 설정은
$env:변수명="할당값"
처럼 할 수 있습니다만,
이것은 어디까지나 이 명령어를 실행하는 콘솔창에서만 적용되며, 새로운 콘솔창에서는
전역변수 세팅값이 적용되지 않습니다.일회용으로 쓰기 딱 좋죠?
$Env:Path += "; 추가하고자_하는_경로"
spring-boot:run
은 실행시에 프로파일을 정하고나, Vm Option 을 동적으로 전달할 수 있습니다. 아래처럼 말입니다.
.\mvnw spring-boot:run -Dspring-boot.run.profiles='dev'
그런데 powershell 에서는 이렇게 실행시키면 에러가 납니다.
에러 로그 중에서 Unknown lifecycle phase
를 볼 수 있습니다.
그리고 초반부의 로그를 보면 .run.profiles=dev
를 인식 못해서 뱉어낸
에러인 것도 알 수 있죠.
이건 -Dspring-boot.run.profiles=dev
라고 작성한 파라미터가
-Dspring-boot
를 쏙 빼먹고 .run.profiles=dev
만 파라미터 인자로 전달되서
그런 겁니다. 아무래도 Powershell 에서는 -
문자열에 대한 특수한 처리 때문에
그런 거라고 추측됩니다.
이를 해결하기 위해서는 간단하게 -
앞에 백틱( ` )을 붙이거나,
' '
로 감싸주면 됩니다. 간단하죠?
.\mvnw spring-boot:run `-Dspring-boot.run.profiles='dev'
.\mvnw spring-boot:run '-Dspring-boot.run.profiles=dev'
그런데 꼭 -
문자가 나오면 무조건 이런 처리를 해야될까요?
그건 아닙니다!
만약에 -a.b.c
같이 .
을 사용하는 인자를 전달하려면
반드시 위에서 말한 백틱 혹은 ' '
로 감싸서 인자를 전달해야합니다.
하지만 반대로 아래와 같이 -
이후에 연달아서 .
표현이 사용되지 않으면
앞에서 본 escape 처리를 안해도 됩니다.
# ex1
java -jar app.jar
# ex2
docker ps -a
그렇다면 - 뒤에 . 을 사용하는 것과 안하는 것이 뒤섞이면 어떻게 명령어를 작성해야할까요?
아래처럼 작성하면 됩니다.
java -jar `-Dserver.port=9000 spring-boot-app.jar
-jar
는 뒤에 .
을 사용한 표현이 없으므로 escape ❌-Dserver.port
는 .
표현이 섞여있으므로 escape 👌.\mvnw spring-boot:run `-Dspring-boot.run.jvmArguments='-Dserver.port=9903'
.\mvnw spring-boot:run `-Dspring-boot.run.profiles='dev'