내가 솔루션 분할이 서로 다른 프로젝트의 클래스와 라이브러리를로드하는 방법 :동적으로이 개 프로젝트에 실행
- 독립 프로젝트 인터페이스
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에 지정된 클래스와 항아리를로드하는 좋은 방법이 있습니까? 코드 예제가 많이 감사하겠습니다.
* dependent 프로젝트는 시작시 * independent * 프로젝트의 classpath가 아니며 Hadoop 클라이언트 API (타사 라이브러리)가 포함 된 .jars도 아닙니다. 중첩 된'ClassLoader'에서 프로젝트를로드하는 방법과 META-INF/services가 어떻게 보이는지에 대한 간단한 코드 샘플을 추가 하시겠습니까? 일부 JDBC 드라이버를로드하는 것 외에는 클래스 로딩에 대한 경험이 없습니다. – drasto
@drasto - META-INF/services를 설정하는 방법에 대한 세부 정보와 연결된 javaodoc과 중첩 된 클래스 로더 설정에 대한이 웹 사이트에 대한 답변이 많이 있습니다. https://www.google.com/search?q = java + tutorial + urlclassloader. – jtahlborn