2013-03-28 3 views
1

우리는 모두 특정 JSF 라이브러리를 사용하는 많은 webapps를 보유하고 있습니다. 라이브러리를 공통 위치 또는 기본 클래스 경로에 배치하려고합니다. 문제는 시스템이 라이브러리가 WEB-INF/lib에 있기를 기대하므로 웹 응용 프로그램 클래스 로더가이를 스캔하여로드 할 수 있습니다.공용 디렉토리에서 JSF/facelets 라이브러리를로드하는 방법은 무엇입니까?

우리는이 특정 라이브러리의 작성자이며 개발 중에는 기본 클래스 경로에서 쉽게 사용할 수 있습니다.

이것이 가능합니까? 누구든지 web.xml에 넣을 예제를 제공 할 수 있습니까? (이것이 올바른 메커니즘이라면)?

+2

서버 공용 라이브러리 폴더에서 JSF 라이브러리를 설정하려고 시도 했습니까? –

+0

어떤 서블릿 컨테이너를 사용하고 있습니까? 그들 모두는 모든 webapp에 걸쳐있는 lib 폴더를 가지고 있습니다. Tomcat에서'$ CATALINA_BASE/lib /'에 추가 할 것입니다. – Lucas

+0

Tomcat을 사용하고있는 것처럼 들립니다. 그렇다면 $ CATALINA_BASE/lib 폴더에 .jar 파일을 설치할 수 있습니다. 앱 서버 (예 : JBoss 또는 WebSphere)를 사용하는 경우 더 많은 옵션이 있습니다. – paulsm4

답변

4

우리는이 특정 라이브러리의 작성자이며 개발 중에는 기본 클래스 경로에서 쉽게 가져올 수 있습니다. 이것이 가능한가?

Facelets 리소스의 경우 webapp 자체에서 사용자 정의 ResourceResolver으로 가능합니다.

public class FaceletsResourceResolver extends ResourceResolver { 

    private ResourceResolver parent; 
    private String basePath; 

    public FaceletsResourceResolver(ResourceResolver parent) { 
     this.parent = parent; 
     this.basePath = "META-INF/resources"; // TODO: Make configureable? 
    } 

    @Override 
    public URL resolveUrl(String path) { 
     URL url = parent.resolveUrl(path); // Resolves from WAR which would also do META-INF/resources of JARs in WAR. 

     if (url == null) { 
      url = getClass().getResource("/" + basePath + path); // Resolves from JARs in WAR when base path is not META-INF/resources. 
     } 

     if (url == null) { 
      url = Thread.currentThread().getContextClassLoader().getResource(basePath + path); // Resolves also from anywhere else in classpath. 
     } 

     return url; 
    } 

} 

것은, 그것을 실행에 도착 웹 애플리케이션의이 web.xml에서 다음과 같이 구성하려면 다음 JSF 주석 스캐너로 스캔 할 필요가 등 관리 콩 같은 주석 JSF 아티팩트에 대한

<context-param> 
    <param-name>javax.faces.FACELETS_RESOURCE_RESOLVER</param-name> 
    <param-value>com.example.FaceletsResourceResolver</param-value> 
</context-param> 

이가 불가능합니다. JAR은 실제로 /WEB-INF/lib에 있습니다. 또한 How to reference JSF managed beans which are provided in a JAR file?

+0

리소스가 항아리에 없더라도이 ResourceResolver를 기본 클래스 경로에서 가져올 수 있습니까? 개발시 우리는 Eclipse를 사용하고 Eclipse는 열려있는 프로젝트의/classes 디렉토리를 클래스 경로에 놓습니다. – ccleve

+0

'Thread.currentThread(). getContextClassLoader()'도 그렇게합니다. – BalusC

0

웹 서버와 함께 제공되는 공유 폴더 메커니즘을 시도 할 수 있습니다. jar 파일을 해당 폴더에 저장하십시오. 어디서나 액세스 할 수 있습니다.

0

당신이 부두를 사용하고 있기 때문에, 아마 당신의 최선의 선택 $jetty.home/lib/ext에 라이브러리를 배치하는 것입니다 :

http://docs.codehaus.org/display/JETTY/Classloading

시작시는 부두 런타임이 자동으로 최상위 레벨에서 모든 항아리를로드 $ jetty.home/lib/management /, $ jetty.home/lib/naming/etc와 같은 특정 하위 디렉토리와 함께 $ jetty.home/lib를 시작 부분에 포함 된 start.config 파일에 이라는 이름으로 지정합니다 .항아리. 또한, 모든 jar 파일을 $ jetty.home/lib/ext에 재귀 적으로로드합니다. 따라서 부두에 추가 항아리를 추가하려면 $ jetty.home/lib/ext 내에 이러한 jar가 포함되도록 파일 계층 구조를 원하는만큼 깊게 만들 수 있습니다. 물론 자신의 start.config 파일을 만들고 대신 을 사용하여이 기본값 인 동작을 변경할 수 있습니다.

+0

질문에서 "JSF"부분을 놓친 것일까 요? 이것은 JAR을 webapp의 classpath가 아닌 "global"classpath에 넣는 것입니다. http://stackoverflow.com/questions/7663818/how-to-reference-jsf-managed-beans-which-are-provided-in-a-jar-file/7663898#7663898 – BalusC

+1

아니요 작동하지 않습니다. . JSF 라이브러리는 다릅니다. webapp 클래스 로더는 jar 파일에서 face-config.xml, whatever.taglib.xml 등과 같은 특정 특정 항목을 검색해야합니다. 발생하지 않는 공통 lib 디렉토리에있는 경우. – ccleve

관련 문제