You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@cayenne.apache.org by Andrew Lindesay <ap...@lindesay.co.nz> on 2023/04/05 08:26:04 UTC

Graal (Native Image) with Cayenne

Hello;

Has anybody here experimented with running an application using Cayenne with the GraalVM "native image" compiler?  The resultant executable seems to be having a problem with the DI system at run time; probably because there's some reflection going on in there -- seems likely.  Is there any documentation / guidance about how to start the `ServerRuntime` without the DI mechanism?

Caused by: org.apache.cayenne.di.DIRuntimeException: No applicable constructor is found for constructor injection in class 'org.apache.cayenne.log.Slf4jJdbcEventLogger'
	at org.apache.cayenne.di.spi.ConstructorInjectingProvider.initConstructor(ConstructorInjectingProvider.java:103) ~[na:na]
	at org.apache.cayenne.di.spi.ConstructorInjectingProvider.<init>(ConstructorInjectingProvider.java:42) ~[na:na]
	at org.apache.cayenne.di.spi.DefaultBindingBuilder.to(DefaultBindingBuilder.java:44) ~[na:na]
	at org.apache.cayenne.configuration.server.ServerModule.configure(ServerModule.java:349) ~[na:na]
	at org.apache.cayenne.di.spi.DefaultInjector.<init>(DefaultInjector.java:68) ~[na:na]
	at org.apache.cayenne.di.DIBootstrap.createInjector(DIBootstrap.java:38) ~[na:na]
	at org.apache.cayenne.di.DIBootstrap.createInjector(DIBootstrap.java:46) ~[na:na]
	at org.apache.cayenne.configuration.CayenneRuntime.<init>(CayenneRuntime.java:79) ~[haikudepotserver-webapp:4.1.1]
	at org.apache.cayenne.configuration.server.ServerRuntime.<init>(ServerRuntime.java:75) ~[haikudepotserver-webapp:4.1.1]
	at org.apache.cayenne.configuration.server.ServerRuntimeBuilder.build(ServerRuntimeBuilder.java:207) ~[na:na]

Regards.

-- 
Andrew Lindesay

Re: Graal (Native Image) with Cayenne

Posted by Andrew Lindesay <ap...@lindesay.co.nz>.
Hello Andrus;

The problem is that any class which is involved in the DI process where it might be the `implementation` in `ConstructorInjectingProvider` at...

        Constructor<?>[] constructors = implementation.getDeclaredConstructors();

...appears as if it is going to have to appear in the JSON list.  This effectively means declaring the classes involved in the DI ahead of time.  This is not really ideal. I guess those DI classes could be annotation-marked in the Cayenne project somehow and collected at build time and incorporated into the `.jar` build product for Graal to pickup? :-/

Regards.

-- 
Andrew Lindesay

On Thu, 6 Apr 2023, at 01:06, Andrus Adamchik wrote:
> Yeah, would be great if you could share the JSON, but also outline the 
> overall approach. And if this JOSN file is required for the process, 
> we'd need a way to test and maintain it going forward.

Re: Graal (Native Image) with Cayenne

Posted by Andrus Adamchik <aa...@gmail.com>.
Yeah, would be great if you could share the JSON, but also outline the overall approach. And if this JOSN file is required for the process, we'd need a way to test and maintain it going forward.

Andrus


