clj-on-windows 2020-12-27

I'm running into a problem with environment variables and classpaths on Windows. I have a file .cp1 which contains a classpath. I want to put this classpath in an environment variable FOO.

C:\Temp\buddy\pod-babashka-buddy>type .cp1
src;C:\Users\borkdude\.gitlibs\libs\babashka\pods\22f200ef3006da90971e3bafa794985918b65fea\src;C:\Users\borkdude\.m2\repository\buddy\buddy-core\1.9.0\buddy-core-1.9.0.jar;C:\Users\borkdude\.m2\repository\com\cognitect\transit-clj\1.0.324\transit-clj-1.0.324.jar;C:\Users\
borkdude\.m2\repository\nrepl\bencode\1.1.0\bencode-1.1.0.jar;C:\Users\borkdude\.m2\repository\org\clojure\clojure\1.10.2-rc1\clojure-1.10.2-rc1.jar;C:\Users\borkdude\.m2\repository\cheshire\cheshire\5.10.0\cheshire-5.10.0.jar;C:\Users\borkdude\.m2\repository\commons-code
c\commons-codec\1.15\commons-codec-1.15.jar;C:\Users\borkdude\.m2\repository\org\bouncycastle\bcpkix-jdk15on\1.67\bcpkix-jdk15on-1.67.jar;C:\Users\borkdude\.m2\repository\org\bouncycastle\bcprov-jdk15on\1.67\bcprov-jdk15on-1.67.jar;C:\Users\borkdude\.m2\repository\com\cog
nitect\transit-java\1.0.343\transit-java-1.0.343.jar;C:\Users\borkdude\.m2\repository\org\clojure\core.specs.alpha\0.2.44\core.specs.alpha-0.2.44.jar;C:\Users\borkdude\.m2\repository\org\clojure\spec.alpha\0.2.187\spec.alpha-0.2.187.jar;C:\Users\borkdude\.m2\repository\co
m\fasterxml\jackson\core\jackson-core\2.10.2\jackson-core-2.10.2.jar;C:\Users\borkdude\.m2\repository\com\fasterxml\jackson\dataformat\jackson-dataformat-cbor\2.10.2\jackson-dataformat-cbor-2.10.2.jar;C:\Users\borkdude\.m2\repository\com\fasterxml\jackson\dataformat\jacks
on-dataformat-smile\2.10.2\jackson-dataformat-smile-2.10.2.jar;C:\Users\borkdude\.m2\repository\tigris\tigris\0.1.2\tigris-0.1.2.jar;C:\Users\borkdude\.m2\repository\javax\xml\bind\jaxb-api\2.3.0\jaxb-api-2.3.0.jar;C:\Users\borkdude\.m2\repository\org\msgpack\msgpack\0.6.
12\msgpack-0.6.12.jar;C:\Users\borkdude\.m2\repository\com\googlecode\json-simple\json-simple\1.1.1\json-simple-1.1.1.jar;C:\Users\borkdude\.m2\repository\org\javassist\javassist\3.18.1-GA\javassist-3.18.1-GA.jar

C:\Temp\buddy\pod-babashka-buddy>set /P FOO=<.cp1

