NetBeans 모듈 응용 프로그램에서 java ServiceLoader를 사용하는 데 문제가 있습니다. 여기에 내가 뭘 하려는지 (그리고 그것은 Eclipse에서 정상적인 자바 응용 프로그램에서 작동합니다) :NetBeans 6.9 모듈 응용 프로그램에서 java ServiceLoader를 만드는 방법
나는 인터페이스를 선언하는 interface.jar 있습니다. 그리고이 인터페이스의 구현이 여러 개있는 implementations.jar가 있습니다. 모두 spi/META-INF/services/my.package.name.MyInteface 파일에 지정되어 있습니다 (이 파일은 implemenations.jar에 있음).
나는 또한 모든 구현로드하기 위해 다음과 같은 방법이있는 클래스 ImplementationHandler (또 다른 handler.jar에서)를 가지고:합니다 (foundImplementations.size을
private static List<MyInterface<?>> loadAllImplementations() {
List<MyInterface<?>> foundImplementations = Lists.newArrayList();
try {
for (MyInterface implementation : ServiceLoader.load(MyInterface.class)) {
foundImplementations.add(implementation);
}
} catch (ServiceConfigurationError error) {
system.out.println("Exception happened");
}
return foundImplementations;
}
이 코드는 이클립스 일반 응용 프로그램의 모든 구현을 반환합니다()> 0).
그러나 NetBeans에서는 (foundImplementations.size() == 0) 아무것도 찾을 수 없습니다.
자세한 내용은 :
내가하는 MyInterface 구현의 일부를 사용하여 확장 할 필요가 넷빈즈 모듈 응용 프로그램 (내게로 작성되지 않은 오픈 소스)의 소스를 가지고있다. interface.jar, implementations.jar 및 handler.jar은 Eclipse에서 작성되며 다른 응용 프로그램의 일부입니다.
NetBeans에서 새로운 impplementations를 사용해야하는 모듈을 열었고 모든 3 개의 jar 파일을 외부 라이브러리로 추가했습니다 (NetBeans가 ext 폴더에 복사했는데 할 수는 없지만 할 수 없습니다). 아무것도에 대해 - 나는 그들을 다른 myext 폴더에 넣고 싶지만 다른 이야기이다). 그럼 난 모든 것을 다시 내 구현 중 하나를 사용하려고하지만, 찾을 수 없습니다 ... 구현을 가져옵니다 코드는 ImplementationHandler 클래스이며, 다음과 같습니다에 내 예외를 가지고
public static final <T> MyInteface<T> getByName(String name) {
for (MyInteface implementation : loadAllImplementations()) {
if (implementation.getName().equals(name)) {
return implementation;
}
}
throw new IllegalArgumentException("Unable to find MyInterface class for: " + name);
}
"할 수 없습니다 MyImplayerName에 대한 MyInteface 클래스 찾기 ...
NetBeans에 대한 지식이 매우 부족하며이 기능을 사용하려면 더 많은 작업이 필요합니까?
'spi/META-INF/services /'의 'spi'가 오타입니까? META-INF 폴더는 클래스 경로의 루트 디렉토리에 있어야합니다. –
예, 죄송합니다. 파일을 빌드 스크립트에서 가져온 "소스"경로를 붙여 넣었습니다. 항아리의 뿌리에 들어갑니다. 만약 거기에 없었다면, 그것도 일식에서 일한해서는 안됩니다 :) –