> On Apr 5, 2023, at 1:58 PM, Andrew Lindesay <ap...@lindesay.co.nz> wrote:
> 
> Hi Andrus;
> 
> Thanks for coming back to me.  It seems that for my situation, I need to let the build tool know that each of the "injectable" classes should be allowed to be scanned for constructors in the build product by supplying the Graal build-tool with;
> 
> ```
> -H:ReflectionConfigurationFiles=/...path.../reflection.json
> ```
> 
> The snipped `reflection.json` file looks like;
> 
> ```
> [
>  {
>    "name": "org.apache.cayenne.access.DataDomain",
>    "queryAllDeclaredConstructors": true
>  },
>  {
>    "name": "org.apache.cayenne.access.dbsync.DefaultSchemaUpdateStrategyFactory",
>    "queryAllDeclaredConstructors": true
>  },
>  ....... continued ....
> ]
> ```
> 
> There are entries for 117 classes.  It seems this file can be supplied with the library jar in some way in order to instruct the Graal build tool.  Maybe once I have this fully working I can add a PR for it to cover the known classes in the jar(s).
> 
> Regards.
> 
> -- 
> Andrew Lindesay
> 
> On Wed, 5 Apr 2023, at 20:31, Andrus Adamchik wrote:
>> Hi Andrew,
>> 
>> I don't have first-hand experience, but Cayenne was reported to work 
>> with GraalVM. E.g.: 
>> https://lists.apache.org/list?user@cayenne.apache.org:2023-1:graalvm
>> 
>> Andrus
>> 
>> 
>>> On Apr 5, 2023, at 10:26 AM, Andrew Lindesay <ap...@lindesay.co.nz> wrote:
>>> 
>>> Hello;
>>> 
>>> Has anybody here experimented with running an application using Cayenne with the GraalVM "native image" compiler?  The resultant executable seems to be having a problem with the DI system at run time; probably because there's some reflection going on in there -- seems likely.  Is there any documentation / guidance about how to start the `ServerRuntime` without the DI mechanism?
>>> 
>>> Caused by: org.apache.cayenne.di.DIRuntimeException: No applicable constructor is found for constructor injection in class 'org.apache.cayenne.log.Slf4jJdbcEventLogger'
>>> 	at org.apache.cayenne.di.spi.ConstructorInjectingProvider.initConstructor(ConstructorInjectingProvider.java:103) ~[na:na]
>>> 	at org.apache.cayenne.di.spi.ConstructorInjectingProvider.<init>(ConstructorInjectingProvider.java:42) ~[na:na]
>>> 	at org.apache.cayenne.di.spi.DefaultBindingBuilder.to(DefaultBindingBuilder.java:44) ~[na:na]
>>> 	at org.apache.cayenne.configuration.server.ServerModule.configure(ServerModule.java:349) ~[na:na]
>>> 	at org.apache.cayenne.di.spi.DefaultInjector.<init>(DefaultInjector.java:68) ~[na:na]
>>> 	at org.apache.cayenne.di.DIBootstrap.createInjector(DIBootstrap.java:38) ~[na:na]
>>> 	at org.apache.cayenne.di.DIBootstrap.createInjector(DIBootstrap.java:46) ~[na:na]
>>> 	at org.apache.cayenne.configuration.CayenneRuntime.<init>(CayenneRuntime.java:79) ~[haikudepotserver-webapp:4.1.1]
>>> 	at org.apache.cayenne.configuration.server.ServerRuntime.<init>(ServerRuntime.java:75) ~[haikudepotserver-webapp:4.1.1]
>>> 	at org.apache.cayenne.configuration.server.ServerRuntimeBuilder.build(ServerRuntimeBuilder.java:207) ~[na:na]
>>> 
>>> Regards.
>>> 
>>> -- 
>>> Andrew Lindesay


Re: Graal (Native Image) with Cayenne

Posted by Andrew Lindesay <ap...@lindesay.co.nz>.
Hi Andrus;

Thanks for coming back to me.  It seems that for my situation, I need to let the build tool know that each of the "injectable" classes should be allowed to be scanned for constructors in the build product by supplying the Graal build-tool with;

```
-H:ReflectionConfigurationFiles=/...path.../reflection.json
```

The snipped `reflection.json` file looks like;

```
[
  {
    "name": "org.apache.cayenne.access.DataDomain",
    "queryAllDeclaredConstructors": true
  },
  {
    "name": "org.apache.cayenne.access.dbsync.DefaultSchemaUpdateStrategyFactory",
    "queryAllDeclaredConstructors": true
  },
  ....... continued ....
]
```

There are entries for 117 classes.  It seems this file can be supplied with the library jar in some way in order to instruct the Graal build tool.  Maybe once I have this fully working I can add a PR for it to cover the known classes in the jar(s).

Regards.

-- 
Andrew Lindesay

