명령어 위치 확인 (1)

안녕하세요, 케이치입니다.


오늘도 쉽게 넘어가지를 않고 에러가 발생하네요. 오늘은 윈도우용 도커를 설치를 했다가 jre 8 이 정상적으로 동작을 하지 못하게 된 케이스입니다.


jdk7, 8, jre7, 8을 윈도우10 에 설치해서 사용중인 환경인데요 jdk8을 설치해보신 분들은 아시겠지만 7버전 까지는 c:\Program Files\Java 밑에 설치가 되고 환경설정 변수에도 해당 경로의 bin디렉토리를 설정해줬었는데(C:\Program Files\Java\jre7\bin), 8버전부터는 C:\ProgramData\Oracle\Java\javapath\java.exe 를 환경변수에 가지도록 해놨더군요. 물론 설치 경로는 Program Files\Java\jdk1.8 이었는데도 불구하고 말이죠. 어찌되었건 잘 쓰고있었는데, 문제가 생긴건 챗봇 오픈소스 테스트를 하려고 윈도우용 도커를 설치해서 테스트를 하고난 뒤에 발생했습니다. 갑자기 이클립스(Oxygen)가 실행이 안되더군요. 

뭐지? 뭐지? 하다가, 이클립스를 다시 설치해보고 실행했더니 처음 한번은 잘 됩니다. 다시 이클립스를 종료했다가 실행시키면 또 안되고 참 희한한 현상이 발생했습니다. ㅠㅠ


아무튼 한참을 해메다가 neon 버전으로 다시 설치해서도 해보고 하다가 java를 실행해봤는데 아래와 같은 에러가 발생하더군요.


Error occurred during initialization of VM

java/lang/NoClassDefFoundError: java/lang/Object


허허, 이런 메시지는 또 처음 봐서 구글링을 해봤더니 jdk, jre 설치가 정상적으로 안된 케이스에서 발생하는 경우가 많은 것 같더군요.


조금 전까지 아무 문제 없던게 도커를 설치했더니 자바가 실행이 안된다? 좀 이해가 안되는 부분이라서 java명령어를 실행할 때 Program Files 하위의 java를 쓰는건지 ProgramData하위의 java를 쓰는건지 확인해보고 싶었습니다. 그때 사용한 명령어는 아래와 같습니다.


 for %i in (java.exe) do @echo. %~$PATH:i


윈도우에서 기본적으로 제공해주는 for 명령어를 이용한 것으로 도움말을 출력해보면 아래와 같습니다.



C:\Users\dev>for /?

파일 집합에서 각 파일에 대해 지정된 명령을 실행합니다.


FOR %변수 IN (집합) DO 명령어 [명령어 매개 변수]


  %변수      바꿀 수 있는 매개 변수를 한 문자로 지정합니다.

  (집합)      하나 이상의 파일을 지정합니다. 와일드카드를 사용할 수 있습니다.

  명령어      각 파일에 대해 수행할 명령을 지정합니다.

  명령어-매개 변수

              지정된 명령의 매개 변수나 스위치를 지정합니다.


일괄 프로그램에서 FOR 명령을 쓰려면, '%변수' 대신 '%%변수'를 지정하십시오.

변수 이름에서는 대문자와 소문자를 구별하므로 %i와 %I는 다릅니다.


명령 확장을 사용하면 FOR 명령에 아래와 같은 추가적인 형태가

지원됩니다.


FOR /D %변수 IN (집합) DO 명령 [명령-매개 변수]


   집합에 대표 문자가 있으면 파일 이름 대신 디렉터리 이름과

   일치하도록 지정합니다.


FOR /R [[드라이브:]경로] %변수 IN (집합) DO 명령 [명령-매개 변수]


   [드라이브:]경로를 루트로 하여 디렉터리 트리를 따라 내려가며

   FOR 구문을 트리의 각 디렉터리에서 실행합니다. /R 스위치 뒤에

   디렉터리가 지정되지 않으면 현재 디렉터리가 사용됩니다.

   집합에 마침표(.)가 사용되면 디렉터리 트리만 나열합니다.


FOR /L %변수 IN (시작,단계,끝) DO 명령 [명령-매개 변수]


   집합은 단계별로 증가/감소하는 시작부터 끝까지의 일련의 숫자입니다.

   따라서 (1,1,5)는 1 2 3 4 5를 나타내며 (5,-1,1)은 5 4 3 2 1을

   나타냅니다.


