svendiedrichsen / jollyday

Jollyday - A holiday API
Other
186 stars 115 forks source link

Illegal us of internal JDK package #116

Open burberius opened 4 years ago

burberius commented 4 years ago

I got the following errors when trying to run a test with openJDK 12. I guess the com.sun.xml package was removed.

Aug. 20, 2019 9:48:27 VORM. de.jollyday.util.XMLUtil unmarshallConfiguration
WARNUNG: Could not create JAXB context using the current threads context classloader. Falling back to ObjectFactory class classloader.

java.lang.IllegalStateException: Cannot instantiate configuration from URL 'jar:file:/home/me/.m2/repository/de/jollyday/jollyday/0.5.7/jollyday-0.5.7.jar!/holidays/Holidays_de.xml'.

    at de.jollyday.datasource.impl.XmlFileDataSource.getConfiguration(XmlFileDataSource.java:43)
    at de.jollyday.impl.DefaultHolidayManager.doInit(DefaultHolidayManager.java:209)
    at de.jollyday.HolidayManager.init(HolidayManager.java:319)
    at de.jollyday.caching.HolidayManagerValueHandler.createValue(HolidayManagerValueHandler.java:44)
    at de.jollyday.caching.HolidayManagerValueHandler.createValue(HolidayManagerValueHandler.java:13)
    at de.jollyday.util.Cache.lambda$get$0(Cache.java:43)
    at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1705)
    at de.jollyday.util.Cache.get(Cache.java:43)
    at de.jollyday.HolidayManager.createManager(HolidayManager.java:166)
    at de.jollyday.HolidayManager.getInstance(HolidayManager.java:146)
[...]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:567)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: java.lang.IllegalStateException: Cannot parse holidays XML file.
    at de.jollyday.util.XMLUtil.unmarshallConfiguration(XMLUtil.java:75)
    at de.jollyday.datasource.impl.XmlFileDataSource.getConfiguration(XmlFileDataSource.java:41)
    ... 39 more
Caused by: javax.xml.bind.JAXBException: Implementation of JAXB-API has not been found on module path or classpath.
 - with linked exception:
[java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory]
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:177)
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:364)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:508)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:465)
    at de.jollyday.util.XMLUtil$JAXBContextCreator.create(XMLUtil.java:121)
    at de.jollyday.util.XMLUtil.unmarshallConfiguration(XMLUtil.java:68)
    ... 40 more
Caused by: java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at javax.xml.bind.ServiceLoaderUtil.nullSafeLoadClass(ServiceLoaderUtil.java:122)
    at javax.xml.bind.ServiceLoaderUtil.safeLoadClass(ServiceLoaderUtil.java:155)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:174)
    ... 45 more

This could be related to #72

svendiedrichsen commented 4 years ago

Thanks for the hint. I'm working on modularizing jollyday to allow for different XML parsing framworks to be used. Please be patient as I'm doing this in my spare time.

burberius commented 4 years ago

Why do you want to modularize it? For Android and normal systems? You can also use jackson-databind on Android, according so several posts I found. The JXB annotated class could be generated (at compile time) with xjc as described in the article I mentioned and then use those classes with Jackson Databind.

svendiedrichsen commented 4 years ago

I have had several different opinions on the usage of different frameworks for parsing XML.

Some cannot use JAXB classes (like on Android) or they don't want to add JAXB dependencies (for JDK >= 11). For those I think there should be an alternative without JAXB. This includes the generated classes as they carry JAXB annotations.

Some already have JAXB on their classpath and don't want additional dependencies like Jackson and its transitives to blow up their deployment size and/or have dependency collisions.

So to allow anyone to choose I think it is best to extract the XML parsing and allow each of it.

burberius commented 4 years ago

I would suggest not to generate the classes at all but code them, I guess they will change rarely. So you don't have the JAXB annotations and are neutral for the binding implementation.

Then increase the JDK version to 9 and use Java modules for the implementation, as described here: https://labs.consol.de/development/2017/02/13/getting-started-with-java9-modules.html

So you have one maven module jollyday-base that defines an interface for a XML parser and also uses an implementation on the classpath to parse the XML data. And then for example a module jollyday-jackson that uses jackson-databind to implement the interface. Although it could be difficult to test the code then or at least it's a lot of work to change the tests accordingly.

Just shout when you need any help!

svendiedrichsen commented 4 years ago

thanks for your offer. i'll get back to you if i need some help then.

hakan42 commented 4 years ago

Then increase the JDK version to 9 and use Java modules for the implementation

I know we are a little bit behind the update schedule, but OpenHAB (as a consument of this library) still depends on Java 8...

svendiedrichsen commented 4 years ago

I'll keep it Java 8 compatible.

AlexBroadbent commented 4 years ago

@svendiedrichsen Is there any movement on this? I get the same error now while running 0.5.10 on JDK 12.

svendiedrichsen commented 4 years ago

@AlexBroadbent No, no progress so far. I haven't found time to do it.

keyroii commented 1 year ago

Adding "back"

<dependency>
  <groupId>com.sun.xml.bind</groupId>
  <artifactId>jaxb-impl</artifactId>
  <version>2.2.3-1</version>
</dependency>

Seems to have fixed it for me