Fork me on GitHub
#graalvm
<
2023-10-14
>
Avelino16:10:01

does anyone know what this error could be?

Fatal error: com.oracle.graal.pointsto.util.AnalysisError$ParsingError: Error encountered while parsing org.apache.poi.poifs.crypt.agile.AgileEncryptor.confirmPassword(java.lang.String) 
Parsing context:
   at org.apache.poi.poifs.crypt.agile.AgileEncryptor.confirmPassword(AgileEncryptor.java:84)
https://github.com/moclojer/moclojer/actions/runs/6518574989/job/17704234885?pr=153#step:6:147

Bob B17:10:06

I'm guessing probably the cause listed on line 216 is more informative

borkdude17:10:35

Indeed:

Detected an instance of Random/SplittableRandom class in the image heap.
is the real thing you should solve

Avelino15:10:02

I understand why, but I can't solve the problem I've set the parameters in native-image: • --enable-all-security-services which will be depreciated • "--initialize-at-run-time=java.security.SecureRandom" https://github.com/moclojer/moclojer/actions/runs/6524999120/job/17717217017?pr=153#step:7:179 full backtrace

Error: Classes that should be initialized at run time got initialized during image building:
 java.security.SecureRandom the class was requested to be initialized at run time (from command line with 'java.security.SecureRandom'). com.sun.jndi.dns.DnsClient caused initialization of this class with the following trace: 
	at java.security.SecureRandom.<clinit>(SecureRandom.java:158)
	at sun.security.jca.JCAUtil$CachedSecureRandomHolder.<clinit>(JCAUtil.java:65)
	at sun.security.jca.JCAUtil.getSecureRandom(JCAUtil.java:77)
	at com.sun.jndi.dns.DnsClient.<clinit>(DnsClient.java:86)
> sorry for being a noob on the subject, but I'm not finding any content on Google that can help me

borkdude15:10:39

You should still not use —initialize-at-runtime without arguments. This is deprecated. Look at the library I linked to earlier and use that one

Avelino15:10:00

I tried to use it, but I had to release library by library manually - it wasn't automatically reading everything I used in the project > I'll try again

Chicão18:10:43

so, we added this,

--allow-incomplete-classpath
--features=clj_easy.graal_build_time.InitClojureClasses
--enable-all-security-services
--initialize-at-run-time=java.security.SecureRandom
--initialize-at-run-time=org.apache.poi.util.RandomSingleton
--initialize-at-run-time=com.fasterxml.jackson.core.io.SerializedString
--initialize-at-run-time=sun.security.ssl.SSLContextImpl
--trace-object-instantiation=org.yaml.snakeyaml.DumperOptions$ScalarStyle
--trace-object-instantiation=org.yaml.snakeyaml.DumperOptions$FlowStyle
--initialize-at-build-time=org.yaml.snakeyaml.DumperOptions$FlowStyle
--initialize-at-build-time=org.yaml.snakeyaml.DumperOptions$ScalarStyle
But we had to add initialize-at-run-time= with args for some method/functions and the stacktrace keep asking more.. do you have any idea what we are doing wrong?

borkdude19:10:38

@UL618PRQ9 It's very likely that a top level expression in your clojure code initializes an object that triggers the initialization of the SecureRandom object

borkdude19:10:45

use delay to work around that

borkdude19:10:58

you can find where this happens by just following native-image's hints

Avelino19:10:23

Warning: Using a deprecated option --delay-class-initialization-to-runtime from command line. Use --initialize-at-run-time.

borkdude19:10:36

You need to follow back the chain of initialization using these warnings:

com.sun.jndi.dns.DnsClient caused initialization of this class with the following trace
Then add --trace-object-instantiation=com.sun.jndi.dns.DnsClient until you find another warning like that and then repeat

borkdude19:10:44

that's not necessarily all bad, but you have to figure out what causes the init of com.sun.jndi.dns.DnsClient

borkdude19:10:52

So add --trace-object-instantiation=com.sun.jndi.dns.DnsClient and --trace-class-instantiation=com.sun.jndi.dns.DnsClient

Avelino00:10:18

I managed to get the build to "pass", but I'm doing something wrong - I don't think this is the normal process having to put each library in the runtime init? native-image is asking for it

--initialize-at-run-time=moclojer.core
--initialize-at-run-time=moclojer.config__init
--initialize-at-run-time=cognitect.transit__init
--initialize-at-run-time=clojure.core.async.impl.concurrent__init
--initialize-at-run-time=clojure.core.async.impl.buffers__init
--initialize-at-run-time=babashka.cli__init
--initialize-at-run-time=io.pedestal.http.body_params__init
--initialize-at-run-time=moclojer.core__init
--initialize-at-run-time=clojure.core.async.impl.exec.threadpool__init
--initialize-at-run-time=clojure.core.async.impl.dispatch__init
--initialize-at-run-time=clojure.core.async.impl.concurrent__init
--initialize-at-run-time=moclojer.server__init
--initialize-at-run-time=clojure.core.async.impl.channels__init
--initialize-at-run-time=moclojer.router__init
--initialize-at-run-time=clojure.core.async__init
--initialize-at-run-time=clojure.core.async.impl.timers__init
--initialize-at-run-time=io.pedestal.http__init
--initialize-at-run-time=clojure.core.async.impl.ioc_macros__init
--initialize-at-run-time=moclojer.specs.moclojer__init
--initialize-at-run-time=io.pedestal.http.cors__init
--initialize-at-run-time=io.pedestal.http.impl.servlet_interceptor__init
--initialize-at-run-time=io.pedestal.http.jetty.container__init
--initialize-at-run-time=io.pedestal.http.jetty__init
--initialize-at-run-time=moclojer.watcher__init
--initialize-at-run-time=io.pedestal.http.route__init
--initialize-at-run-time=io.pedestal.interceptor.chain__init
--initialize-at-run-time=clojure.reflect.java__init
--initialize-at-run-time=clojure.datafy__init
--initialize-at-run-time=clojure.data.json__init
--initialize-at-run-time=clojure.core.cache__init
--initialize-at-run-time=clojure.tools.analyzer.jvm.utils__init
--initialize-at-run-time=clojure.reflect__init
--initialize-at-run-time=clojure.core.memoize__init
--initialize-at-run-time=clojure.tools.analyzer.jvm__init
--initialize-at-run-time=clojure.tools.analyzer.passes.jvm.analyze_host_expr__init
--initialize-at-run-time=clojure.tools.analyzer.passes.jvm.annotate_host_info__init
--initialize-at-run-time=clojure.tools.analyzer.passes.jvm.annotate_tag__init
--initialize-at-run-time=clojure.tools.analyzer.passes.jvm.box__init
--initialize-at-run-time=clojure.tools.analyzer.passes.jvm.classify_invoke__init
--initialize-at-run-time=clojure.tools.analyzer.passes.jvm.constant_lifter__init
--initialize-at-run-time=clojure.tools.analyzer.passes.jvm.infer_tag__init
--initialize-at-run-time=clojure.tools.analyzer.passes.jvm.validate__init
--initialize-at-run-time=clojure.tools.analyzer.passes.jvm.validate_loop_locals__init
--initialize-at-run-time=clojure.tools.analyzer.passes.jvm.warn_on_reflection__init
--initialize-at-run-time=io.pedestal.http.request.servlet_support__init
--initialize-at-run-time=clojure.pprint.dispatch__init
--initialize-at-run-time=clojure.stacktrace__init
--initialize-at-run-time=moclojer.io_utils__init
--initialize-at-run-time=flatland.ordered.map__init


--trace-class-initialization=clojure.core.async.impl.exec.threadpool__init
--trace-class-initialization=moclojer.config__init,clojure.core.async.impl.concurrent__init,babashka.cli__init
--trace-class-initialization=cognitect.transit__init
--trace-class-initialization=io.pedestal.http.body_params__init,clojure.core.async.impl.dispatch__init,clojure.core.async.impl.buffers__init,cognitect.transit__init
--trace-class-initialization=clojure.core.async.impl.channels__init
--trace-class-initialization=clojure.core.async.impl.timers__init
--trace-class-initialization=clojure.core.async__init
--trace-class-initialization=clojure.core.async.impl.ioc_macros__init
--trace-class-initialization=io.pedestal.http.jetty.container__init
--trace-class-initialization=clojure.tools.analyzer.jvm.utils__init,clojure.core.cache__init,clojure.datafy__init,clojure.reflect.java__init
--trace-class-initialization=clojure.reflect__init,clojure.core.memoize__init
--trace-class-initialization=clojure.tools.analyzer.passes.jvm.analyze_host_expr__init
--trace-class-initialization=clojure.tools.analyzer.passes.jvm.annotate_host_info__init
--trace-class-initialization=clojure.tools.analyzer.passes.jvm.annotate_tag__init
--trace-class-initialization=clojure.tools.analyzer.passes.jvm.box__init
--trace-class-initialization=clojure.tools.analyzer.passes.jvm.classify_invoke__init
--trace-class-initialization=clojure.tools.analyzer.passes.jvm.constant_lifter__init
--trace-class-initialization=clojure.tools.analyzer.passes.jvm.infer_tag__init
--trace-class-initialization=clojure.tools.analyzer.passes.jvm.validate__init
--trace-class-initialization=clojure.tools.analyzer.passes.jvm.validate_loop_locals__init
--trace-class-initialization=clojure.tools.analyzer.passes.jvm.warn_on_reflection__init
--trace-class-initialization=clojure.stacktrace__init
--trace-class-initialization=clojure.pprint.dispatch__init
--trace-class-initialization=flatland.ordered.map__init

borkdude07:10:18

This will build but won't work. Have you tried my previous suggestion?