taskkill -jar

상황

  • java -jar로 runable jar을 실행할 수 있다
  • 그런데 이 jar을 cmd로 종료할 수 없을까?
  • 보통의 프로그램이라면 taskkill /F /IM프로세스 이름을 통해 종료할 수 있다
  • 근데 java -jar 실행한 앱의 경우, 프로세스명이 java.exe, javaw.exe 정도이다

해결

  • jps 명령으로 .jar 파일 이름을 통해 PID를 얻을 수 있다
  • jps는 jdk가 설치되어있고 환경 변수만 잘 설정되어있다면 그냥 동작한다
example.bat
1
2
rem example
for /f "tokens=1" %i in ('jps -m ^| find "myApp"') do ( taskkill /F /PID %i )
  • find “myApp” 부분에 jar 파일 명을 적으면 된다
  • jar 파일명을 완전히 적지 않아도 된다

참고

gradle build 특정 jdk 버전으로

상황

  • 내 컴퓨터에는 여러 가지 자바 버전이 설치되어있다. (jdk1.8.0_281, jdk-13.0.2)
  • 자바 버전 1.8에서 동작하는 runable jar 파일을 만드는데, 1.8에서 실행이 안되었다
  • 그래들 프로젝트이다
  • 분명 프로젝트 세팅은 1.8로 되어있는데 막상 빌드 결과물 jar이 1.8에서 실행이 안되었다
  • 그런데 13에서 실행이 되는 것을 확인하고, 빌드가 다른 자바 버전으로 되는 것을 확인했다
error message
1
Error: A JNI Error has occurred, ... has been compiled by a more recent version of the java runtime

해결

1
gradlew build -Dorg.gradle.java.home="C:\Program Files\Java\jdk1.8.0_281"
  • 빌드할 때 자바 홈을 명시해 주었더니 해결되었다

참고

특정 자바 버전으로 jar 실행

상황

  • 기존에 사용하던 A.jar 실행파일이 있다
  • 자바 버전을 바꿨다
  • 환경변수 변화로 인해 A.jar이 더 이상 동작하지 않는다
  • 이 실행파일만 기존 자바 버전으로 실행할 수 없을까?
  • 또는
  • A.jar은 jdk9에서 실행 가능하고
  • B.jar은 jdk13에서 실행 가능한데, 둘 다 각자의 자바 버전으로 실행하려면 어떻게 해야 할까?

실행파일 만들기

ex.bat
1
2
3
4
5
6
7
pushd "%~dp0"

"C:\Program Files\Java\jdk-9.0.4\bin\java.exe" -version
pause

"C:\Program Files\Java\jdk-13.0.2\bin\java.exe" -version
pause
  • 각 버전의 자바 파일 경로를 앞에 써준다
  • -version 옵션을 주어서 원하는 버전의 자바가 실행되는지 확인한다
runA.bat
1
2
3
pushd "%~dp0"

"C:\Program Files\Java\jdk-9.0.4\bin\java.exe" -jar A.jar
  • 이런 식으로 특정 자바 버전으로 jar을 실행할 수 있겠다

참고