boot-clj / boot

Build tooling for Clojure.
https://boot-clj.github.io/
Eclipse Public License 1.0
1.75k stars 181 forks source link

NullPointerException when trying to run shebang boot script on macOS #758

Open caleb opened 4 years ago

caleb commented 4 years ago

On two different machines running macOS Catalina 10.15.1 I get a NullPointerException when trying to run boot "shebang" scripts.

I've tried Oracle JDK 11, 12, and 13, and OpenJDK 13.

Inside a docker container the scripts run as expected. These scripts also used to run on macOS a couple months ago. I will try a fresh Catalina install in a VM to make sure it is not a result of having upgraded from Mojave (10.14) on both of my Macs. I will post an update once I'm able to do that.

Here is a script that throws an NPE:

#!/usr/bin/env boot

(print "Hello world")

Here is the error I get:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Boot failed to start:
java.lang.NullPointerException
    at boot.main$shebang_QMARK_.invokeStatic(main.clj:114)
    at boot.main$shebang_QMARK_.invoke(main.clj:110)
    at boot.main$_main.invokeStatic(main.clj:140)
    at boot.main$_main.invoke(main.clj:123)
    at clojure.lang.Var.invoke(Var.java:399)
    at org.projectodd.shimdandy.impl.ClojureRuntimeShimImpl.invoke(ClojureRuntimeShimImpl.java:154)
    at org.projectodd.shimdandy.impl.ClojureRuntimeShimImpl.invoke(ClojureRuntimeShimImpl.java:145)
    at boot.App.runBoot(App.java:407)
    at boot.App.main(App.java:500)

To Reproduce Steps to reproduce the behavior:

  1. Open a terminal
  2. Run the above script ./hello.clj
  3. See error

Expected behavior It should print "Hello world"

Versions:

caleb commented 4 years ago

Okay, I've tested this on a fresh install of Catalina and I get the same error.

I installed boot-clj and oracle-jdk from home-brew and home-brew cask respectively.

burn2delete commented 4 years ago

I believe this is caused by a missing property "boot.app.path" as per the stack trace.

burn2delete commented 4 years ago

I can also confirm the above script works on 10.14.6

caleb commented 4 years ago

That’s what I figured too, and I’ve done some more experiments by installing Mojave, and High Sierra and I am getting the same issue.

I don’t know what changed. I’ve been using these scripts for years on different machines without ever seeing this.

Maybe the boot wrapper program has changed? Or the brew version of boot has a bug? I can try to install boot by hand and see what’s up.

From a clean VM I’m doing:

$ xcode-select —install
$ <install home brew>
$ brew cask install oracle-jdk 
$ brew install boot-clj
$ ./hello.clj

It seems like the boot wrapper is supposed to set boot.app.path but it isn’t getting set like you said.

I’ll do some more tests later.

On Dec 2, 2019, at 1:21 PM, Matthew Ratzke notifications@github.com wrote:

 I believe this is caused by a missing property "boot.app.path" as per the stack trace.

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or unsubscribe.

caleb commented 4 years ago

Okay, I've tracked this down to being an issue with the homebrew installation of boot. When installed manually boot works.

Now to track down what changed in the homebrew formula

EDIT:

Here's the commit that broke it:

https://github.com/Homebrew/homebrew-core/pull/46494/files

Looks like they switched from the shellscript provided by boot-clj (from the boot-bin repo) to using a homebrew generated wrapper script that calls the boot-clj jar file directly, but doesn't provide the necessary definitions.

I will submit a patch to homebrew to revert to the old installation method.