2010-11-23 6 views
1

.class 파일이 많은 폴더가 있습니다. 이 수업은 'app 1'에서 업데이트됩니다. 그리고 그 클래스들을 다이나믹하게로드하는 'app 2'이 있습니다.tomcat - 클래스를 동적으로 다시로드하십시오.

그리고 문제가 ....

'응용 프로그램이'는 클래스 은 '응용 프로그램이 2'다시 필요 파일, '응용 프로그램 1'다음 파일 업데이트 클래스 만 사용 나이 든 학급의 사본을 보관하고 사용하는 것처럼 보입니다.

그래서 폴더를 확인하고 클래스가 성공적으로 업데이트되었으므로 'app 2'을 다시로드하려고 시도했지만 이전 클래스를 계속 사용합니다.

바람둥이를 다시 시작하는 경우에만 'app 2'은 새 클래스를 읽습니다.

왜 그럴까요? 'app 2'을 다시로드 할 수는 있지만 생산 환경에서는 tomcat을 다시 시작할 수 없습니다.

내 직업에 매우 중요한

그것의, 내가 어떤 생각을 주셔서 감사합니다 .....

내가 tomcat6를 새로 설치를 사용하고 내가 가진 클래스 파일을로드 : Class.forName(<classname>).newInstance()

들으 많은

답변

0

이 두 가지 응용 프로그램에 대해 클래스를 분리해야한다고 생각합니다. 먼저 동일한 디렉토리 2 개를 만들어보십시오. 하나는 app1, 두 번째는 app2. 이것으로 문제가 해결되면 클래스를 jar 파일로 압축하고 jar 파일을 2 개만 복제합니다. 문제는 자바가 아니라 파일 시스템이라고 생각합니다. 나는 당신이 창문을 사용하고 있다고 믿는다. 아마도 리눅스에서 지금하고있는 일을하려고한다면 (회사와 관련이 없다면).

3

문제는 런타임이 이미 수정 된 클래스를 사용하려는 코드에서 사용중인 클래스 로더에 이전 클래스 파일을로드했기 때문입니다. 원하는 것을 성취하기 위해 클래스 로더가 디스크로부터 클래스 내용을 새로 고치는 방법을 찾아야 할 것입니다. Class.forName()이 작동하지 않는 이유는 이미로드 된 (캐시 된) 버전의 클래스에 액세스하기 때문입니다. Alex R은이 두 프로젝트에 대한 클래스를 분리하기 위해 코드를 재구성해야한다는 것이 옳다. 그러나 클래스를 다시로드하고 자신이 원하는대로 유지하려고 시도하는 데에 죽었다면 Classloader.defineClass()를 시험해보고 클래스 파일의 새 버전을 byte [] 파일로로드 해 볼 수 있습니다. 그 바이트 []를 Classloader.defineClass()에 전달합니다. Tomcat이 응용 프로그램과 연관된 컨텍스트 클래스 로더 (최상위 Tomcat 클래스 로더 대신)를 사용하고 싶을 가능성이 가장 높습니다. Tomcat 프로젝트 문서에서이 둘을 구분하는 문서가 있습니다.

1

기본적으로 클래스는 클래스가로드 된 ClassLoader에 의해 캐시됩니다. 다음을 수행하는 경우 : Class.forName('MyClass') 두 번 연속으로 수업을 처음으로로드합니다.

클래스를 다시로드하려면 이미이 클래스의 모든 인스턴스에 대한 참조를 릴리스 할뿐만 아니라로드 한 ClassLoader에 대한 참조를 모두 릴리스해야합니다. 그래야만 전체 클래스가 가비지 수집 될 수 있습니다 (또는 메모리 누수로 끝날 것입니다 - 웹 응용 프로그램을 다시로드 할 때 자주 발생하는 문제).

ClassLoader을 확장하고 캐싱 동작을 변경할 수 있어야합니다.

+0

안녕, 임 내가 캐싱 동작을 변경할 수있는 방법, 당신이해야 할 일을 시도하려고하지만? – david

관련 문제