orika: Problems with Java 17

So I tried my code with Java 17 and I get this exception:

Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected native java.lang.Object java.lang.Object.clone() throws java.lang.CloneNotSupportedException accessible: module java.base does not "opens java.lang" to unnamed module @46d21ee0
	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
	at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199)
	at java.base/java.lang.reflect.Method.setAccessible(Method.java:193)
	at ma.glasnost.orika.converter.builtin.CloneableConverter.<init>(CloneableConverter.java:64)
	at ma.glasnost.orika.converter.builtin.CloneableConverter$Builtin.<init>(CloneableConverter.java:221)
	at ma.glasnost.orika.converter.builtin.BuiltinConverters.register(BuiltinConverters.java:135)
	at ma.glasnost.orika.impl.DefaultMapperFactory.build(DefaultMapperFactory.java:1278)
	at io.nemesis.platform.core.mapper.MixinAwareMapperFactory.build(MixinAwareMapperFactory.java:160)
	at ma.glasnost.orika.impl.DefaultMapperFactory.getMapperFacade(DefaultMapperFactory.java:881)

About this issue

  • Original URL
  • State: open
  • Created 3 years ago
  • Reactions: 31
  • Comments: 20

Most upvoted comments

Encountered the same issue, as a workaround you can set the following VM option

–add-opens java.base/java.lang=ALL-UNNAMED

Hi, any news here? People are still waiting for this.

Any plans on releasing 1.6.0? We use this library extensively and although the workaround is fine its not ideal.

Hi Team, Any update on new version of orika core which is compatible with JDK17. I am facing same issue.

@elaatifi should we consider this project dead?

Unfortunately, no. I have been following Orika Mapper since the start of 2022. There are no updates rolling out. For the time being, as a workaround we used the following flag as VM Option –add-opens java.base/java.lang=ALL-UNNAMED But we conducted a research and found Mapstruct to be the closest best alternative to Orika. I would suggest everyone to consider migrating to another Mapper.

Seems that this will be fixed in the 1.6.0 version. I’m waiting for that to release.

For those using the Gradle JIB-Plugin, solved it as follows:

