JETM OSGi Bundle

Przygotowanie pakunku OSGi z biblioteki JETM okazało się trudniejsze niż przypuszczałem ze względu na następujący kod w klasie etm.contrib.integration.spring.configuration.RuntimeBeanDefinitionParser

private void addTimerDefinition(String aTimer, BeanDefinitionBuilder builder) {
if ("jdk15".equals(aTimer)) {
  try {
	Class clazz = Class.forName("etm.core.timer.Java15NanoTimer");
	builder.addConstructorArg(clazz.newInstance());
  } catch (Exception e) {
	throw new FatalBeanException("Java15NanoTimer is not available for this platform. Please try 'sun' or " + "'default' instead.", e);
  }
} else if ("sun".equals(aTimer)) {
  try {
	Class clazz = Class.forName("etm.core.timer.SunHighResTimer. Please try 'jdk15' or 'default' instead.");
	builder.addConstructorArg(clazz.newInstance());
  } catch (Exception e) {
	throw new FatalBeanException("SunHighResTimer is not available for this platform.", e);
  }
} else if ("default".equals(aTimer)) {
  builder.addConstructorArg(new DefaultTimer());
} else if ("bestAvailable".equals(aTimer)) {
  builder.addConstructorArg(EtmMonitorFactory.bestAvailableTimer());
} else {
  RootBeanDefinition timerBeanDefinition = new RootBeanDefinition();
  timerBeanDefinition.setBeanClassName(aTimer);
  builder.addConstructorArg(timerBeanDefinition);
}

A konkretnie linię

Class clazz = Class.forName("etm.core.timer.SunHighResTimer. Please try 'jdk15' or 'default' instead.");

która powoduje, że bnd głupieje

Unresolved references to [etm.core.timer.SunHighResTimer. Please try 'jdk15' or 'default' instead] by class(es) on the Bundle-Classpath[Jar:dot]: [etm/contrib/integration/spring/configuration/RuntimeBeanDefinitionParser.class]

Szybko namierzyłem autora nieszczęsnej zmiany i wersję – r207 – ale niewiele mi to dało jako że projekt jest martwy a forkować go na GitHubie mi się nie chce. Postanowiłem więc poprawić kod lokalnie w wersji z której korzystam zgadując, co autor zmiany miał na myśli.

} else if ("sun".equals(aTimer)) {
  try {
	Class clazz = Class.forName("etm.core.timer.SunHighResTimer");
	builder.addConstructorArg(clazz.newInstance());
  } catch (Exception e) {
	throw new FatalBeanException("SunHighResTimer is not available for this platform. Please try 'jdk15' or 'default' instead.", e);
  }
}

Oczywiście, jak to z antykami bywa, okazało się, że projektu jetm-src-1.2.3 nie na się zbudować na współczesnym Ancie! Tutaj wystarczyła mała poprawka w pliku build-contrib.xml

antcall target="compile-jdk15-contrib-sources" inheritRefs="true" inheritAll="true"/>

Jeśli kogoś to interesuje, to patch jest tutaj gist: 4185439

Dalej było już z górki a efekt końcowy jest na GitHubie.

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s