Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bb execution fails on Gentoo #1669

Closed
edannenberg opened this issue Feb 7, 2024 · 6 comments
Closed

bb execution fails on Gentoo #1669

edannenberg opened this issue Feb 7, 2024 · 6 comments

Comments

@edannenberg
Copy link

version

1.3.188

platform

Gentoo Linux - amd64

problem

Gentoo supports multiple Java installations, both system-wide and for users. A simple Bash script serves as a wrapper for Java that resolves the path/config of the currently selected Java VM before executing the actual java binary.

$ ls -lah /usr/bin/java
lrwxrwxrwx 1 root root 44 Aug 25  2022 /usr/bin/java -> /usr/libexec/eselect-java/run-java-tool.bash

The run-java-tool.bash script has an internal safe guard for being called directly, it should always be invoked via a symlink.
It looks like Babashka tries to execute Java but resolves the symlink of the java binary before doing so, resulting in the stack trace below.

To confirm this I added some debug output to run-java-tool.bash that outputs the name the wrapper script was invoked as (${0##*/}):

$ java -version
wrapper debug: java <- wrapper was called via symlink
openjdk version "11.0.20.1" 2023-08-24
OpenJDK Runtime Environment Temurin-11.0.20.1+1 (build 11.0.20.1+1)
OpenJDK 64-Bit Server VM Temurin-11.0.20.1+1 (build 11.0.20.1+1, mixed mode)
$ /usr/local/bin/bb --help
wrapper debug: run-java-tool.bash <- wrapper was called directly
* run-java-tool was invoked directly
* run-java-tool should only be used via symlinks to it
Exception in thread "main" clojure.lang.ExceptionInfo:  babashka.process.Process@a0d1a87
	at babashka.process$check.invokeStatic(process.cljc:111)
	at babashka.process$shell.invokeStatic(process.cljc:651)
	at babashka.impl.deps$add_deps$fn__27336.invoke(deps.clj:100)
...

Not resolving the Java binary symlink should fix the issue.

repro

Any execution of the bb command on a Gentoo install:

# /usr/local/bin/bb --help
* run-java-tool was invoked directly
* run-java-tool should only be used via symlinks to it
Exception in thread "main" clojure.lang.ExceptionInfo:  babashka.process.Process@a0d1a87
	at babashka.process$check.invokeStatic(process.cljc:111)
	at babashka.process$shell.invokeStatic(process.cljc:651)
	at babashka.impl.deps$add_deps$fn__27336.invoke(deps.clj:100)
	at borkdude.deps$_main.invokeStatic(deps.clj:1052)
	at borkdude.deps$_main.doInvoke(deps.clj:882)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.core$apply.invokeStatic(core.clj:667)
	at babashka.impl.deps$add_deps$fn__27343$fn__27344.invoke(deps.clj:106)
	at clojure.lang.AFn.applyToHelper(AFn.java:152)
	at clojure.lang.AFn.applyTo(AFn.java:144)
	at clojure.core$apply.invokeStatic(core.clj:667)
	at clojure.core$with_bindings_STAR_.invokeStatic(core.clj:1990)
	at clojure.core$with_bindings_STAR_.doInvoke(core.clj:1990)
	at clojure.lang.RestFn.invoke(RestFn.java:425)
	at babashka.impl.deps$add_deps$fn__27343.invoke(deps.clj:106)
	at babashka.impl.deps$add_deps.invokeStatic(deps.clj:106)
	at babashka.main$exec$fn__32207.invoke(main.clj:872)
	at clojure.lang.AFn.applyToHelper(AFn.java:152)
	at clojure.lang.AFn.applyTo(AFn.java:144)
	at clojure.core$apply.invokeStatic(core.clj:667)
	at clojure.core$with_bindings_STAR_.invokeStatic(core.clj:1990)
	at clojure.core$with_bindings_STAR_.doInvoke(core.clj:1990)
	at clojure.lang.RestFn.invoke(RestFn.java:425)
	at babashka.main$exec.invokeStatic(main.clj:824)
	at babashka.main$main.invokeStatic(main.clj:1194)
	at babashka.main$main.doInvoke(main.clj:1143)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.core$apply.invokeStatic(core.clj:667)
	at babashka.main$_main$f__32332__auto____32342.invoke(main.clj:1233)
	at clojure.lang.AFn.run(AFn.java:22)
	at java.base@21.0.1/java.lang.Thread.runWith(Thread.java:1596)
	at java.base@21.0.1/java.lang.Thread.run(Thread.java:1583)
	at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:832)
	at org.graalvm.nativeimage.builder/com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:211)