container {
	jvmFlags = ['--add-opens=java.base/java.lang=ALL-UNNAMED', '-XX:+UseContainerSupport', '-XX:MaxRAMPercentage=75.0']

Hello

We are using a workaround since last year in order to migrate on jdk17 without --add-opens, this allow the depreciation of Orika without rushing because of jdk17, off course “use it with caution”

The workaround is :

  • switch from the default JavassistCompilerStrategy to EclipseJdtCompilerStrategy
  • disable the default builtin converters
  • add only jdk17 ready converters, and rewrite if not compatible

snippets :

        <dependency>
            <groupId>ma.glasnost.orika</groupId>
            <artifactId>orika-eclipse-tools</artifactId>
            <version>1.5.4</version>
        </dependency>
@Deprecated(forRemoval = true)
public class BidouilleOrikaMapperFactory {

    public static MapperFactory defaultMapperFactory() {
        return new DefaultMapperFactory.Builder()
                .useBuiltinConverters(false)
                .converterFactory(new BidouilleOrikaConverterFactory())
                .compilerStrategy(new BidouilleOrikaCompilerStrategy())
                .build();
    }
}
@Deprecated(forRemoval = true)
public class BidouilleOrikaCompilerStrategy extends EclipseJdtCompilerStrategy {

    @Override
    protected void writeSourceFile(String sourceText, String packageName, String className) throws IOException {

    }
}

see https://github.com/orika-mapper/orika/blob/master/core/src/main/java/ma/glasnost/orika/converter/builtin/BuiltinConverters.java#L77 do not use makeSimpleConverter and rewrite them without reflection if needed (Date is on of them) .

@Deprecated(forRemoval = true)
public class BidouilleOrikaConverterFactory extends DefaultConverterFactory {
    public BidouilleOrikaConverterFactory() {
        super();
        this.registerConverter(new CopyByReferenceConverter());

        this.registerConverter(new EnumConverter());

        /*
         * Register to/from string converters
         */
        this.registerConverter(new FromStringConverter());
        this.registerConverter(new ToStringConverter());

        /*
         * Register common date/time converters
         */
        this.registerConverter(new DateAndTimeConverters.DateToXmlGregorianCalendarConverter());
        this.registerConverter(new DateAndTimeConverters.DateToTimeConverter());
        this.registerConverter(new DateAndTimeConverters.CalendarToXmlGregorianCalendarConverter());
        this.registerConverter(new DateAndTimeConverters.XmlGregorianCalendarToTimestampConverter());
        this.registerConverter(new DateAndTimeConverters.XmlGregorianCalendarToSqlDateConverter());
        this.registerConverter(new DateAndTimeConverters.XmlGregorianCalendarToTimeConverter());
        this.registerConverter(new DateAndTimeConverters.LongToXmlGregorianCalendarConverter());

        this.registerConverter(new DateAndTimeConverters.DateToCalendarConverter());
        this.registerConverter(new DateAndTimeConverters.CalendarToTimeConverter());
        this.registerConverter(new DateAndTimeConverters.CalendarToSqlDateConverter());
        this.registerConverter(new DateAndTimeConverters.LongToCalendarConverter());
        this.registerConverter(new DateAndTimeConverters.TimestampToCalendarConverter());

        this.registerConverter(new DateAndTimeConverters.DateToSqlDateConverter());
        this.registerConverter(new DateAndTimeConverters.LongToSqlDateConverter());
        this.registerConverter(new DateAndTimeConverters.TimeToSqlDateConverter());
        this.registerConverter(new DateAndTimeConverters.TimestampToSqlDateConverter());

        this.registerConverter(new DateAndTimeConverters.LongToTimeConverter());
        this.registerConverter(new DateAndTimeConverters.TimestampToTimeConverter());

        this.registerConverter(new DateAndTimeConverters.LongToTimestampConverter());
        this.registerConverter(new DateAndTimeConverters.DateToTimestampConverter());

        this.registerConverter(new DateAndTimeConverters.LongToDateConverter());

        /*
         * Register numeric type converter
         */
        this.registerConverter(new NumericConverters.BigDecimalToDoubleConverter());
        this.registerConverter(new NumericConverters.BigDecimalToFloatConverter());
        this.registerConverter(new NumericConverters.BigIntegerToIntegerConverter(false));
        this.registerConverter(new NumericConverters.BigIntegerToLongConverter(false));

        this.registerConverter(new NumericConverters.IntegerToShortConverter(false));
        this.registerConverter(new NumericConverters.LongToIntegerConverter(false));
        this.registerConverter(new NumericConverters.LongToShortConverter(false));

        this.registerConverter(new NumericConverters.FloatToShortConverter(false));
        this.registerConverter(new NumericConverters.FloatToIntegerConverter(false));
        this.registerConverter(new NumericConverters.FloatToLongConverter(false));

        this.registerConverter(new NumericConverters.DoubleToShortConverter(false));
        this.registerConverter(new NumericConverters.DoubleToIntegerConverter(false));
        this.registerConverter(new NumericConverters.DoubleToLongConverter(false));
        /*
         * Register converter to instantiate by using a constructor on the
         * destination which takes the source as argument
         */
        this.registerConverter(new ConstructorConverter());
    }
}

okay, seems to be dead. one year later, the 1.6.0 is not yet released. I’ll go for another mapper-option. schade.

遇到同样的问题,作为一种解决方法,您可以设置以下 VM 选项

–add-opens java.base/java.lang=ALL-UNNAMED

after set this ,not good

+1 saw this with eclipse adoptium 17.0.1.12-hotspot. Reverted to openjdk11 and all was fine.