On Wed, 5 Apr 2023, at 20:31, Andrus Adamchik wrote:
> Hi Andrew,
>
> I don't have first-hand experience, but Cayenne was reported to work 
> with GraalVM. E.g.: 
> https://lists.apache.org/list?user@cayenne.apache.org:2023-1:graalvm
>
> Andrus
>
>
>> On Apr 5, 2023, at 10:26 AM, Andrew Lindesay <ap...@lindesay.co.nz> wrote:
>> 
>> Hello;
>> 
>> Has anybody here experimented with running an application using Cayenne with the GraalVM "native image" compiler?  The resultant executable seems to be having a problem with the DI system at run time; probably because there's some reflection going on in there -- seems likely.  Is there any documentation / guidance about how to start the `ServerRuntime` without the DI mechanism?
>> 
>> Caused by: org.apache.cayenne.di.DIRuntimeException: No applicable constructor is found for constructor injection in class 'org.apache.cayenne.log.Slf4jJdbcEventLogger'
>> 	at org.apache.cayenne.di.spi.ConstructorInjectingProvider.initConstructor(ConstructorInjectingProvider.java:103) ~[na:na]
>> 	at org.apache.cayenne.di.spi.ConstructorInjectingProvider.<init>(ConstructorInjectingProvider.java:42) ~[na:na]
>> 	at org.apache.cayenne.di.spi.DefaultBindingBuilder.to(DefaultBindingBuilder.java:44) ~[na:na]
>> 	at org.apache.cayenne.configuration.server.ServerModule.configure(ServerModule.java:349) ~[na:na]
>> 	at org.apache.cayenne.di.spi.DefaultInjector.<init>(DefaultInjector.java:68) ~[na:na]
>> 	at org.apache.cayenne.di.DIBootstrap.createInjector(DIBootstrap.java:38) ~[na:na]
>> 	at org.apache.cayenne.di.DIBootstrap.createInjector(DIBootstrap.java:46) ~[na:na]
>> 	at org.apache.cayenne.configuration.CayenneRuntime.<init>(CayenneRuntime.java:79) ~[haikudepotserver-webapp:4.1.1]
>> 	at org.apache.cayenne.configuration.server.ServerRuntime.<init>(ServerRuntime.java:75) ~[haikudepotserver-webapp:4.1.1]
>> 	at org.apache.cayenne.configuration.server.ServerRuntimeBuilder.build(ServerRuntimeBuilder.java:207) ~[na:na]
>> 
>> Regards.
>> 
>> -- 
>> Andrew Lindesay

Re: Graal (Native Image) with Cayenne

Posted by Andrus Adamchik <aa...@gmail.com>.
Hi Andrew,

I don't have first-hand experience, but Cayenne was reported to work with GraalVM. E.g.: https://lists.apache.org/list?user@cayenne.apache.org:2023-1:graalvm

Andrus


> On Apr 5, 2023, at 10:26 AM, Andrew Lindesay <ap...@lindesay.co.nz> wrote:
> 
> Hello;
> 
> Has anybody here experimented with running an application using Cayenne with the GraalVM "native image" compiler?  The resultant executable seems to be having a problem with the DI system at run time; probably because there's some reflection going on in there -- seems likely.  Is there any documentation / guidance about how to start the `ServerRuntime` without the DI mechanism?
> 
> Caused by: org.apache.cayenne.di.DIRuntimeException: No applicable constructor is found for constructor injection in class 'org.apache.cayenne.log.Slf4jJdbcEventLogger'
> 	at org.apache.cayenne.di.spi.ConstructorInjectingProvider.initConstructor(ConstructorInjectingProvider.java:103) ~[na:na]
> 	at org.apache.cayenne.di.spi.ConstructorInjectingProvider.<init>(ConstructorInjectingProvider.java:42) ~[na:na]
> 	at org.apache.cayenne.di.spi.DefaultBindingBuilder.to(DefaultBindingBuilder.java:44) ~[na:na]
> 	at org.apache.cayenne.configuration.server.ServerModule.configure(ServerModule.java:349) ~[na:na]
> 	at org.apache.cayenne.di.spi.DefaultInjector.<init>(DefaultInjector.java:68) ~[na:na]
> 	at org.apache.cayenne.di.DIBootstrap.createInjector(DIBootstrap.java:38) ~[na:na]
> 	at org.apache.cayenne.di.DIBootstrap.createInjector(DIBootstrap.java:46) ~[na:na]
> 	at org.apache.cayenne.configuration.CayenneRuntime.<init>(CayenneRuntime.java:79) ~[haikudepotserver-webapp:4.1.1]
> 	at org.apache.cayenne.configuration.server.ServerRuntime.<init>(ServerRuntime.java:75) ~[haikudepotserver-webapp:4.1.1]
> 	at org.apache.cayenne.configuration.server.ServerRuntimeBuilder.build(ServerRuntimeBuilder.java:207) ~[na:na]
> 
> Regards.
> 
> -- 
> Andrew Lindesay