clj-on-windows

For those interested in making clj on Windows https://dev.clojure.org/jira/browse/TDEPS-67. Also see https://github.com/littleli/scoop-clojure.
borkdude 2020-12-27T22:20:30.136900Z

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.

borkdude 2020-12-27T22:20:48.137200Z

Does anyone know what is happening here?

borkdude 2020-12-27T22:32:38.137400Z

It seems it's being cut off at 1024

borkdude 2020-12-27T22:43:27.137800Z

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

2020-12-27T23:05:07.138300Z

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

borkdude 2020-12-27T23:07:42.138800Z

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

borkdude 2020-12-27T23:08:12.139300Z

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

borkdude 2020-12-27T23:08:25.139800Z

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

borkdude 2020-12-27T23:08:31.140Z

and then: echo %FOO%

borkdude 2020-12-27T23:13:08.140500Z

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 "<https://github.com/babashka/pods>"
                       :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"}}}}}

borkdude 2020-12-27T23:17:24.141200Z

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

borkdude 2020-12-27T23:18:25.141800Z

(I apply the same fix in babashka.process: https://github.com/babashka/process/blob/ac1219508857d4b3106e5a7999a3573c61c7aa63/src/babashka/process.clj#L101)

borkdude 2020-12-27T23:19:32.142900Z

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

borkdude 2020-12-27T23:19:49.143500Z

clojure -X:uberjar should do it

seancorfield 2020-12-27T23:20:22.143900Z

@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 😞

borkdude 2020-12-27T23:21:50.144900Z

@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

seancorfield 2020-12-27T23:22:13.145400Z

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

borkdude 2020-12-27T23:22:35.146200Z

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

borkdude 2020-12-27T23:22:58.146900Z

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

borkdude 2020-12-27T23:23:22.147700Z

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

borkdude 2020-12-27T23:24:14.148500Z

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

seancorfield 2020-12-27T23:24:20.148700Z

Feel free to send a PR for depstar.

seancorfield 2020-12-27T23:24:58.149300Z

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

borkdude 2020-12-27T23:27:03.149500Z

will do!

borkdude 2020-12-27T23:33:11.149800Z

FWIW, yes, that fixed it! https://github.com/borkdude/depstar/commit/70ce150dfd3072f8f7ffbad21233139b3cde388d

borkdude 2020-12-27T23:38:30.150500Z

Will do the PR tomorrow, getting way too late here

seancorfield 2020-12-27T23:39:01.150700Z

Thanks!