2012-11-12 2 views
1

내가 솔루션 분할이 서로 다른 프로젝트의 클래스와 라이브러리를로드하는 방법 :동적으로이 개 프로젝트에 실행

  • 독립 프로젝트 인터페이스 ExampleInf를 포함하고 응용 프로그램에 필요한 일부 서비스를 선언합니다. 이러한 서비스는 타사 API (Hadoop 클라이언트 API)에서 제공합니다. 이 프로젝트는 GUI 구성 요소 및 기타 응용 프로그램 논리를 포함하지만 ExampleInf으로 선언 된 서비스를 제공하는 타사 라이브러리는 연결하지 않습니다. 이 프로젝트에는 ExampleInf을 구현하는 클래스가 없습니다.
  • 종속 타사 라이브러리에 대한 링크가 포함 된 프로젝트입니다. 이 프로젝트는 타사 API를 캡슐화하고 ExampleInf을 구현하는 클래스 ExampleImpl을 포함합니다. 독립 프로젝트에서

ExampleInf에 의해 선언 된 클래스 (의 클래스 A를 호출하자) 그 (용도)을 소비하는 서비스가있다. 독립종속적 인 프로젝트를 연결하지 않으므로 ExampleInf을 사용하려면 런타임에 해당 구현 ExampleImpl을 동적으로로드해야합니다. 또한 ExampleImpl이 필요로하는 모든 타사 라이브러리를 동적으로로드해야합니다.

는 현재이 따라 동적으로로드 된 자원이있는 프로젝트와 지저분한 ClassLoader 많은 코드에 경로를 포함 할 상수 (public static final String 특성)의 무리에 의해 이루어집니다. 나는 이것이 좋은 해결책이라고 생각하지 않는다. 이것이 가능한 패턴, 모범 사례 또는 일반적인 방법이 있습니까? 당신의 경험에서 당신은 무엇을 권하고 싶습니까?

이 패턴은 Java EE에서 약간의 종속성 삽입을 상기시켜줍니다. 적어도 나는 XML에 동적으로로드해야하는 클래스와 라이브러리 (.jar-s)의 위치를 ​​외부화하고 각 상수에 대해 ClassLoader.loadClass을 별도로 호출하는 대신 주기적으로로드하는 것이 좋습니다. 같은 패키지에 XML을로드하고 해당 XML에 지정된 클래스와 항아리를로드하는 좋은 방법이 있습니까? 코드 예제가 많이 감사하겠습니다.

답변

1

ServiceLoader 유틸리티를 사용할 수 있습니다 (이것은 xml 라이브러리와 최신 jdbc 드라이버 라이브러리와 같이로드되는 jdk 서비스의 수입니다). 종속 프로젝트가 시작시 classpath의 일부인 경우 올바르게 설치되었다고 가정하면 좋습니다. 그렇지 않으면 중첩 된 클래스 로더에서 종속 프로젝트를로드하여 load(Class,ClassLoader) 메소드에 전달하거나 load(Class)을 호출하기 전에 클래스 로더를 현재 컨텍스트 클래스 로더로 설정해야합니다.

+0

* dependent 프로젝트는 시작시 * independent * 프로젝트의 classpath가 아니며 Hadoop 클라이언트 API (타사 라이브러리)가 포함 된 .jars도 아닙니다. 중첩 된'ClassLoader'에서 프로젝트를로드하는 방법과 META-INF/services가 어떻게 보이는지에 대한 간단한 코드 샘플을 추가 하시겠습니까? 일부 JDBC 드라이버를로드하는 것 외에는 클래스 로딩에 대한 경험이 없습니다. – drasto

+0

@drasto - META-INF/services를 설정하는 방법에 대한 세부 정보와 연결된 javaodoc과 중첩 된 클래스 로더 설정에 대한이 웹 사이트에 대한 답변이 많이 있습니다. https://www.google.com/search?q = java + tutorial + urlclassloader. – jtahlborn

관련 문제