PowerShell 환경에서 maven spring-boot:run 실행 TIP

식빵·2023년 8월 3일
0

Spring Lab

목록 보기
24/34
post-thumbnail

이 글에서는 Window 에 기본으로 깔려있는 Windows Powershell 또는
수동으로 설치하는 PowerShell 을 기본 CLI 로 가정하고 작성한 글입니다.
유의하시기 바랍니다!

🍀 알아두면 좋은 것

1. maven 을 설치하지 말고 maven wrapper 쓰기

maven 을 설치해서 mvn 명령어를 쓰려는 경우가 있습니다.
하지만 이런 방식으로 하면 자신의 maven 버전과 spring boot initilizer 가 만들어준
프로젝트의 maven 버전 사이에 차이가 발생할 수 있습니다.

이런 버전 차이로 인해 버그가 발생할 수 있으므로,
spring 프로젝트 생성 시에 자동으로 루트 경로에 만들어지는
mvnw (= maven wrapper) 를 사용하시기 바랍니다.

# 예시:
mvn clean package # ❌
.\mvnw clean package # 👌

2. project build encoding

어쩌다 한번씩 인코딩 문제로 인해서 제대로 명령어가 실행이 안되는 경우가 있습니다.
그럴 때는 pom.xml 에서 <properties><project.build.sourceEncoding> 태그를
UTF-8 로 설정하시고 다시 실행해보시 바랍니다.

<properties>
	<java.version>11</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>



🍀 환경변수 즉석 세팅

1. JAVA_HOME 세팅

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:변수명="할당값" 처럼 할 수 있습니다만,
이것은 어디까지나 이 명령어를 실행하는 콘솔창에서만 적용되며, 새로운 콘솔창에서는
전역변수 세팅값이 적용되지 않습니다.

일회용으로 쓰기 딱 좋죠?


2. path 경로 추가

$Env:Path += "; 추가하고자_하는_경로"



🍀 "-" 문자 사용시 유의사항 (진짜 중요)

Unknown lifecycle phase 에러가 나는 대부분의 이유

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'

그런데 꼭 - 문자가 나오면 무조건 이런 처리를 해야될까요?
그건 아닙니다!



- 뒤에 . 사용 여부에 따른 escape 처리

만약에 -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 👌

🍀 Vm Option 설정

.\mvnw spring-boot:run `-Dspring-boot.run.jvmArguments='-Dserver.port=9903'

🍀 profile 설정

.\mvnw spring-boot:run `-Dspring-boot.run.profiles='dev'
profile
백엔드를 계속 배우고 있는 개발자입니다 😊

0개의 댓글