XStream classes not found

  1. I download openhab-4.1.0-SNAPSHOT.zip to Windows 10 machine
  2. Unzip it
  3. Copy my newly created binding to addons
  4. start.bat fresh OH4.
  5. Type log:tail
  6. Add new item
  7. Auto-discovery finds it.
  8. When I add required parameters and try to start it. I got following error:
19:08:39.956 [WARN ] [ommon.WrappedScheduledExecutorService] - Scheduled runnable ended with an exception:
java.lang.NoClassDefFoundError: org/xmlpull/v1/XmlPullParserException
        at com.thoughtworks.xstream.XStream.<init>(XStream.java:351) ~[?:?]
        at org.openhab.binding.entsoe.internal.client.EntsoeClient.<clinit>(EntsoeClient.java:50) ~[?:?]
        at org.openhab.binding.entsoe.internal.price.PriceHandler.getClient(PriceHandler.java:98) ~[?:?]
        at org.openhab.binding.entsoe.internal.price.PriceHandler.getService(PriceHandler.java:109) ~[?:?]
        at org.openhab.binding.entsoe.internal.price.PriceHandler.handleRefresh(PriceHandler.java:123) ~[?:?]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) ~[?:?]
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) ~[?:?]
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) ~[?:?]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[?:?]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[?:?]
        at java.lang.Thread.run(Thread.java:833) ~[?:?]
Caused by: java.lang.ClassNotFoundException: org.xmlpull.v1.XmlPullParserException cannot be found by xstream_1.4.20
        at org.eclipse.osgi.internal.loader.BundleLoader.generateException(BundleLoader.java:541) ~[org.eclipse.osgi-3.18.0.jar:?]
        at org.eclipse.osgi.internal.loader.BundleLoader.findClass0(BundleLoader.java:536) ~[org.eclipse.osgi-3.18.0.jar:?]
        at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:416) ~[org.eclipse.osgi-3.18.0.jar:?]
        at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:168) ~[org.eclipse.osgi-3.18.0.jar:?]
        at java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[?:?]
        ... 11 more

The documentation says that com.thoughtworks.xstream package should be on the default libraries. Should I define them in pom.xml somehow etc?

I found solution from Stack Overflow by using new XStream(new StaxDriver()) constructor.

Now the next problem is that DTO classes aren’t found. Unit tests work correctly.

How to export DTO classes from bundle? I tried to move classes out of org.openhab.binding.xxx.internal.client.dto.XxxDtoClass to org.openhab.binding.xxx.client.dto.XxxDtoClass with no success.

Caused by: com.thoughtworks.xstream.mapper.CannotResolveClassException: org.openhab.binding.xxx.client.dto.XxxDtoClass
        at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:81) ~[?:?]
        at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125) ~[?:?]
        at com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:55) ~[?:?]
        at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125) ~[?:?]
        at com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88) ~[?:?]
        at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125) ~[?:?]
        at com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.java:79) ~[?:?]
        at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125) ~[?:?]
        at com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:74) ~[?:?]
        at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125) ~[?:?]
        at com.thoughtworks.xstream.mapper.SecurityMapper.realClass(SecurityMapper.java:71) ~[?:?]
        at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125) ~[?:?]
        at com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:47) ~[?:?]
        at com.thoughtworks.xstream.core.util.HierarchicalStreams.readClassType(HierarchicalStreams.java:29) ~[?:?]
        at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:135) ~[?:?]
        at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32) ~[?:?]
        at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1464) ~[?:?]
        at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1441) ~[?:?]
        at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1321) ~[?:?]
        at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1312) ~[?:?]

The error happens in:

package com.thoughtworks.xstream.mapper;

public class DefaultMapper implements Mapper {
    @Override
    public Class<?> realClass(final String elementName) {
        final Class<?> resultingClass = Primitives.primitiveType(elementName);
        if (resultingClass != null) {
            return resultingClass;
        }
        try {
            boolean initialize = true;
            final ClassLoader classLoader;
            if (elementName.startsWith(XSTREAM_PACKAGE_ROOT)) {
                classLoader = DefaultMapper.class.getClassLoader();
            } else {
                classLoader = classLoaderReference.getReference();
                initialize = elementName.charAt(0) == '[';
            }
            return Class.forName(elementName, initialize, classLoader);
        } catch (final ClassNotFoundException | IllegalArgumentException e) {
            throw new CannotResolveClassException(elementName);
        }
    }
}

So I think this is class loading issue. Aww I love OSGi :hot_face:

Don’t try to reinvent the wheel :wink: and have a look at how other add-ons do this by setting the class loader:

1 Like

Jep, that worked. Thanks! And I realized that this isn’t bug tracker, I’ll use Github next time. Sorry!

1 Like