Java 8에서 새 ResourceBundleControlProvider
프레임 워크를 사용하여 Oracle 자체에서 수정하지 않을 항목 (자원 번들을 읽을 때 사용되는 기본 인코딩)을 수정한다고 생각했습니다.내 ResourceBundleControlProvider가로드되지 않는 이유는 무엇입니까?
package com.acme.resources;
import java.util.ResourceBundle;
import java.util.spi.ResourceBundleControlProvider;
public class AcmeResourceBundleControlProvider implements ResourceBundleControlProvider
{
private static final ResourceBundle.Control CONTROL = new AcmeResourceBundleControl();
@Override
public ResourceBundle.Control getControl(String baseName)
{
if (baseName.startsWith("com.acme."))
{
return CONTROL;
}
else
{
return null;
}
}
}
META-INF/서비스/java.util.spi.ResourceBundleControlProvider :
com.acme.resources.AcmeResourceBundleControlProvider
package com.acme.resources;
import java.io.IOException;
import java.util.Locale;
import java.util.ResourceBundle;
public class AcmeResourceBundleControl extends ResourceBundle.Control
{
@Override
public ResourceBundle newBundle(String baseName, Locale locale, String format,
ClassLoader loader, boolean reload)
throws IllegalAccessException, InstantiationException, IOException
{
throw new UnsupportedOperationException("TODO");
}
}
가 그럼 난 공급자를 만든 :
그래서 내가 컨트롤을 만든
그런 다음 방금 IDEA에서 애플리케이션을 실행하려고 시도했지만 내 제공자가로드되지 않는다는 것을 알았습니다 (그렇지 않으면 excepti 에 제기 될 것입니다.)
나는 이름을 확인하고 모두 일치하는 것 같습니다. IDEA가 사용하는 컴파일러 출력 디렉토리를 점검했고 서비스 파일을 포함합니다. 난 그냥 서비스를 검색하려고 간단한 테스트 프로그램을 작성 :
public static void main(String[] args)
{
for (ResourceBundleControlProvider provider :
ServiceLoader.load(ResourceBundleControlProvider.class))
{
System.out.println(provider.getClass());
}
}
이 인쇄 밖으로 내 구현 클래스의 이름을 하나 개의 항목을 수행합니다. 따라서 문제는 서비스 파일에 이 아니고이 아닙니다.
ResourceBundle 내에서 중단 점이 있으면 사용자 지정 공급자 클래스에 액세스 할 수있는 것 같습니다. 디버거에 처음 들어가면 ServiceLoader가 구현을 찾지 못했지만 그 이유는 알 수 없습니다. 내 클래스를로드하지 않는 결과를 가져 오는 dodgy 클래스 로더 마법이 있다고 확신합니다. :(
the Javadoc에 대한 몇 가지 무서운 문서는 글로벌 확장 프로그램으로 설치해야하는 것처럼 들리지만, 실제로 그렇다면 매우 유용합니다. 기본 (그리고 내 의견으로는 깨진) 행동.하지만 그 문제에 대해서도 the tutorial을 읽었습니다. 그런 식으로는 설명하지 못했습니다 (좋은 행동이 자바 8에서 막판에 나오지 않는 한, 문서는 out of date!)
수동으로 애플리케이션을 jar 한 다음 jar (디렉토리 구조 보장)를 실행하면 어떻게됩니까? 나는 IDEA 사용자는 아니지만, 단지'META-INF/services/java.util.spi.ResourceBundleControlProvider'가 런타임 클래스 경로에 없거나 검사되지 않습니다. – Muel
항아리에서 실행하면 내 공급자에게 전화하는 것 같지 않습니다. 이상하게도, * my * 코드의 ServiceLoader.load()는 공급자를 찾았지만, ResourceBundle.getBundle()은 그렇지 않습니다. 이것은 공급자 프레임 워크를 가지고있는 목적을 무력화시키는 것 같습니다. :/ – Trejkaz