0

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

res1
  • 3,482
  • 5
  • 29
  • 50
  • 5
    Looks like the bytecode hackery done by your JDO implementation doesn't understand Java 9+ bytecode. You'll need to find an up to date version, or forget upgrading. – Boris the Spider Mar 25 '18 at 10:03
  • 3
    You have left out the important part of the stacktrace. – Stephen C Mar 25 '18 at 10:15
  • 1
    Current versions of DataNucleus (e.g v5.1) support java 8+ and include the latest version of ASM (which supports java 9 bytecode). You are using something utterly ancient there and not bytecode enhancing your classes using a recent version. e.g org.datanucleus.jdo.JDOPersistenceManagerFactory has not existed for years –  Mar 25 '18 at 10:43
  • As I said in my question I understand it's very old and for sure it uses deprecated libraries too. I was just trying to run it (not compile it) with java 9 because with java 8 it works. So why the bytecode manipulation during enhancement create no problems on java 8 ? why it's not backward compatible? Anyway If someone wanna answer that it's too old as project I will accept the answer. – res1 Mar 25 '18 at 17:56
  • 1
    Whether that error that you now post is down to bytecode, or simply down to the Java9 JRE implementing something differently I've no idea. You can easily enough get the code for your version of DataNucleus and debug around the method causing the issue. Current codebase has a method `TypeManagerImpl.isDefaultEmbeddedType` but it doesn't use `Arrays.binarySearch`. –  Mar 27 '18 at 08:40

0 Answers0