Closed aviflax closed 4 years ago
Hey @aviflax thanks for dropping by!
The unbalanced monitor issue is due to locking
macro. There's an open Clojure JIRA for this: https://dev.clojure.org/jira/browse/CLJ-1472 and there is a hacky workaround: https://github.com/taylorwood/clojurl/commit/12b96b5e9a722b372f153436b1f6827709d0f2ab
I should have some time soon to check out your project and see if I can get it building. Looks like maybe some stuff related to reflection?
I can't make Clojure Conj this year but hope to soon!
Wow thanks @taylorwood for the super-rapid and super-helpful response! That hacky workaround looks pretty good actually! I’m a little more intimidated by the situation with libsunec.dylib
that I learned of from the excellent Clojurl README — that looks dicey. 😅
Thank you!
Update:
I’ve implemented the hacky workaround from Clojurl to work around the issue with the locking
macro, and that seems to have worked — thanks!
Now I’m getting Error: Unsupported features in 7 methods
so that’s progress!
This is from https://github.com/FundingCircle/fc4-framework/commit/f76b856314d480cf68692f61a08e8934fee663c3 which is currently HEAD of native-image
.
Update:
I perused https://github.com/oracle/graal/issues/1074 and then added --initialize-at-run-time=org.httpkit.client
to my :main-opts
— this eliminated the two error messages related to javax.net.ssl.SSLContext
.
Now I’m getting Error: Unsupported features in 5 methods
so that’s more progress!
commit: https://github.com/FundingCircle/fc4-framework/commit/80248616bc5f4076c4f9dd351b202d7ce5219bb0
I was able to build your branch with Clojure 1.10.1 on the GraalVM 19.2.1 Docker image:
Compiling fc4.io.cli.main
Reflection warning, clj_chrome_devtools/automation.clj:61:5 - reference to field close on java.lang.Object can't be resolved.
Compiling fc4.files
Compiling fc4.image-utils
Compiling fc4.integrations.structurizr.express.chromium-renderer
Compiling fc4.integrations.structurizr.express.export
Compiling fc4.integrations.structurizr.express.format
Compiling fc4.integrations.structurizr.express.snap
Compiling fc4.integrations.structurizr.express.spec
Compiling fc4.integrations.structurizr.express.yaml
Compiling fc4.io.cli.main
Compiling fc4.io.cli.util
Compiling fc4.io.dsl
Compiling fc4.io.render
Compiling fc4.io.util
Compiling fc4.io.watch
Compiling fc4.io.yaml
Compiling fc4.model
Compiling fc4.rendering
Compiling fc4.spec
Compiling fc4.styles
Compiling fc4.util
Compiling fc4.view
Compiling fc4.yaml
Warning: Invalid classpath entry: /root/.m2/repository/net/incongru/watchservice/barbary-watchservice/1.0/jna-3.2.2.jar
Executing [
/opt/graalvm-ce-19.2.1/jre/bin/java \
-XX:+UnlockExperimentalVMOptions \
-XX:+EnableJVMCI \
-Dtruffle.TrustAllTruffleRuntimeProviders=true \
-Dtruffle.TruffleRuntime=com.oracle.truffle.api.impl.DefaultTruffleRuntime \
-Dgraalvm.ForcePolyglotInvalid=true \
-Dgraalvm.locatorDisabled=true \
-d64 \
-XX:-UseJVMCIClassLoader \
-XX:+UseJVMCINativeLibrary \
-Xss10m \
-Xms1g \
-Xmx4997247792 \
-Duser.country=US \
-Duser.language=en \
-Dorg.graalvm.version=19.2.1 \
-Dorg.graalvm.config=CE \
-Dcom.oracle.graalvm.isaot=true \
-Djvmci.class.path.append=/opt/graalvm-ce-19.2.1/jre/lib/jvmci/graal.jar \
-Xbootclasspath/a:/opt/graalvm-ce-19.2.1/jre/lib/boot/graal-sdk.jar:/opt/graalvm-ce-19.2.1/jre/lib/boot/graaljs-scriptengine.jar \
-cp \
/opt/graalvm-ce-19.2.1/jre/lib/svm/builder/llvm-platform-specific.jar:/opt/graalvm-ce-19.2.1/jre/lib/svm/builder/svm.jar:/opt/graalvm-ce-19.2.1/jre/lib/svm/builder/llvm-wrapper.jar:/opt/graalvm-ce-19.2.1/jre/lib/svm/builder/objectfile.jar:/opt/graalvm-ce-19.2.1/jre/lib/svm/builder/graal-llvm.jar:/opt/graalvm-ce-19.2.1/jre/lib/svm/builder/javacpp.jar:/opt/graalvm-ce-19.2.1/jre/lib/svm/builder/svm-llvm.jar:/opt/graalvm-ce-19.2.1/jre/lib/svm/builder/pointsto.jar:/opt/graalvm-ce-19.2.1/jre/lib/jvmci/jvmci-api.jar:/opt/graalvm-ce-19.2.1/jre/lib/jvmci/graal.jar:/opt/graalvm-ce-19.2.1/jre/lib/jvmci/graal-management.jar:/opt/graalvm-ce-19.2.1/jre/lib/jvmci/jvmci-hotspot.jar \
com.oracle.svm.hosted.NativeImageGeneratorRunner \
-watchpid \
153 \
-imagecp \
/opt/graalvm-ce-19.2.1/jre/lib/boot/graal-sdk.jar:/opt/graalvm-ce-19.2.1/jre/lib/boot/graaljs-scriptengine.jar:/opt/graalvm-ce-19.2.1/jre/lib/svm/builder/llvm-platform-specific.jar:/opt/graalvm-ce-19.2.1/jre/lib/svm/builder/svm.jar:/opt/graalvm-ce-19.2.1/jre/lib/svm/builder/llvm-wrapper.jar:/opt/graalvm-ce-19.2.1/jre/lib/svm/builder/objectfile.jar:/opt/graalvm-ce-19.2.1/jre/lib/svm/builder/graal-llvm.jar:/opt/graalvm-ce-19.2.1/jre/lib/svm/builder/javacpp.jar:/opt/graalvm-ce-19.2.1/jre/lib/svm/builder/svm-llvm.jar:/opt/graalvm-ce-19.2.1/jre/lib/svm/builder/pointsto.jar:/opt/graalvm-ce-19.2.1/jre/lib/jvmci/jvmci-api.jar:/opt/graalvm-ce-19.2.1/jre/lib/jvmci/graal.jar:/opt/graalvm-ce-19.2.1/jre/lib/jvmci/graal-management.jar:/opt/graalvm-ce-19.2.1/jre/lib/jvmci/jvmci-hotspot.jar:/opt/graalvm-ce-19.2.1/jre/lib/svm/library-support.jar:/root/.m2/repository/net/incongru/watchservice/barbary-watchservice/1.0/jna-3.2.2.jar:/code/fc4-framework/tool/classes:/code/fc4-framework/tool/src/main:/code/fc4-framework/tool/src/java:/root/.m2/repository/javax/inject/javax.inject/1/javax.inject-1.jar:/root/.m2/repository/org/clojure/clojure/1.10.1/clojure-1.10.1.jar:/root/.m2/repository/joda-time/joda-time/2.10.3/joda-time-2.10.3.jar:/root/.m2/repository/commons-codec/commons-codec/1.10/commons-codec-1.10.jar:/root/.m2/repository/org/clojure/tools.analyzer/0.6.9/tools.analyzer-0.6.9.jar:/root/.m2/repository/org/eclipse/jetty/jetty-xml/9.4.19.v20190610/jetty-xml-9.4.19.v20190610.jar:/root/.m2/repository/org/codehaus/plexus/plexus-component-annotations/1.7.1/plexus-component-annotations-1.7.1.jar:/root/.m2/repository/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar:/root/.m2/repository/org/springframework/build/aws-maven/5.0.0.RELEASE/aws-maven-5.0.0.RELEASE.jar:/root/.m2/repository/org/clojure/core.specs.alpha/0.2.44/core.specs.alpha-0.2.44.jar:/root/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.5.5/jackson-databind-2.5.5.jar:/root/.gitlibs/libs/expound/expound/297e0812eb77ae3aa8f30e823f8bdbbb4650fa28/src:/root/.m2/repository/org/clojure/spec.alpha/0.2.176/spec.alpha-0.2.176.jar:/root/.m2/repository/org/clojure/tools.cli/0.4.2/tools.cli-0.4.2.jar:/root/.m2/repository/org/eclipse/jetty/jetty-http/9.4.19.v20190610/jetty-http-9.4.19.v20190610.jar:/root/.m2/repository/org/eclipse/jetty/jetty-util/9.4.19.v20190610/jetty-util-9.4.19.v20190610.jar:/root/.m2/repository/com/taoensso/encore/2.91.0/encore-2.91.0.jar:/root/.m2/repository/org/apache/maven/resolver/maven-resolver-transport-wagon/1.1.1/maven-resolver-transport-wagon-1.1.1.jar:/root/.gitlibs/libs/clj-chrome-devtools/clj-chrome-devtools/a1b1b0903ae5ba56eaada8496ed3785a53d8cc06/src:/root/.m2/repository/org/slf4j/jcl-over-slf4j/1.7.25/jcl-over-slf4j-1.7.25.jar:/root/.m2/repository/org/clojure/tools.analyzer.jvm/0.7.2/tools.analyzer.jvm-0.7.2.jar:/root/.m2/repository/com/jcraft/jsch.agentproxy.jsch/0.0.9/jsch.agentproxy.jsch-0.0.9.jar:/root/.m2/repository/net/incongru/watchservice/barbary-watchservice/1.0/barbary-watchservice-1.0.jar:/root/.m2/repository/org/apache/maven/wagon/wagon-provider-api/3.0.0/wagon-provider-api-3.0.0.jar:/root/.m2/repository/com/jcraft/jsch.agentproxy.sshagent/0.0.9/jsch.agentproxy.sshagent-0.0.9.jar:/root/.m2/repository/org/clojure/tools.macro/0.1.1/tools.macro-0.1.1.jar:/root/.m2/repository/com/cognitect/anomalies/0.1.12/anomalies-0.1.12.jar:/root/.m2/repository/com/fasterxml/jackson/dataformat/jackson-dataformat-cbor/2.9.9/jackson-dataformat-cbor-2.9.9.jar:/root/.m2/repository/com/gfredericks/test.chuck/0.2.10/test.chuck-0.2.10.jar:/root/.m2/repository/org/flatland/useful/0.11.6/useful-0.11.6.jar:/root/.m2/repository/org/apache/maven/resolver/maven-resolver-transport-http/1.1.1/maven-resolver-transport-http-1.1.1.jar:/root/.m2/repository/org/apache/maven/maven-model-builder/3.5.2/maven-model-builder-3.5.2.jar:/root/.m2/repository/io/aviso/pretty/0.1.33/pretty-0.1.33.jar:/root/.m2/repository/com/googlecode/javaewah/JavaEWAH/1.1.6/JavaEWAH-1.1.6.jar:/root/.m2/repository/org/codehaus/plexus/plexus-utils/3.1.0/plexus-utils-3.1.0.jar:/root/.m2/repository/org/apache/maven/resolver/maven-resolver-transport-file/1.1.1/maven-resolver-transport-file-1.1.1.jar:/root/.m2/repository/org/eclipse/sisu/org.eclipse.sisu.plexus/0.3.3/org.eclipse.sisu.plexus-0.3.3.jar:/root/.m2/repository/org/eclipse/jetty/websocket/websocket-api/9.4.19.v20190610/websocket-api-9.4.19.v20190610.jar:/root/.m2/repository/org/flatland/ordered/1.5.7/ordered-1.5.7.jar:/root/.m2/repository/com/jcraft/jsch.agentproxy.usocket-jna/0.0.9/jsch.agentproxy.usocket-jna-0.0.9.jar:/root/.m2/repository/commons-io/commons-io/2.5/commons-io-2.5.jar:/root/.m2/repository/org/apache/maven/maven-settings-builder/3.5.2/maven-settings-builder-3.5.2.jar:/root/.m2/repository/org/clojure/tools.namespace/0.3.1/tools.namespace-0.3.1.jar:/root/.m2/repository/org/eclipse/jetty/websocket/websocket-client/9.4.19.v20190610/websocket-client-9.4.19.v20190610.jar:/root/.m2/repository/org/eclipse/jgit/org.eclipse.jgit/4.10.0.201712302008-r/org.eclipse.jgit-4.10.0.201712302008-r.jar:/root/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.9.9/jackson-core-2.9.9.jar:/root/.m2/repository/clj-time/clj-time/0.10.0/clj-time-0.10.0.jar:/root/.m2/repository/org/yaml/snakeyaml/1.24/snakeyaml-1.24.jar:/root/.m2/repository/javax/enterprise/cdi-api/1.0/cdi-api-1.0.jar:/root/.m2/repository/org/apache/maven/maven-settings/3.5.2/maven-settings-3.5.2.jar:/root/.m2/repository/org/apache/httpcomponents/httpcore/4.4.8/httpcore-4.4.8.jar:/root/.m2/repository/instaparse/instaparse/1.3.6/instaparse-1.3.6.jar:/root/.m2/repository/org/apache/maven/maven-core/3.5.2/maven-core-3.5.2.jar:/root/.m2/repository/org/sonatype/plexus/plexus-cipher/1.4/plexus-cipher-1.4.jar:/root/.m2/repository/stylefruits/gniazdo/1.1.2/gniazdo-1.1.2.jar:/root/.m2/repository/com/taoensso/truss/1.5.0/truss-1.5.0.jar:/root/.m2/repository/com/jcraft/jsch.agentproxy.pageant/0.0.9/jsch.agentproxy.pageant-0.0.9.jar:/root/.m2/repository/org/apache/maven/resolver/maven-resolver-api/1.1.1/maven-resolver-api-1.1.1.jar:/root/.m2/repository/software/amazon/ion/ion-java/1.0.2/ion-java-1.0.2.jar:/root/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.5.0/jackson-annotations-2.5.0.jar:/root/.m2/repository/javax/annotation/jsr250-api/1.0/jsr250-api-1.0.jar:/root/.m2/repository/org/apache/maven/maven-resolver-provider/3.5.2/maven-resolver-provider-3.5.2.jar:/root/.m2/repository/org/apache/maven/shared/maven-shared-utils/3.1.0/maven-shared-utils-3.1.0.jar:/root/.m2/repository/org/clojure/java.classpath/0.3.0/java.classpath-0.3.0.jar:/root/.m2/repository/org/clojure/tools.deps.alpha/0.7.549/tools.deps.alpha-0.7.549.jar:/root/.m2/repository/commons-logging/commons-logging/1.1.3/commons-logging-1.1.3.jar:/root/.m2/repository/com/google/guava/guava/20.0/guava-20.0.jar:/root/.m2/repository/org/clojure/data.xml/0.2.0-alpha5/data.xml-0.2.0-alpha5.jar:/root/.m2/repository/com/amazonaws/jmespath-java/1.11.184/jmespath-java-1.11.184.jar:/root/.m2/repository/org/apache/maven/resolver/maven-resolver-spi/1.1.1/maven-resolver-spi-1.1.1.jar:/root/.m2/repository/com/amazonaws/aws-java-sdk-core/1.11.184/aws-java-sdk-core-1.11.184.jar:/root/.m2/repository/com/taoensso/timbre/4.10.0/timbre-4.10.0.jar:/root/.m2/repository/org/codehaus/plexus/plexus-classworlds/2.5.2/plexus-classworlds-2.5.2.jar:/root/.m2/repository/s3-wagon-private/s3-wagon-private/1.3.1/s3-wagon-private-1.3.1.jar:/root/.m2/repository/org/sonatype/plexus/plexus-sec-dispatcher/1.4/plexus-sec-dispatcher-1.4.jar:/root/.m2/repository/clj-commons/clj-yaml/0.7.0/clj-yaml-0.7.0.jar:/root/.m2/repository/org/codehaus/plexus/plexus-interpolation/1.24/plexus-interpolation-1.24.jar:/root/.m2/repository/org/apache/httpcomponents/httpclient/4.5.4/httpclient-4.5.4.jar:/root/.m2/repository/net/java/dev/jna/jna/5.4.0/jna-5.4.0.jar:/root/.m2/repository/com/google/inject/guice/4.0/guice-4.0-no_aop.jar:/root/.m2/repository/cheshire/cheshire/5.9.0/cheshire-5.9.0.jar:/root/.m2/repository/tigris/tigris/0.1.1/tigris-0.1.1.jar:/root/.m2/repository/com/jcraft/jsch.agentproxy.connector-factory/0.0.9/jsch.agentproxy.connector-factory-0.0.9.jar:/root/.m2/repository/org/eclipse/jetty/jetty-client/9.4.19.v20190610/jetty-client-9.4.19.v20190610.jar:/root/.m2/repository/com/andrewmcveigh/cljs-time/0.5.1/cljs-time-0.5.1.jar:/root/.m2/repository/org/eclipse/jetty/jetty-io/9.4.19.v20190610/jetty-io-9.4.19.v20190610.jar:/root/.m2/repository/org/clojure/tools.reader/1.3.2/tools.reader-1.3.2.jar:/root/.m2/repository/net/java/dev/jna/jna-platform/5.4.0/jna-platform-5.4.0.jar:/root/.m2/repository/org/clojure/tools.gitlibs/0.2.64/tools.gitlibs-0.2.64.jar:/root/.m2/repository/org/apache/maven/resolver/maven-resolver-connector-basic/1.1.1/maven-resolver-connector-basic-1.1.1.jar:/root/.m2/repository/org/apache/maven/resolver/maven-resolver-impl/1.1.1/maven-resolver-impl-1.1.1.jar:/root/.m2/repository/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar:/root/.m2/repository/org/apache/maven/maven-model/3.5.2/maven-model-3.5.2.jar:/root/.m2/repository/org/clojure/test.check/0.10.0-RC1/test.check-0.10.0-RC1.jar:/root/.gitlibs/libs/taylorwood/clj.native-image/b3823a48be75122b9671c86ce5353a85589ef15f/src:/root/.m2/repository/org/eclipse/sisu/org.eclipse.sisu.inject/0.3.3/org.eclipse.sisu.inject-0.3.3.jar:/root/.m2/repository/org/apache/maven/resolver/maven-resolver-util/1.1.1/maven-resolver-util-1.1.1.jar:/root/.m2/repository/org/eclipse/jetty/websocket/websocket-common/9.4.19.v20190610/websocket-common-9.4.19.v20190610.jar:/root/.m2/repository/org/clojure/core.memoize/0.5.9/core.memoize-0.5.9.jar:/root/.m2/repository/hawk/hawk/0.2.11/hawk-0.2.11.jar:/root/.m2/repository/org/apache/maven/maven-repository-metadata/3.5.2/maven-repository-metadata-3.5.2.jar:/root/.m2/repository/org/clojure/data.priority-map/0.0.7/data.priority-map-0.0.7.jar:/root/.m2/repository/aopalliance/aopalliance/1.0/aopalliance-1.0.jar:/root/.m2/repository/org/apache/maven/maven-builder-support/3.5.2/maven-builder-support-3.5.2.jar:/root/.m2/repository/com/jcraft/jsch/0.1.54/jsch-0.1.54.jar:/root/.m2/repository/com/jcraft/jsch.agentproxy.core/0.0.9/jsch.agentproxy.core-0.0.9.jar:/root/.m2/repository/com/jcraft/jsch.agentproxy.usocket-nc/0.0.9/jsch.agentproxy.usocket-nc-0.0.9.jar:/root/.m2/repository/org/clojure/core.cache/0.6.5/core.cache-0.6.5.jar:/root/.m2/repository/org/ow2/asm/asm-all/4.2/asm-all-4.2.jar:/root/.m2/repository/com/amazonaws/aws-java-sdk-kms/1.11.184/aws-java-sdk-kms-1.11.184.jar:/root/.m2/repository/org/apache/maven/maven-plugin-api/3.5.2/maven-plugin-api-3.5.2.jar:/root/.m2/repository/org/clojure/core.async/0.4.500/core.async-0.4.500.jar:/root/.m2/repository/com/fasterxml/jackson/dataformat/jackson-dataformat-smile/2.9.9/jackson-dataformat-smile-2.9.9.jar:/root/.m2/repository/org/apache/maven/maven-artifact/3.5.2/maven-artifact-3.5.2.jar:/root/.m2/repository/org/clojure/data.codec/0.1.0/data.codec-0.1.0.jar:/root/.m2/repository/com/amazonaws/aws-java-sdk-s3/1.11.184/aws-java-sdk-s3-1.11.184.jar:/root/.m2/repository/http-kit/http-kit/2.3.0/http-kit-2.3.0.jar \
-H:Path=/code/fc4-framework/tool \
-H:EnableURLProtocols=https \
-H:ClassInitialization=clojure:build_time \
-H:ClassInitialization=org.httpkit.client:run_time \
-H:FallbackThreshold=0 \
-H:+AllowIncompleteClasspath \
-H:+ReportUnsupportedElementsAtRuntime \
-H:+StaticExecutable \
-H:Name=target/fc4 \
-H:CLibraryPath=/opt/graalvm-ce-19.2.1/jre/lib/svm/clibraries/linux-amd64 \
-H:Class=fc4.io.cli.main
]
[target/fc4:173] classlist: 45,617.88 ms
[target/fc4:173] (cap): 1,804.94 ms
[target/fc4:173] setup: 3,916.12 ms
[target/fc4:173] (typeflow): 23,709.41 ms
[target/fc4:173] (objects): 14,596.24 ms
[target/fc4:173] (features): 2,268.69 ms
[target/fc4:173] analysis: 41,889.04 ms
[target/fc4:173] (clinit): 604.56 ms
[target/fc4:173] universe: 1,657.16 ms
[target/fc4:173] (parse): 3,147.89 ms
[target/fc4:173] (inline): 4,109.84 ms
[target/fc4:173] (compile): 35,942.58 ms
[target/fc4:173] compile: 45,723.19 ms
[target/fc4:173] image: 3,067.16 ms
[target/fc4:173] write: 1,657.88 ms
[target/fc4:173] [total]: 143,965.37 ms
The only change I had to make was --initialize-at-build-time=clojure
in native-image options. Unfortunately the resulting fc4
image throws an exception about not being able to load clojure.core.server
.
Taylor, thank you so much! I’ll revisit this and pick it back up from where you left it, hopefully in a few weeks. Thanks! 🤗
@aviflax I got similar-looking errors but only after trying commits after (and including) https://github.com/taylorwood/clj.native-image/commit/b3823a48be75122b9671c86ce5353a85589ef15f -- I also tried --initialize-at-build-time=clojure
but got what taylorwood got:
image throws an exception about not being able to load clojure.core.server.
In my case, builds are successful up through commit https://github.com/taylorwood/clj.native-image/commit/7773c73886a5938fec2d6c5a2227c1aec686e1a5 -- here I had --initialize-at-build-time
(with other options as well).
I failed to mention that what I tried with was a separate project.
Sorry for any confusion.
I just tried building FundingCircle/fc4-framework@ 36aad75491a7c08b2b5db932b6749a69baa71e23 (tip of native-image branch) -- but I get:
$ clj -Sforce -A:native-image
Compiling fc4.io.cli.main
Execution error (FileNotFoundException) at fc4.integrations.structurizr.express.chromium-renderer/loading (chromium_renderer.clj:1).
Could not locate clj_chrome_devtools/automation__init.class, clj_chrome_devtools/automation.clj or clj_chrome_devtools/automation.cljc on classpath. Please check that namespaces with dashes use underscores in the Clojure file name.
May be I'm missing some setup step?
Upgrading my clj / clojure to the latest version (1.10.1.492) seems to have addressed this issue (thanks @seancorfield).
I have a running native image binary of fc4 that doesn't crash on startup now, @aviflax :) -s
and -f
don't cause crashes -- working on getting -w
and -r
to work.
Things I did to get this running (a Linux distribution, fwiw):
"--initialize-at-run-time=com.barbarysoftware.jna.CarbonAPI"
to native-image optionstarget
directory in the tool
directory before starting (building stops, complaining about path issues if it doesn't exist)Not quite there yet though, as I get:
$ ./target/fc4 -fsrw doc/examples/docker-install-and-render/
Exception in thread "main" java.lang.IllegalArgumentException: No matching field found: start for class org.eclipse.jetty.websocket.client.WebSocketClient
at clojure.lang.Reflector.getInstanceField(Reflector.java:397)
at clojure.lang.Reflector.invokeNoArgInstanceMember(Reflector.java:440)
at clj_chrome_devtools.impl.connection$connect_url.invokeStatic(connection.clj:127)
at clj_chrome_devtools.impl.connection$connect.invokeStatic(connection.clj:151)
at fc4.integrations.structurizr.express.chromium_renderer$make_renderer.invokeStatic(chromium_renderer.clj:280)
at fc4.integrations.structurizr.express.chromium_renderer$make_renderer.invokeStatic(chromium_renderer.clj:274)
at fc4.io.cli.main$_main.invokeStatic(main.clj:202)
at fc4.io.cli.main$_main.doInvoke(main.clj:192)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at fc4.io.cli.main.main(Unknown Source)
Adding a reflection.json file with appropriate content (and adding "-H:ReflectionConfigurationFiles=reflection.json"
to native image options) seems to make some of these types of errors go away.
This exception at runtime has me stumped:
Exception in thread "main" java.lang.IllegalArgumentException: Class java.nio.file.StandardWatchEventKinds$StdWatchEventKind[] is instantiated reflectively but was never registered. Register the class by using org.graalvm.nativeimage.hosted.RuntimeReflection
at com.oracle.svm.core.genscavenge.graal.AllocationSnippets.checkArrayHub(AllocationSnippets.java:172)
at clojure.lang.RT.seqToTypedArray(RT.java:1753)
at clojure.lang.RT.seqToTypedArray(RT.java:1749)
at clojure.core$into_array.invokeStatic(core.clj:3452)
at clojure.core$into_array.invoke(core.clj:3443)
at hawk.watcher$recursive_register_BANG_.invokeStatic(watcher.clj:39)
at hawk.watcher$recursive_register_BANG_.invoke(watcher.clj:38)
at hawk.watcher$fn__109.invokeStatic(watcher.clj:73)
at hawk.watcher$fn__109.invoke(watcher.clj:72)
at hawk.watcher$fn__38$G__29__47.invoke(watcher.clj:24)
at hawk.core$watch_BANG_.invokeStatic(core.clj:83)
at hawk.core$watch_BANG_.doInvoke(core.clj:59)
at clojure.lang.RestFn.invoke(RestFn.java:410)
at fc4.io.watch$start.invokeStatic(watch.clj:124)
at fc4.io.cli.main$start.invokeStatic(main.clj:188)
at fc4.io.cli.main$_main$fn__24295.invoke(main.clj:203)
at fc4.io.cli.main$_main.invokeStatic(main.clj:203)
at fc4.io.cli.main$_main.doInvoke(main.clj:192)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at fc4.io.cli.main.main(Unknown Source)
FWIW, the reflection.json file is zipped below:
@sogaiu - did you ever find a solution for this ? I'm running into a similar error using graal and a file watcher library. I'm trying to setup my reflection file to include the java.nio.file.StandardWatchEventKinds$StdWatchEventKind[] but haven't had much luck.
@teesloane I don't think I did.
My recommendation is to ask on clojurians slack #graalvm channel about your specific situation.
@sogaiu will do, thanks!
edit: solution was to add this to my reflection file:
[
{
"name" : "java.nio.file.StandardWatchEventKinds$StdWatchEventKind[]"
}
]
👋 hi @taylorwood, I hope you don’t mind me dropping another general “I have no idea what I’m doing” issue on you. Given that it’s been almost exactly a year since my last attempt (#2) I wanted to try again to create a native image of my project. I didn’t get very far and I don’t really understand the error output, so I’m hoping you might have a few minutes to point me in the right direction.
I’m running MacOS 10.14.5 and I’m using GraalVM CE 19.2.1 and native-image 19.2.1.
Here’s the profile I added to my
deps.edn
:and here’s the output when I run
clojure -A:native-image
:output
```text ~/dev/fc4-framework/tool $ clojure -A:native-image Compiling fc4.io.cli.main Reflection warning, clj_chrome_devtools/automation.clj:61:5 - reference to field close on java.lang.Object can't be resolved. Compiling fc4.files Compiling fc4.image-utils Compiling fc4.integrations.structurizr.express.chromium-renderer Compiling fc4.integrations.structurizr.express.export Compiling fc4.integrations.structurizr.express.format Compiling fc4.integrations.structurizr.express.snap Compiling fc4.integrations.structurizr.express.spec Compiling fc4.integrations.structurizr.express.yaml Compiling fc4.io.cli.main Compiling fc4.io.cli.util Compiling fc4.io.dsl Compiling fc4.io.render Compiling fc4.io.util Compiling fc4.io.watch Compiling fc4.io.yaml Compiling fc4.model Compiling fc4.rendering Compiling fc4.spec Compiling fc4.styles Compiling fc4.util Compiling fc4.view Compiling fc4.yaml [target/fc4:64156] classlist: 10,049.22 ms [target/fc4:64156] (cap): 1,399.70 ms [target/fc4:64156] setup: 2,605.29 ms [target/fc4:64156] analysis: 105,538.54 ms Error: Unsupported features in 8 methods Detailed message: Error: com.oracle.graal.pointsto.constraints.UnsupportedFeatureException: Invoke with MethodHandle argument could not be reduced to at most a single call: java.lang.invoke.MethodHandle.bindTo(Object) Trace: at parsing java.lang.invoke.MethodHandleImpl.makePairwiseConvertByEditor(MethodHandleImpl.java:221) Call path from entry point to java.lang.invoke.MethodHandleImpl.makePairwiseConvertByEditor(MethodHandle, MethodType, boolean, boolean): at java.lang.invoke.MethodHandleImpl.makePairwiseConvertByEditor(MethodHandleImpl.java:207) at java.lang.invoke.MethodHandleImpl.makePairwiseConvert(MethodHandleImpl.java:194) at java.lang.invoke.MethodHandleImpl.makePairwiseConvert(MethodHandleImpl.java:380) at java.lang.invoke.MethodHandle.asTypeUncached(MethodHandle.java:776) at java.lang.invoke.MethodHandle.asType(MethodHandle.java:761) at java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:627) at com.oracle.svm.reflect.MethodHandle_invokeWithArguments_9dda848d0201e4e26c7b3711f56411a6605b9b6f_29.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Method.java:498) at clojure.core$bean$fn__7197$fn__7198.invoke(core_proxy.clj:408) at clojure.lang.AFn.run(AFn.java:22) at java.lang.Thread.run(Thread.java:748) at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:460) at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:193) at com.oracle.svm.core.code.IsolateEnterStub.PosixJavaThreads_pthreadStartRoutine_e1f4a8c0039f8337338252cd8734f63a79b5e3df(generated:0) Error: com.oracle.graal.pointsto.constraints.UnsupportedFeatureException: Invoke with MethodHandle argument could not be reduced to at most a single call: java.lang.invoke.MethodHandleImpl$BindCaller.prepareForInvoker(MethodHandle) Trace: at parsing java.lang.invoke.MethodHandleImpl$BindCaller.makeInjectedInvoker(MethodHandleImpl.java:1166) Call path from entry point to java.lang.invoke.MethodHandleImpl$BindCaller.makeInjectedInvoker(Class): at java.lang.invoke.MethodHandleImpl$BindCaller.makeInjectedInvoker(MethodHandleImpl.java:1141) at java.lang.invoke.MethodHandleImpl$BindCaller.access$300(MethodHandleImpl.java:1122) at java.lang.invoke.MethodHandleImpl$BindCaller$1.computeValue(MethodHandleImpl.java:1175) at java.lang.invoke.MethodHandleImpl$BindCaller$1.computeValue(MethodHandleImpl.java:1173) at com.oracle.svm.core.jdk.Target_java_lang_ClassValue.get(JavaLangSubstitutions.java:514) at java.lang.invoke.MethodHandleImpl.makeArrayElementAccessor(MethodHandleImpl.java:76) at java.lang.invoke.MethodHandles.arrayElementGetter(MethodHandles.java:1825) at java.lang.invoke.LambdaFormEditor.spreadArgumentsForm(LambdaFormEditor.java:550) at java.lang.invoke.MethodHandle.asSpreader(MethodHandle.java:874) at java.lang.invoke.Invokers.spreadInvoker(Invokers.java:158) at java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:627) at com.oracle.svm.reflect.MethodHandle_invokeWithArguments_9dda848d0201e4e26c7b3711f56411a6605b9b6f_29.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Method.java:498) at clojure.core$bean$fn__7197$fn__7198.invoke(core_proxy.clj:408) at clojure.lang.AFn.run(AFn.java:22) at java.lang.Thread.run(Thread.java:748) at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:460) at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:193) at com.oracle.svm.core.code.IsolateEnterStub.PosixJavaThreads_pthreadStartRoutine_e1f4a8c0039f8337338252cd8734f63a79b5e3df(generated:0) Error: com.oracle.graal.pointsto.constraints.UnsupportedFeatureException: Invoke with MethodHandle argument could not be reduced to at most a single call: java.lang.invoke.MethodHandleImpl.buildVarargsArray(MethodHandle, MethodHandle, int) Trace: at parsing java.lang.invoke.MethodHandleImpl.varargsArray(MethodHandleImpl.java:1634) Call path from entry point to java.lang.invoke.MethodHandleImpl.varargsArray(Class, int): at java.lang.invoke.MethodHandleImpl.varargsArray(MethodHandleImpl.java:1611) at java.lang.invoke.MethodHandleImpl$IntrinsicMethodHandle.asCollector(MethodHandleImpl.java:1363) at java.lang.invoke.MethodHandleImpl$AsVarargsCollector.asTypeUncached(MethodHandleImpl.java:502) at java.lang.invoke.MethodHandle.asType(MethodHandle.java:761) at java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:627) at com.oracle.svm.reflect.MethodHandle_invokeWithArguments_9dda848d0201e4e26c7b3711f56411a6605b9b6f_29.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Method.java:498) at clojure.core$bean$fn__7197$fn__7198.invoke(core_proxy.clj:408) at clojure.lang.AFn.run(AFn.java:22) at java.lang.Thread.run(Thread.java:748) at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:460) at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:193) at com.oracle.svm.core.code.IsolateEnterStub.PosixJavaThreads_pthreadStartRoutine_e1f4a8c0039f8337338252cd8734f63a79b5e3df(generated:0) Error: com.oracle.graal.pointsto.constraints.UnsupportedFeatureException: No instances of javax.net.ssl.SSLContext are allowed in the image heap as this class should be initialized at image runtime. To see how this object got instantiated use -H:+TraceClassInitialization. Trace: at parsing org.httpkit.client.HttpClient.exec(HttpClient.java:347) Call path from entry point to org.httpkit.client.HttpClient.exec(String, RequestConfig, SSLEngine, IRespListener): at org.httpkit.client.HttpClient.exec(HttpClient.java:269) at org.httpkit.client$request.invokeStatic(client.clj:258) at org.httpkit.client$request.doInvoke(client.clj:152) at clojure.lang.RestFn.applyTo(RestFn.java:139) at fc4.io.cli.main.main(Unknown Source) at com.oracle.svm.core.JavaMainWrapper.runCore(JavaMainWrapper.java:151) at com.oracle.svm.core.JavaMainWrapper.run(JavaMainWrapper.java:186) at com.oracle.svm.core.code.IsolateEnterStub.JavaMainWrapper_run_5087f5482cc9a6abc971913ece43acb471d2631b(generated:0) Error: com.oracle.graal.pointsto.constraints.UnsupportedFeatureException: No instances of javax.net.ssl.SSLContext are allowed in the image heap as this class should be initialized at image runtime. To see how this object got instantiated use -H:+TraceClassInitialization. Trace: at parsing org.httpkit.client.SslContextFactory.trustAnybody(SslContextFactory.java:36) Call path from entry point to org.httpkit.client.SslContextFactory.trustAnybody(): at org.httpkit.client.SslContextFactory.trustAnybody(SslContextFactory.java:36) at org.httpkit.client$coerce_req.invokeStatic(client.clj:68) at org.httpkit.client$coerce_req.invoke(client.clj:59) at instaparse.auto_flatten_seq.FlattenOnDemandVector.applyTo(auto_flatten_seq.clj:270) at fc4.io.cli.main.main(Unknown Source) at com.oracle.svm.core.JavaMainWrapper.runCore(JavaMainWrapper.java:151) at com.oracle.svm.core.JavaMainWrapper.run(JavaMainWrapper.java:186) at com.oracle.svm.core.code.IsolateEnterStub.JavaMainWrapper_run_5087f5482cc9a6abc971913ece43acb471d2631b(generated:0) Error: type is not available in this platform: com.oracle.svm.hosted.NativeImageGenerator Trace: object java.lang.Class[] object java.lang.invoke.MethodType object java.lang.invoke.MethodType$ConcurrentWeakInternSet$WeakEntry object java.util.concurrent.ConcurrentHashMap$Node object java.util.concurrent.ConcurrentHashMap$Node[] object java.util.concurrent.ConcurrentHashMap object java.lang.invoke.MethodType$ConcurrentWeakInternSet method java.lang.invoke.MethodType.makeImpl(Class, Class[], boolean) Call path from entry point to java.lang.invoke.MethodType.makeImpl(Class, Class[], boolean): at java.lang.invoke.MethodType.makeImpl(MethodType.java:301) at java.lang.invoke.MethodType.methodType(MethodType.java:206) at com.oracle.svm.reflect.MethodType_methodType_9d13644056a712f9cdb73fb2ef8b26f65294abe9_35.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Method.java:498) at clojure.core$bean$fn__7197$fn__7198.invoke(core_proxy.clj:408) at clojure.lang.AFn.run(AFn.java:22) at java.lang.Thread.run(Thread.java:748) at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:460) at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:193) at com.oracle.svm.core.code.IsolateEnterStub.PosixJavaThreads_pthreadStartRoutine_e1f4a8c0039f8337338252cd8734f63a79b5e3df(generated:0) Error: type is not available in this platform: com.oracle.svm.hosted.lambda.LambdaSubstitutionType Trace: object java.lang.invoke.MethodType object java.lang.invoke.MethodType$ConcurrentWeakInternSet$WeakEntry object java.util.concurrent.ConcurrentHashMap$Node object java.util.concurrent.ConcurrentHashMap$Node[] object java.util.concurrent.ConcurrentHashMap object java.lang.invoke.MethodType$ConcurrentWeakInternSet method java.lang.invoke.MethodType.makeImpl(Class, Class[], boolean) Call path from entry point to java.lang.invoke.MethodType.makeImpl(Class, Class[], boolean): at java.lang.invoke.MethodType.makeImpl(MethodType.java:301) at java.lang.invoke.MethodType.methodType(MethodType.java:206) at com.oracle.svm.reflect.MethodType_methodType_9d13644056a712f9cdb73fb2ef8b26f65294abe9_35.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Method.java:498) at clojure.core$bean$fn__7197$fn__7198.invoke(core_proxy.clj:408) at clojure.lang.AFn.run(AFn.java:22) at java.lang.Thread.run(Thread.java:748) at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:460) at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:193) at com.oracle.svm.core.code.IsolateEnterStub.PosixJavaThreads_pthreadStartRoutine_e1f4a8c0039f8337338252cd8734f63a79b5e3df(generated:0) Error: unbalanced monitors: mismatch at monitorexit, 96|LoadField#lockee__5436__auto__ != 3|LoadField#lockee__5436__auto__ Call path from entry point to clojure.spec.gen.alpha$dynaload$fn__2628.invoke(): at clojure.spec.gen.alpha$dynaload$fn__2628.invoke(alpha.clj:21) at clojure.lang.AFn.run(AFn.java:22) at java.lang.Thread.run(Thread.java:748) at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:460) at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:193) at com.oracle.svm.core.code.IsolateEnterStub.PosixJavaThreads_pthreadStartRoutine_e1f4a8c0039f8337338252cd8734f63a79b5e3df(generated:0) Original exception that caused the problem: org.graalvm.compiler.code.SourceStackTraceBailoutException$1: unbalanced monitors: mismatch at monitorexit, 96|LoadField#lockee__5436__auto__ != 3|LoadField#lockee__5436__auto__ at clojure.spec.gen.alpha$dynaload$fn__2628.invoke(alpha.clj:22) Caused by: org.graalvm.compiler.core.common.PermanentBailoutException: unbalanced monitors: mismatch at monitorexit, 96|LoadField#lockee__5436__auto__ != 3|LoadField#lockee__5436__auto__ at org.graalvm.compiler.java.BytecodeParser.bailout(BytecodeParser.java:3761) at org.graalvm.compiler.java.BytecodeParser.genMonitorExit(BytecodeParser.java:2703) at org.graalvm.compiler.java.BytecodeParser.processBytecode(BytecodeParser.java:5136) at org.graalvm.compiler.java.BytecodeParser.iterateBytecodesForBlock(BytecodeParser.java:3267) at org.graalvm.compiler.java.BytecodeParser.processBlock(BytecodeParser.java:3074) at org.graalvm.compiler.java.BytecodeParser.build(BytecodeParser.java:976) at org.graalvm.compiler.java.BytecodeParser.buildRootMethod(BytecodeParser.java:870) at org.graalvm.compiler.java.GraphBuilderPhase$Instance.run(GraphBuilderPhase.java:84) at org.graalvm.compiler.phases.Phase.run(Phase.java:49) at org.graalvm.compiler.phases.BasePhase.apply(BasePhase.java:197) at org.graalvm.compiler.phases.Phase.apply(Phase.java:42) at org.graalvm.compiler.phases.Phase.apply(Phase.java:38) at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.parse(MethodTypeFlowBuilder.java:221) at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.apply(MethodTypeFlowBuilder.java:340) at com.oracle.graal.pointsto.flow.MethodTypeFlow.doParse(MethodTypeFlow.java:310) at com.oracle.graal.pointsto.flow.MethodTypeFlow.ensureParsed(MethodTypeFlow.java:300) at com.oracle.graal.pointsto.flow.MethodTypeFlow.addContext(MethodTypeFlow.java:107) at com.oracle.graal.pointsto.flow.SpecialInvokeTypeFlow.onObservedUpdate(InvokeTypeFlow.java:421) at com.oracle.graal.pointsto.flow.TypeFlow.notifyObservers(TypeFlow.java:343) at com.oracle.graal.pointsto.flow.TypeFlow.update(TypeFlow.java:385) at com.oracle.graal.pointsto.flow.SourceTypeFlowBase.update(SourceTypeFlowBase.java:121) at com.oracle.graal.pointsto.BigBang$2.run(BigBang.java:510) at com.oracle.graal.pointsto.util.CompletionExecutor.lambda$execute$0(CompletionExecutor.java:171) at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402) at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289) at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056) at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692) at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157) Error: Use -H:+ReportExceptionStackTraces to print stacktrace of underlying exception Error: Image build request failed with exit status 1 ```My guess is that you could walk me through fixing the “unsupported features” but that last error, the “unbalanced monitors” error — that looks familiar, IIRC that’s related to some incompatibility between GraalVM/native-image and certain code paths in the Clojure runtime… which might be non-work-around-able? If that’s the case, if we’re stuck, then there’s no need to resolve the other errors… but I’d appreciate whatever pointers you’d care to share!
If it helps, feel free to take a look at my branch of my project with that profile added.
(Also, if you’ll be at the Conj next month in Raleigh, I’ll be there too and I’d love to catch up!)