유지보수 프로젝트에 들어가거나, 기존 업무 환경에서 작업해야할 경우 자신이 사용하고 있는 클래스가 위치한 위치를 찾고 싶은 경우가 있다.

다음과 같은 경우가 필요한 예일 것이다.

  • 실제 파일 위치를 확인 하기 위해서
  • NoSuchMethodError 가 날경우

 1. 실제 파일 위치를 찾기 위한 경우

해당 클래스가 위치한 실제 파일을 찾을 경우는 여러가지가 있다.

공통 jar 를 누군가가 배포해놓았는데, 교체를 해야하는데 어딨는지 도통 모르겠다거나,

그놈의 파일을 얻어다가 디컴파일 하고 싶은 욕구가 생길 경우가 그럴 경우다.

 2. NoSuchMethodError 가 날 경우

이 에러가는 나는 이유는 명백하다. 해당하는 클래스에 호출하는 메소드(메서드명과 인자가 일치하는) 가 없을 경우에 발생한다.

이 에러는 보통 다음과 같은 케이스에 발생하기 쉽다.

  • 런타임 환경에 배포를 안했을 때
  • 클래스 패스가 여러개 있어서, 우선순위가 높은 클래스패스에 이미 해당 클래스가 올려져 있을 때

런타임 환경에 배포를 안 했을 경우에는 참으로 기본적인 것이라 설명하는 것조차 무색하지만

후자의 경우에 많은 개발자들이 당황하기 쉽상이다.

즉, 다른 놈의 jar 안에 동일한명의 클래스가 올려져 있어서 이미 배포가 되어있는데 그것을 모르고 "배포했는데 왜 안되지? 왜 안되지?내렸다 올려도 안되네?"  하는 경우다.

하지만 프로그램은 참으로 정직하다.

대개 많은 개발자들이

내가 운영하고 있는 것도 아니고, 서버 구성도 모르는데 제가 어떻게 압니까?  나 몰라요 몰라

 할지 모르겠으나, 자바가 클래스 로드하는 개념만 분명히 알고 있다면 전혀 두려워 할 필요가 없을 거이다.

 

배포된 파일을 찾고자 할 경우에 해당하는 패키지명과 클래스는 개발자는 분명히 알고 있을것이다.

다음과 같이 작성하여 출력해보면 해당 위치를 찾을 수 있다.

 

java.net.URL r = this.getClass().getClassLoader().getResource("nts/toolkit/EnvelopedMessage.class");
System.out.println(r.toString());

 이 예는 nts.toolkit.EnvelopedMessage.class 가 어딨는지 출력하는 예이다. 이것을 출력하면 다음과 같은 출력을 볼 수 있다.

 

jar:file:/sys0.d/jeusdev2/jeus5/lib/application/NtsApi.jar!/nts/toolkit/EnvelopedMessage.class

 

이 말인 즉슨 jar 파일로 만들어져 있으며 jar 파일은 /sys0.d/jeusdev2/jeus5/lib/application/NtsApi.jar 이고 그 안에 nts.toolkit.EnvelopedMessage.class 가 있다는 뜻이다.

내가 안했다고 두려워하지 말길,,,

이 글은 스프링노트에서 작성되었습니다.

+ Recent posts