I have an executable jar, it was compiled with java 6 and in this project datanucleus is used as ORM (an old version, 1.1.6).
The jar runs fine with java 6, 7, 8 but not with 9 (10): running it I get a lot or errors like this one on various classes:
javax.jdo.JDOFatalUserException: A property named javax.jdo.PersistenceManagerFactoryClass must be specified, or a jar file with a META-INF/services/javax.jdo.PersistenceManagerFactory entry must be in the classpath, or a property named javax.jdo.option.PersistenceUnitName must be specified.
at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:856) ~[jdo2-api-2.3-eb.jar:na]
at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:698) ~[jdo2-api-2.3-eb.jar:na]
at app.services.DatabaseService.inizializza(DatabaseService.java:193) ~[MyJar.jar:na]
at app.startup.DatabaseLoader.load(DatabaseLoader.java:49) ~[MyJar.jar:na]
at app.startup.Startup.inizializzaDatabasePrincipale(Startup.java:148) [MyJar.jar:na]
at app.startup.Startup.start(Startup.java:47) [MyJar.jar:na]
at app.Test.main(Test.java:81) [MyJar.jar:na]
Caused by: javax.jdo.JDOException: Exception during population of metadata for MyClass1
at org.datanucleus.jdo.JDOPersistenceManagerFactory.initialiseProperties(JDOPersistenceManagerFactory.java:429) ~[datanucleus-core-1.1.6.jar:na]
at org.datanucleus.jdo.JDOPersistenceManagerFactory.<init>(JDOPersistenceManagerFactory.java:260) ~[datanucleus-core-1.1.6.jar:na]
at org.datanucleus.jdo.JDOPersistenceManagerFactory.getPersistenceManagerFactory(JDOPersistenceManagerFactory.java:173) ~[datanucleus-core-1.1.6.jar:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Unknown Source) ~[na:na]
at javax.jdo.JDOHelper$16.run(JDOHelper.java:1956) ~[jdo2-api-2.3-eb.jar:na]
at java.base/java.security.AccessController.doPrivileged(Native Method) ~[na:na]
at javax.jdo.JDOHelper.invoke(JDOHelper.java:1951) ~[jdo2-api-2.3-eb.jar:na]
at javax.jdo.JDOHelper.invokeGetPersistenceManagerFactoryOnImplementation(JDOHelper.java:1159) ~[jdo2-api-2.3-eb.jar:na]
at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:839) ~[jdo2-api-2.3-eb.jar:na]
... 6 common frames omitted
Caused by: org.datanucleus.exceptions.NucleusUserException: Exception during population of metadata for app.dati.MyClass1
at org.datanucleus.metadata.MetaDataManager$1.run(MetaDataManager.java:2331) ~[datanucleus-core-1.1.6.jar:na]
at java.base/java.security.AccessController.doPrivileged(Native Method) ~[na:na]
at org.datanucleus.metadata.MetaDataManager.populateAbstractClassMetaData(MetaDataManager.java:2316) ~[datanucleus-core-1.1.6.jar:na]
at org.datanucleus.metadata.MetaDataManager.populateFileMetaData(MetaDataManager.java:2153) ~[datanucleus-core-1.1.6.jar:na]
at org.datanucleus.metadata.MetaDataManager.initialiseFileMetaDataForUse(MetaDataManager.java:864) ~[datanucleus-core-1.1.6.jar:na]
at org.datanucleus.metadata.MetaDataManager.loadPersistenceUnit(MetaDataManager.java:794) ~[datanucleus-core-1.1.6.jar:na]
at org.datanucleus.jdo.JDOPersistenceManagerFactory.initialiseProperties(JDOPersistenceManagerFactory.java:425) ~[datanucleus-core-1.1.6.jar:na]
... 17 common frames omitted
Caused by: java.lang.NullPointerException: null
at java.base/java.util.Arrays.binarySearch(Unknown Source) ~[na:na]
at org.datanucleus.store.types.TypeManager.isDefaultEmbeddedType(TypeManager.java:225) ~[datanucleus-core-1.1.6.jar:na]
at org.datanucleus.metadata.AbstractMemberMetaData.populate(AbstractMemberMetaData.java:477) ~[datanucleus-core-1.1.6.jar:na]
at org.datanucleus.metadata.ClassMetaData.populateMemberMetaData(ClassMetaData.java:543) ~[datanucleus-core-1.1.6.jar:na]
at org.datanucleus.metadata.ClassMetaData.populate(ClassMetaData.java:206) ~[datanucleus-core-1.1.6.jar:na]
at org.datanucleus.metadata.MetaDataManager$1.run(MetaDataManager.java:2322) ~[datanucleus-core-1.1.6.jar:na]
... 23 common frames omitted
javax.jdo.JDOFatalUserException: A property named javax.jdo.PersistenceManagerFactoryClass must be specified, or a jar file with a META-INF/services/javax.jdo.PersistenceManagerFactory entry must be in the classpath, or a property named javax.jdo.option.PersistenceUnitName must be specified.
at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:856)
at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:698)
at app.services.DatabaseService.inizializza(DatabaseService.java:193)
at app.startup.DatabaseLoader.load(DatabaseLoader.java:49)
at app.startup.Startup.inizializzaDatabasePrincipale(Startup.java:148)
at app.startup.Startup.start(Startup.java:47)
at app.Test.main(Test.java:81)
NestedThrowablesStackTrace:
javax.jdo.JDOException: Exception during population of metadata for app.dati.MyClass1
at org.datanucleus.jdo.JDOPersistenceManagerFactory.initialiseProperties(JDOPersistenceManagerFactory.java:429)
at org.datanucleus.jdo.JDOPersistenceManagerFactory.<init>(JDOPersistenceManagerFactory.java:260)
at org.datanucleus.jdo.JDOPersistenceManagerFactory.getPersistenceManagerFactory(JDOPersistenceManagerFactory.java:173)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at javax.jdo.JDOHelper$16.run(JDOHelper.java:1956)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javax.jdo.JDOHelper.invoke(JDOHelper.java:1951)
at javax.jdo.JDOHelper.invokeGetPersistenceManagerFactoryOnImplementation(JDOHelper.java:1159)
at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:839)
at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:698)
at app.services.DatabaseService.inizializza(DatabaseService.java:193)
at app.startup.DatabaseLoader.load(DatabaseLoader.java:49)
at app.startup.Startup.inizializzaDatabasePrincipale(Startup.java:148)
at app.startup.Startup.start(Startup.java:47)
at app.Test.main(Test.java:81)
NestedThrowablesStackTrace:
Exception during population of metadata for app.dati.MyClass1
org.datanucleus.exceptions.NucleusUserException: Exception during population of metadata for app.dati.MyClass1
at org.datanucleus.metadata.MetaDataManager$1.run(MetaDataManager.java:2331)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at org.datanucleus.metadata.MetaDataManager.populateAbstractClassMetaData(MetaDataManager.java:2316)
at org.datanucleus.metadata.MetaDataManager.populateFileMetaData(MetaDataManager.java:2153)
at org.datanucleus.metadata.MetaDataManager.initialiseFileMetaDataForUse(MetaDataManager.java:864)
at org.datanucleus.metadata.MetaDataManager.loadPersistenceUnit(MetaDataManager.java:794)
at org.datanucleus.jdo.JDOPersistenceManagerFactory.initialiseProperties(JDOPersistenceManagerFactory.java:425)
at org.datanucleus.jdo.JDOPersistenceManagerFactory.<init>(JDOPersistenceManagerFactory.java:260)
at org.datanucleus.jdo.JDOPersistenceManagerFactory.getPersistenceManagerFactory(JDOPersistenceManagerFactory.java:173)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at javax.jdo.JDOHelper$16.run(JDOHelper.java:1956)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javax.jdo.JDOHelper.invoke(JDOHelper.java:1951)
at javax.jdo.JDOHelper.invokeGetPersistenceManagerFactoryOnImplementation(JDOHelper.java:1159)
at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:839)
at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:698)
at app.services.DatabaseService.inizializza(DatabaseService.java:193)
at app.startup.DatabaseLoader.load(DatabaseLoader.java:49)
at app.startup.Startup.inizializzaDatabasePrincipale(Startup.java:148)
at app.startup.Startup.start(Startup.java:47)
at app.Test.main(Test.java:81)
Caused by: java.lang.NullPointerException
at java.base/java.util.Arrays.binarySearch(Unknown Source)
at org.datanucleus.store.types.TypeManager.isDefaultEmbeddedType(TypeManager.java:225)
at org.datanucleus.metadata.AbstractMemberMetaData.populate(AbstractMemberMetaData.java:477)
at org.datanucleus.metadata.ClassMetaData.populateMemberMetaData(ClassMetaData.java:543)
at org.datanucleus.metadata.ClassMetaData.populate(ClassMetaData.java:206)
at org.datanucleus.metadata.MetaDataManager$1.run(MetaDataManager.java:2322)
... 23 more
Nested Throwables StackTrace:
java.lang.NullPointerException
at java.base/java.util.Arrays.binarySearch(Unknown Source)
at org.datanucleus.store.types.TypeManager.isDefaultEmbeddedType(TypeManager.java:225)
at org.datanucleus.metadata.AbstractMemberMetaData.populate(AbstractMemberMetaData.java:477)
at org.datanucleus.metadata.ClassMetaData.populateMemberMetaData(ClassMetaData.java:543)
at org.datanucleus.metadata.ClassMetaData.populate(ClassMetaData.java:206)
at org.datanucleus.metadata.MetaDataManager$1.run(MetaDataManager.java:2322)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at org.datanucleus.metadata.MetaDataManager.populateAbstractClassMetaData(MetaDataManager.java:2316)
at org.datanucleus.metadata.MetaDataManager.populateFileMetaData(MetaDataManager.java:2153)
at org.datanucleus.metadata.MetaDataManager.initialiseFileMetaDataForUse(MetaDataManager.java:864)
at org.datanucleus.metadata.MetaDataManager.loadPersistenceUnit(MetaDataManager.java:794)
at org.datanucleus.jdo.JDOPersistenceManagerFactory.initialiseProperties(JDOPersistenceManagerFactory.java:425)
at org.datanucleus.jdo.JDOPersistenceManagerFactory.<init>(JDOPersistenceManagerFactory.java:260)
at org.datanucleus.jdo.JDOPersistenceManagerFactory.getPersistenceManagerFactory(JDOPersistenceManagerFactory.java:173)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at javax.jdo.JDOHelper$16.run(JDOHelper.java:1956)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javax.jdo.JDOHelper.invoke(JDOHelper.java:1951)
at javax.jdo.JDOHelper.invokeGetPersistenceManagerFactoryOnImplementation(JDOHelper.java:1159)
at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:839)
at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:698)
at app.services.DatabaseService.inizializza(DatabaseService.java:193)
at app.startup.DatabaseLoader.load(DatabaseLoader.java:49)
at app.startup.Startup.inizializzaDatabasePrincipale(Startup.java:148)
at app.startup.Startup.start(Startup.java:47)
at app.Test.main(Test.java:81)
MyClass
and all the classes where I get the error are classes that were enhanced via datanucleus enhancer.
Reading something around I tried this:
java --illegal-access=permit --add-opens java.base/java.lang=ALL-UNNAMED -jar MyJar.jar
but same result.
I am just interested to run this executable jar with java 9 not to recompile the code with java 9.
I know it's a difficult from just an error message to give an answer but someone have some hint?
The code is old, the libraries used are old too but it runs fine on java 8, it's something that changed on java 9 that cause the problem.
UPDATE: updated with the full stacktrace as requested