웹 애플리케이션을 개발 중입니다.로드 클래스가 웹 애플리케이션에서 클래스 경로에 동적으로 있지 않습니다. - 사용자 정의 클래스 로더를 사용하지 않습니다.
- 웹 응용 프로그램은 자바 클래스를 즉석에서 생성합니다. 예를 들어, 클래스를 생성합니다
com.people.Customer.java
- 내 코드에서 com.people.Customer.class를 가져 와서 일부 디렉토리에 저장하기 위해 동적으로 컴파일합니다.
repository/com/people/Customer.class
은 내 응용 프로그램 server.My 응용 프로그램 서버의 클래스 경로에 없습니다. WebSphere Application Server/Apache Tomcat 등 사용)은WEB-INF/classes
디렉토리에서 클래스를 선택합니다. Classloader는 이것을 사용하여 클래스를로드합니다. - 컴파일 한 후이 클래스를로드해야 생성 후에 다른 클래스에서 액세스 할 수 있습니다.
Thread.currentThread().getContextClassLoader().loadClass(com.people.Customer)
을 사용하면 분명히 Classloader는 클래스 경로에 있지 않으므로 클래스를로드 할 수 없습니다 (WEB-INF/classes
에는 없음). 비슷한 이유로 인해getResource(..)
또는getResourceAsStream(..)
도 작동하지 않습니다. 어쩌면 스트림 (또는 할 것입니다 다른 방법) 다음로드로 클래스Customer.class
읽기:
내가 할 수있는 방법이 필요하다. 다음은 제약 조건입니다.
WEB-INF/classes
폴더에 저장소 폴더를 추가 할 수 없습니다.- 새 사용자 정의 클래스 로더를 만들 수 없습니다. 새 ClassLoader를 만들고이 클래스를로드하면 상위 ClassLoader에서 액세스 할 수 없습니다.
이 방법이 있습니까?
더 나쁜 경우 웹 응용 프로그램의 사용자 정의 클래스 로더를 기본 클래스 로더로 대체하는 방법이 있습니까? 동일한 웹 응용 프로그램의 전체 수명주기 동안 동일한 클래스 로더를 사용하여 응용 프로그램을로드해야합니다.
어떤 솔루션 :
왜 WEB-INF/classes 폴더에 추가 할 수 없습니까? 이것이 진정한 해결책입니다. 어떤 상황에서도 "할 수 없다", "하지 않을 것인가", 또는 "하지 않을 것인가"인가? – duffymo
@duffymo : webapp이 확장 모드로 배포되고 webapp에 파일 시스템에 대한 쓰기 권한이 있다고 가정합니다. 프로덕션 환경에서 항상 그런 것은 아닙니다. WEB-INF/classes에 파일을 쓰는 것은 좋은 해결책이 아닙니다. – mhaller
아니, 그 어떤 것도 가정하지 않습니다. 여러분의 투시력이 떨어졌습니다. mhaller. 나는 필요한 모든 .class 파일을 포함하고 재배포하기 위해 WAR을 다시 포장해야한다고 주장한다. 고객의 입장에서 명백한 것을 만들어야하는 유스 케이스를보고 싶습니다. 인스턴스? 예. 수업? 아니, 나는 그것을 사지 않을거야. – duffymo