특정 자바 버전으로 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을 실행할 수 있겠다

참고

cmd로 프로세스 죽이기

cmd
1
2
3
taskkill /IM "process name" /F

taskkill /IM "oCam.exe" /F
  • 나는 주로 정상 종료할 때 광고 뜨는 프로그램을 종료하거나,
  • 한번에 여러 프로그램을 종료하려고 배치파일로 만들어 사용했다
  • 실행해도 안꺼지는 경우, 관리자 권한이 필요할 수도있다

심볼릭 링크 만들기

  • 동기화 하고 싶은 폴더가 있을때 정말 좋다

심볼릭 링크 만드는 법

  • 절대 위치 사용 ; mklink /d [링크위치] [실제위치]
  • 상대 위치 사용 ; mklink /d [링크위치] [링크위치를 기준으로 상대위치]
    • ex ) mklink /d .\.aws-sam\build\CommentFunction ..\..\dist
  • 링크이름 ; 새로만들어질 폴더 ; 현재 존재하지 않는 폴더여야 함
  • 실제위치 ; 원본 폴더 ; 이미 만들어져 있는 폴더

심볼릭 링크 삭제

rmdir [링크]

심볼릭 링크

  • 폴더 내용물이 공유된다. (사본이 아님)
  • 링크 폴더도 실제 폴더 처럼 작동한다
  • 바로가기 아이콘을 하고 있다
  • 원본 폴더에 별명을 지어준 느낌이다
  • 포인터 같은 느낌이다

  • 권한이 없다고 하면 관리자 권한으로 명령을 실행한다

상대경로를 사용해 만든경우

  • 당연한 말이지만 원본 폴더나 링크 폴더의 위치가 바뀌면 안된다
  • 디렉터리 구조가 변하지 않고 두 폴더를 이동한다면 잘 작동한다

절대경로를 사용해 만든경우

  • 링크 폴더를 아무렇게나 이동시켜도 잘 작동한다
  • 당연한 말이지만 원본 폴더를 옮기면 작동하지 않는다

내가 활용한 곳

aws lambda layer

  • lambda 에서는 함수의 크기를 줄이기 위해 layer라는 것을 사용한다
  • sam project에서 lambda를 작성하고 node_modules 같은 무거운 얘들은 layer로 빼야한다
  • 그런데 이 과정이 매우 귀찮다
    • package.json 에서 종속성들이 빌드되지 않게 주석
    • sam yaml에서 지정한 종속성 경로에 node_modules 사본 또는 옮기기
    • 수정작업할때, 코딩할때 자동완성 및 문서를 보기 위해서는 node_modules 폴더가 함수 안에 필요함
  • sam yaml에서 지정한 종속성 경로는 함수안이 되면 안됨. 즉, 직접 다이렉트로 node_modules를 지정할 수 없음. sam project 루트로 빼던가 해야함
  • 여기서 심볼릭 링크를 활용해서 두 폴더간 동기화를 진행!