2012-08-27 2 views
5

기존 Clojure 지원을 추가 할 Tomcat에서 Java Webapp를 실행하고 있습니다. 당분간, 나는 Clojure 소스 파일을 클래스 패스의 리소스로 포함시키고 이것을 clojure.lang.RT을 통해 호출 할 뿐이다. 원시적이지만 잘 작동합니다.Tomcat에서 Clojure 코드 다시로드

그러나 Tomcat의 WebappClassLoader 캐시 리소스는 Clojure가 소스 코드를 검색하고 컴파일하는 데 사용하는 getResourceAsInputStream()을 통해 검색 한 것으로 나타났습니다. 즉, (require 'my-ns :reload)을 실행하면 디스크에 업데이트 된 파일이 있어도 파일의 캐시 된 버전 만 다시로드됩니다. Clojure 파일의 캐싱을 피하거나 피하는 방법이 있습니까?

가장 좋은 결과는 WebappClassLoader.resourceEntries에서 반사를 사용하여 끔찍한 인 항목을 수동으로 제거하는 것입니다.

나는 뭔가를 놓쳤을 것입니다.

"Jetty/Glassfish/JBoss 사용", "Tomcat 재시작"등의 답변은 내가 찾고있는 것과 다릅니다.

답변

2

당신은 거기에서 WebappClassLoader의 행동을 피할 수 없을 것입니다. 당신이 무엇 수 있습니다 그 관할 구역 외부에로드되는 코드를 이동합니다; 예 : 최대 $CATALINA_HOME/lib까지, here으로 기재되어있다.

실제로 의존성을 모두 이동해야합니다. 실제로 웹 응용 프로그램으로 배포하는 .war 파일은 모든 코드가 이미 다른 곳에서 사용 가능할 것으로 기대하는 작은 쉘로 남겨 두어야합니다.

이렇게하면 WebappClassLoader의 관할권을 벗어나고 잘하면 그 의미도 알 수 있습니다. (부모 클래스 로더에서로드 된 것들을 캐시한다면, 이는 완전히 IMO를 깨뜨린 것처럼 보일 것입니다.)

+0

감사 Chas. 나는 이것을 조금 생각해야 할 것입니다. 'lib'에 물건을 넣는 것이 그렇게 편하지 않습니다. '* use-context-classloader *'가 다른 것들을 망쳐 놓지 않고 영향을 줄지 궁금하다. –

+0

@DaveRay'* use-context-classloader *'는 기본적으로 true입니다. false로 설정하면로드가 Clojure 자체를로드 한 ClassLoader를 통해 라우트하게됩니다. Clojure가 webapp에서로드 된 경우 효과가 없거나 clojure.jar를'$ CATALINA_HOME/lib에 넣을 경우 '하지만 웹 응용 프로그램에서 코드를로드하려고 시도). Q : webapp에서 REPL 서버를 시작하고 연결 한 다음 그런 식으로 코드를로드하지 않는 이유는 무엇입니까? – cemerick

+0

감사. 어쩌면 난 단지 충분히 REPL 서버를 사용하는 방법에 창조적이 아니에요 :) 내가 디스크에 여러 파일에 걸쳐 코드 무리가 있다고 가정 해보십시오.나는 repl 서버를 실행하면서 Tomcat을 시작한다. 어떻게 그 코드를 모두 얻을 수 있는가? –

0

Clojure 소스 파일을 WEB-INF 아래에 둘 수 있습니까? 그럼 당신은이 톰캣의 소스에서 해제 캐시 그루비 클래스를로드하기 위해 과거에 나를 위해 일한

servletContext.getResourceAsStream("/WEB-INF/foo/core.clj");

) http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/ServletContext.html#getResourceAsStream(java.lang.String를 사용하여 읽을 수 있습니다.

+0

그런 식으로 파일을로드하려면'clojure.lang.RT'를 얻을 수 있다면 그렇게 될 것 같습니다. 그렇지 않으면'(require 'foo : reload)'는 컨텍스트 클래스 로더를 계속 사용합니다. –

0

cachingAllowed 플래그와 관련이 있습니까? here? 그냥 파란색으로 촬영. 나는이 캐시되지 그물에 발언을 발견

(io/input-stream (io/resource "bla.clj")) 

:

0

또는 라인을 따라 무언가를 Clojure에서의 패치 버전을 사용하십시오.

+0

'(io/resource)'는 컨텍스트 클래스 로더를 사용하므로 Tomcat을 통해 캐싱됩니다. :( –

+0

@ dave-ray 나는'.getResource' ('io/resource'에 의해 사용됨)가 캐쉬되지 않는다는 주장을 발견했습니다. Tomcat에 대해서는 모르겠지만, 내 생각에 이것은 모두 추측입니다.] – kotarak

관련 문제