Exception in thread "main" java.lang.NullPointerException
	at clojure.lang.RT.intCast(RT.java:1221)
	at babashka.main$_main.invokeStatic(main.clj:1233)
	at babashka.main$_main.doInvoke(main.clj:1219)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at babashka.main.main(Unknown Source)
	at java.base@21.0.1/java.lang.invoke.LambdaForm$DMH/sa346b79c.invokeStaticInit(LambdaForm$DMH)
@borkdude
Copy link
Collaborator

borkdude commented Feb 8, 2024

You can work around this for now by setting the JAVA_CMD environment variable

@borkdude
Copy link
Collaborator

borkdude commented Feb 8, 2024

@borkdude
Copy link
Collaborator

borkdude commented Feb 8, 2024

@borkdude
Copy link
Collaborator

borkdude commented Feb 8, 2024

Here is a counter-repro produced by @ingydotnet

$ docker run -it --rm gentoo/stage3 bash
786fba5e0727 / # curl -sSLO https://download.oracle.com/graalvm/21/latest/graalvm-jdk-21_linux-x64_bin.tar.gz
786fba5e0727 / # curl -sSLO https://github.com/babashka/babashka/releases/download/v1.3.188/babashka-1.3.188-linux-amd64.tar.gz
786fba5e0727 / # tar xf graalvm-jdk-21_linux-x64_bin.tar.gz
786fba5e0727 / # tar xf babashka-1.3.188-linux-amd64.tar.gz
786fba5e0727 / # export JAVA_HOME=/graalvm-jdk-21.0.2+13.1 PATH=/:/graalvm-jdk-21.0.2+13.1/bin:$PATH
786fba5e0727 / # bb -Sdeps '{:deps {dev.weavejester/medley {:mvn/version "1.7.0"}}}' -e "(require '[medley.core])"
Clojure tools not yet in expected location: /root/.deps.clj/1.11.1.1435/ClojureTools/clojure-tools-1.11.1.1435.jar
Downloading https://github.com/clojure/brew-install/releases/download/1.11.1.1435/clojure-tools.zip to /root/.deps.clj/1.11.1.1435/ClojureTools/clojure-tools.zip
Unzipping /root/.deps.clj/1.11.1.1435/ClojureTools/clojure-tools.zip ...
Successfully installed clojure tools!
Downloading: org/clojure/clojure/1.11.1/clojure-1.11.1.pom from central
Downloading: org/clojure/core.specs.alpha/0.2.62/core.specs.alpha-0.2.62.pom from central
Downloading: org/clojure/spec.alpha/0.3.218/spec.alpha-0.3.218.pom from central
Downloading: org/clojure/pom.contrib/1.1.0/pom.contrib-1.1.0.pom from central
Downloading: dev/weavejester/medley/1.7.0/medley-1.7.0.pom from clojars
Downloading: org/clojure/core.specs.alpha/0.2.62/core.specs.alpha-0.2.62.jar from central
Downloading: org/clojure/spec.alpha/0.3.218/spec.alpha-0.3.218.jar from central
Downloading: org/clojure/clojure/1.11.1/clojure-1.11.1.jar from central
Downloading: dev/weavejester/medley/1.7.0/medley-1.7.0.jar from clojars

Is it possible to produce a similar repro for your above problem?

@edannenberg
Copy link
Author

edannenberg commented Feb 9, 2024

Thanks for the swift reply! Setting JAVA_CMD worked like a charm.

Setting JAVA_HOME with a manual install like that avoids the issue, the stage3 base image won't even have the java wrapper. Installing a standard Gentoo Java package with emerge -v openjdk-bin should do the trick. If you want to skip all the compiling I also maintain a Gentoo based Clojure image:

$ docker run -it --rm kubler/clojure
$ bash < <(curl -s https://raw.githubusercontent.com/babashka/babashka/master/install)
$ bb -Sdeps '{:deps {dev.weavejester/medley {:mvn/version "1.7.0"}}}' -e "(require '[medley.core])"
Clojure tools not yet in expected location: /root/.deps.clj/1.11.1.1435/ClojureTools/clojure-tools-1.11.1.1435.jar
Downloading https://github.com/clojure/brew-install/releases/download/1.11.1.1435/clojure-tools.zip to /root/.deps.clj/1.11.1.1435/ClojureTools/clojure-tools.zip
Unzipping /root/.deps.clj/1.11.1.1435/ClojureTools/clojure-tools.zip ...
Successfully installed clojure tools!
* run-java-tool was invoked directly
* run-java-tool should only be used via symlinks to it
Exception in thread "main" clojure.lang.ExceptionInfo:  babashka.process.Process@8e9e7e77
	at babashka.process$check.invokeStatic(process.cljc:111)
	at babashka.process$shell.invokeStatic(process.cljc:651)
	at babashka.impl.deps$add_deps$fn__27336.invoke(deps.clj:100)

@borkdude
Copy link
Collaborator

Closing this since I'm not sure what is a fitting solution here and there is a workaround

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants