graalvm

Avelino 2023-10-14T16:25:01.517799Z

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

borkdude 2023-10-16T07:55:18.061949Z

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

Avelino 2023-10-15T15:49:02.182759Z

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

borkdude 2023-10-15T15:51:39.140409Z

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

Avelino 2023-10-15T15:57:00.596599Z

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

chico 2023-10-15T18:54:43.062939Z

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?

borkdude 2023-10-15T19:01:38.912909Z

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

borkdude 2023-10-15T19:01:45.365989Z

use delay to work around that

borkdude 2023-10-15T19:01:58.911479Z

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

Avelino 2023-10-15T19:06:23.271739Z

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

borkdude 2023-10-15T19:11:36.146489Z

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

borkdude 2023-10-15T19:32:44.633209Z

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

borkdude 2023-10-15T19:33:52.127539Z

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

Avelino 2023-10-16T00:42:18.767229Z

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

Bob B 2023-10-14T17:05:06.216319Z

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

borkdude 2023-10-14T17:26:35.944499Z

Indeed:

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

borkdude 2023-10-14T17:27:09.695069Z

I recommend using https://github.com/clj-easy/graal-build-time