FOR /F ["옵션"] %변수 IN (파일-집합) DO 명령 [명령-매개 변수]

FOR /F ["옵션"] %변수 IN ("문자열") DO 명령어 [명령-매개 변수]

FOR /F ["옵션"] %변수 IN ('명령어') DO 명령어 [명령-매개 변수]


    또는 usebackq 옵션이 있는 경우:


FOR /F ["옵션"] %변수 IN (파일-집합) DO 명령 [명령-매개 변수]

FOR /F ["옵션"] %변수 IN ('문자열') DO 명령어 [명령-매개 변수]

FOR /F ["옵션"] %변수 IN (`명령어`) DO 명령어 [명령-매개 변수]


   파일-집합은 하나 이상의 파일 이름입니다. 파일-집합의 각 파일은

   다음 파일로 이동하기 전에 열기 또는 읽기 등의 작업이 진행됩니다.

   파일을 읽어서 문자열을 한 행씩 분리하고 각 행을 0개 이상의

   토큰으로 구문 분석하는 과정으로 되어 있습니다. For 루프의 본문은발견된 토큰 문자열에 설정된 변수 값(들)과 함께 호출됩니다.

   기본값으로 /F는 파일의 각 행으로부터 분리된 토큰을 첫 번째 공백에전달합니다. 빈 행은 건너뜁니다. "옵션" 매개 변수를 지정하여

   기본 구문 분석 동작을 무시할 수 있습니다. 이것은 다른 구문 분석

   매개 변수를 지정하는 하나 이상의 키워드를 갖는 인용 부호로

   묶인 문자열입니다.

   키워드는 아래와 같습니다.


   eol=c  - 행 끝 설명 문자를 지정합니다 (하나만)

   skip=n  - 파일의 시작 부분에서 무시할 행의 개수를 지정합니다.

   delims=xxx  - 구분 문자 집합을 지정합니다.  이것은 공백 또


계속하려면 아무 키나 누르십시오 . . .


너무 길어서 짧게 끊었습니다. 위에서 사용한 명령어는 유닉스의 which java와 같이 PATH환경변수에 있는 디렉토리 경로를 훑으면서 제일 처음 만나는 java위치를 출력해줍니다. 즉, 윈도우용 which 명령어라고 생각하시면 될 것 같습니다.



이상입니다.




아래는 기록을 위해서 개인적으로 작성했던 노트입니다.

오픈소스 챗봇 테스트를 위해서 Docker 설치하고 테스트 한 이후부터 이클립스 실행이 안되는 현상 발생
    - 다시 동일한 디렉토리에 Oxygen버전 인스톨러를 이용해서 재설치 한 뒤 launch하면 기동이 되나, 재부팅 후에는 역시 또 안됨
    - Neon 버전처럼 패키지로 배포되는 이클립스는 새로 다운받아서 실행해도 실행 안됨
    - Java를 실행해보니 다음과 같은 에러 메시지 발생
        - Error occurred during initialization of VM
          java/lang/NoClassDefFoundError: java/lang/Object
    - 현재 jdk1.7과 1.8 버전이 설치되어있고 jre역시 7, 8 버전이 설치되어있음
    - 아래 명령어를 이용하여 어느 위치의 자바가 실행되고 있는지 확인
        for %i in (java.exe) do @echo. %~$PATH:i
        - C:\ProgramData\Oracle\Java\javapath\java.exe
    - jdk 1.8을 설치하면 환경변수에 위 경로로 세팅이 됨
    - Docker를 설치하고나서 위 java를 실행하면 에러가 발생함
    - jdk1.7, jdk1.8 의 java.exe를 실행하면 정상적으로  실행이 되는 것을 확인
    - jdk1.8을 재설치하여 정상적으로 java가 실행이 되도록 할 수도 있으나 일단은 환경변수 확인
    - 환경변수에는 JAVA_HOME에 jdk1.8의 패스가 잡혀있고 PATH에 %JAVA_HOME%\bin이 있음, 그리고 ProgramData\OracleJava\javapath도 잡혀있음
    - 환경변수에서 ProgramData\OracleJava\javapath 경로는 제거함
    - 다시 이클립스를 재기동 해보니 정상적으로 기동함

    - jre1.8의 java는 정상적으로 실행이 안됨 -> 재설치