C:\Temp\buddy\pod-babashka-buddy>echo %FOO%
src;C:\Users\borkdude\.gitlibs\libs\babashka\pods\22f200ef3006da90971e3bafa794985918b65fea\src;C:\Users\borkdude\.m2\repository\buddy\buddy-core\1.9.0\buddy-core-1.9.0.jar;C:\Users\borkdude\.m2\repository\com\cognitect\transit-clj\1.0.324\transit-clj-1.0.324.jar;C:\Users\
borkdude\.m2\repository\nrepl\bencode\1.1.0\bencode-1.1.0.jar;C:\Users\borkdude\.m2\repository\org\clojure\clojure\1.10.2-rc1\clojure-1.10.2-rc1.jar;C:\Users\borkdude\.m2\repository\cheshire\cheshire\5.10.0\cheshire-5.10.0.jar;C:\Users\borkdude\.m2\repository\commons-code
c\commons-codec\1.15\commons-codec-1.15.jar;C:\Users\borkdude\.m2\repository\org\bouncycastle\bcpkix-jdk15on\1.67\bcpkix-jdk15on-1.67.jar;C:\Users\borkdude\.m2\repository\org\bouncycastle\bcprov-jdk15on\1.67\bcprov-jdk15on-1.67.jar;C:\Users\borkdude\.m2\repository\com\cog
nitect\transit-java\1.0.343\transit-java-1.0.343.jar;C:\Users\borkdude\.m2\repository\org\clojure\core.specs.alpha\0.2.44\core.specs.alpha-0.2.44.jar;C:\Users\borkdude\.m2\repository\org\clojure\spec.alpha\0
Somehow the classpath is cut off.

Does anyone know what is happening here?

It seems it's being cut off at 1024

I'm going to work around this using an uberjar (depstar)

is this not the long classpath issue on windows? https://github.com/sogaiu/clj-pathing-jar

No, this time it's a limitation with environment variables on Windows.

As an experiment, try creating a file with one line with more than 1024 chars (without newlines)

and then: set /P FOO=<file.txt

and then: echo %FOO%

Fun. Now I'm getting:

main] INFO hf.depstar.uberjar - Compiling pod.babashka.buddy ...
Execution error at clojure.main/main (main.java:40).
Invalid token: C:
Full report at:
C:\Users\appveyor\AppData\Local\Temp\1\clojure-3649748013505680792.edn
[main] ERROR hf.depstar.uberjar - Compilation of pod.babashka.buddy failed!
This is my deps.edn:
{:deps {com.cognitect/transit-clj {:mvn/version "1.0.324"}
        buddy/buddy-core {:mvn/version "1.9.0"}
        nrepl/bencode {:mvn/version "1.1.0"}
        babashka/pods {:git/url ""
                       :sha "22f200ef3006da90971e3bafa794985918b65fea"}}
 :aliases {:uberjar
           {:replace-deps ; tool usage is new in 2.x
            {seancorfield/depstar {:mvn/version "2.0.161"}}
            :ns-default hf.depstar
            :exec-fn uberjar
            :exec-args {:jar pod-babashka-buddy.jar
                        :compile-ns [pod.babashka.buddy]}}
           :native {:jvm-opts ["-Dclojure.compiler.direct-linking=true"]
                    :extra-deps {org.clojure/clojure {:mvn/version "1.10.2-rc1"}}}}}

This might have to do with depstar shelling out and not quoting things properly on Windows. Are you aware of that issue @seancorfield? I fixed it in deps.clj: https://github.com/borkdude/deps.clj/blob/master/src/borkdude/deps.clj#L144-L155

If you want to reproduce on Windows, this is the code: https://github.com/babashka/pod-babashka-buddy

clojure -X:uberjar should do it

@borkdude I no longer attempt to use Clojure on Windows -- I use WSL2 instead. It seems like a lot of (pointless) work to try to workaround the many limitations of the old Windows shell environment 😞

@seancorfield This is just clojure.java.shell usage btw, not directly an issue in cmd.exe. It will manifest wherever you run Java on Windows

Oh, I saw the env var limit and thought you were talking about that.

Yes. I then worked around that issue by creating an uberjar in clojure.

But this fails using a quotation issue when shelling out with clojure.java.shell in depstar, at least, that is my suspicion

I have come across this issue many times, so I applied the fix in almost all of my libraries where I use clojure.java.shell

I can try a fork of your lib to see if this fixes the problem

Feel free to send a PR for depstar.

(I figure that way you'll have tested it works for you on Windows when using depstar 🙂 )

Will do the PR tomorrow, getting way too late here

Thanks!