<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Clojure Q&amp;A - Recent questions tagged tools.build</title>
<link>https://ask.clojure.org/index.php/tag/tools.build</link>
<description></description>
<item>
<title>How to access non-jar artifacts (aar, zip) downloaded via tools.deps in build.clj?</title>
<link>https://ask.clojure.org/index.php/14862/how-access-non-jar-artifacts-aar-downloaded-tools-deps-build</link>
<description>&lt;p&gt;I want to access an aar/zip artifact in build.clj that's already downloaded via deps.edn:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{:deps
 {com.newrelic.agent.android/android-agent {:local/root &quot;build/jars/android-agent.jar&quot;
                                            :doc        &quot;extracted from aar&quot;}
  com.newrelic.agent.java/newrelic-api     {:local/root &quot;build/jars/newrelic-api.jar&quot;
                                            :doc        &quot;extracted from newrelic-java.zip&quot;}}
 :aliases
 {:build {:deps       {io.github.clojure/tools.build            {:mvn/version &quot;0.10.11&quot;}
                       com.newrelic.agent.java/newrelic-java    {:mvn/version &quot;8.25.1&quot;
                                                                 :extension   &quot;zip&quot;}
                       com.newrelic.agent.android/android-agent {:mvn/version &quot;7.6.14&quot;
                                                                 :extension   &quot;aar&quot;}}
          :ns-default build}}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In build.clj I need to unpack this zip and extract a jar from it.&lt;br&gt;
And I don't have to hardcode .m2 paths or duplicate the version.&lt;/p&gt;
&lt;p&gt;How can it be done?&lt;/p&gt;
&lt;p&gt;See &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/clojure/tools.deps/blob/46661e929ab702d0ee532188edb58d06b39cef6c/src/main/clojure/clojure/tools/deps/extensions/maven.clj#L172&quot;&gt;https://github.com/clojure/tools.deps/blob/46661e929ab702d0ee532188edb58d06b39cef6c/src/main/clojure/clojure/tools/deps/extensions/maven.clj#L172&lt;/a&gt;&lt;/p&gt;
</description>
<category>tools.deps</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/14862/how-access-non-jar-artifacts-aar-downloaded-tools-deps-build</guid>
<pubDate>Wed, 24 Dec 2025 08:55:46 +0000</pubDate>
</item>
<item>
<title>tools.build compile-clj capture out/err</title>
<link>https://ask.clojure.org/index.php/14648/tools-build-compile-clj-capture-out-err</link>
<description>&lt;p&gt;When calling &lt;code&gt;compile-clj&lt;/code&gt;, a user can pass in &lt;code&gt;:out&lt;/code&gt; and &lt;code&gt;:err&lt;/code&gt; to capture the output of the compilation call. However, if for some reason the sub-process exits with a non-0, &lt;code&gt;compile-clj&lt;/code&gt; throws without returning that output, making it hard to know what went wrong. (see here: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/clojure/tools.build/blob/2d2f1b05fd84c3cc756221c17fcfb98034b4d65c/src/main/clojure/clojure/tools/build/tasks/compile_clj.clj#L120&quot;&gt;https://github.com/clojure/tools.build/blob/2d2f1b05fd84c3cc756221c17fcfb98034b4d65c/src/main/clojure/clojure/tools/build/tasks/compile_clj.clj#L120&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;I would find it helpful if the ex-data of the thrown exception included the &lt;code&gt;:out&lt;/code&gt; (variable &lt;code&gt;ps-out&lt;/code&gt; and &lt;code&gt;:err&lt;/code&gt; (variable &lt;code&gt;ps-err&lt;/code&gt;) from the &lt;code&gt;process/process&lt;/code&gt; call. Then I could have further insight into what went wrong.&lt;/p&gt;
</description>
<category>tools.build</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/14648/tools-build-compile-clj-capture-out-err</guid>
<pubDate>Mon, 28 Jul 2025 19:41:29 +0000</pubDate>
</item>
<item>
<title>`create-basis` silently accepts missing aliases</title>
<link>https://ask.clojure.org/index.php/14584/create-basis-silently-accepts-missing-aliases</link>
<description>&lt;p&gt;In &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/clojars/clojars-web/commit/baade8967c7be8abd9a9b27499c511efd41f6164&quot;&gt;this scenario&lt;/a&gt;, the alias for &lt;code&gt;create-basis&lt;/code&gt; was incorrect, preventing security deps overrides from being applied. For 2 years clojars was deployed with these vulnerable deps.&lt;/p&gt;
&lt;p&gt;In this case, I proposed &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/clojars/clojars-web/pull/906&quot;&gt;to inline the alias&lt;/a&gt; into &lt;code&gt;:deps&lt;/code&gt;. However there may be other scenarios where a tools.deps change might be helpful to catch these mistakes earlier, for example a warning or error.&lt;/p&gt;
</description>
<category>tools.deps</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/14584/create-basis-silently-accepts-missing-aliases</guid>
<pubDate>Tue, 10 Jun 2025 00:57:37 +0000</pubDate>
</item>
<item>
<title>How to ignore :src-pom default for clojure.tools.build.api/write-pom if ./pom.xml exists?</title>
<link>https://ask.clojure.org/index.php/13802/ignore-pom-default-for-clojure-tools-build-api-write-exists</link>
<description>&lt;p&gt;I have a project that generates more than one jar artifact. For project A, I have &lt;code&gt;./pom.xml&lt;/code&gt; that is used as a template and everything works fine.&lt;/p&gt;
&lt;p&gt;For project B, I want to generate a pom.xml that's completely separate from project A which does not use ./pom.xml as a template. I generate the pom as follows:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(require '[clojure.tools.build.api :as b])
(b/write-pom {:class-dir class-dir
                  :pom-data pom-data
                  :lib coord
                  :version version
                  :basis basis})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;However, since &lt;code&gt;./pom.xml&lt;/code&gt; exists, it is used as a template. Explicitly passing &lt;code&gt;nil&lt;/code&gt; for &lt;code&gt;:src-pom&lt;/code&gt; doesn't help. The only workaround I could find was to pass in a bogus path for &lt;code&gt;:src-pom&lt;/code&gt;.&lt;/p&gt;
</description>
<category>tools.build</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/13802/ignore-pom-default-for-clojure-tools-build-api-write-exists</guid>
<pubDate>Sun, 31 Mar 2024 20:50:22 +0000</pubDate>
</item>
<item>
<title>tools.build vs babashka as build tool</title>
<link>https://ask.clojure.org/index.php/13637/tools-build-vs-babashka-as-build-tool</link>
<description>&lt;p&gt;My understanding is that babashka is meant to be a fast startup clojure runtime, so they seem to work well together (borkdude already started porting tools.build to bb), but as I'm still a beginner, I wanted to understand how you folks think of those tools.&lt;/p&gt;
&lt;p&gt;When should I consider one over the other, aside from what babashka already states in its repo (prefer jvm clojure for long running scripts)?&lt;/p&gt;
&lt;p&gt;Thanks!&lt;/p&gt;
</description>
<category>Clojure</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/13637/tools-build-vs-babashka-as-build-tool</guid>
<pubDate>Mon, 22 Jan 2024 19:50:19 +0000</pubDate>
</item>
<item>
<title>Is tools.build considering adding a :license argument?</title>
<link>https://ask.clojure.org/index.php/13341/is-tools-build-considering-adding-a-license-argument</link>
<description>&lt;p&gt;Now that Clojars requires licenses, projects that need to go up there need a license block in the pom files of their jars. Using build.tools it's possible to create a pom.xml, manually edit it to include a license section, then create a jar using that pom. But, that's manual.&lt;/p&gt;
&lt;p&gt;Are there plans to add an option for &lt;code&gt;write-pom&lt;/code&gt; (and &lt;code&gt;gen-pom&lt;/code&gt;) to allow programmatic insertion of a license?&lt;/p&gt;
</description>
<category>Clojure CLI</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/13341/is-tools-build-considering-adding-a-license-argument</guid>
<pubDate>Fri, 29 Sep 2023 17:17:01 +0000</pubDate>
</item>
<item>
<title>tools.build.api/uber uses EDN for data_readers.cljc -- it should support reader conditionals</title>
<link>https://ask.clojure.org/index.php/12733/tools-build-datareaders-should-support-reader-conditionals</link>
<description>&lt;p&gt;The conflict handler for &lt;code&gt;data_readers.clj*&lt;/code&gt; treats the files as EDN when it reads them to merge them. This fails for &lt;code&gt;.cljc&lt;/code&gt; files containing reader conditionals:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;RuntimeException No dispatch macro for: ?
	clojure.lang.Util.runtimeException (Util.java:221)
	clojure.lang.EdnReader$DispatchReader.invoke (EdnReader.java:552)
	clojure.lang.EdnReader.readDelimitedList (EdnReader.java:757)
	clojure.lang.EdnReader$MapReader.invoke (EdnReader.java:680)
	clojure.lang.EdnReader.read (EdnReader.java:145)
	clojure.lang.EdnReader.read (EdnReader.java:111)
	clojure.lang.EdnReader.readString (EdnReader.java:67)
	clojure.edn/read-string (edn.clj:46)
	clojure.edn/read-string (edn.clj:37)
	clojure.edn/read-string (edn.clj:37)
	clojure.tools.build.tasks.uber/conflict-data-readers (uber.clj:89)
	clojure.tools.build.tasks.uber/conflict-data-readers (uber.clj:86)
&lt;/code&gt;&lt;/pre&gt;
</description>
<category>tools.build</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/12733/tools-build-datareaders-should-support-reader-conditionals</guid>
<pubDate>Tue, 07 Mar 2023 19:36:03 +0000</pubDate>
</item>
<item>
<title>Potential race condition in requiring-resolve?</title>
<link>https://ask.clojure.org/index.php/12346/potential-race-condition-in-requiring-resolve</link>
<description>&lt;p&gt;Hello! I've been using a few of the functions from &lt;code&gt;clojure.tools.build.api&lt;/code&gt; in a &lt;code&gt;future&lt;/code&gt; and I sporadically see this error...&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Execution error (IllegalStateException) at clojure.tools.build.api/create-basis (api.clj:154).
Attempting to call unbound fn: #'clojure.tools.build.tasks.create-basis/create-basis
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;From what I see in tools.build...&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(defn create-basis
  ([]
   ((requiring-resolve 'clojure.tools.build.tasks.create-basis/create-basis)))
  ([params]
   ((requiring-resolve 'clojure.tools.build.tasks.create-basis/create-basis) params)))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;...the code is only really using &lt;code&gt;requiring-resolve&lt;/code&gt; to execute another function. Diving deeper into &lt;code&gt;requiring-resolve&lt;/code&gt; I can see that the first call to &lt;code&gt;resolve&lt;/code&gt; is not synchronized with the same lock that the &lt;code&gt;serialized-require&lt;/code&gt; function uses...&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(defn- serialized-require
  [&amp;amp; args]
  (locking clojure.lang.RT/REQUIRE_LOCK
    (apply require args)))

(defn requiring-resolve
  [sym]
  (if (qualified-symbol? sym)
    (or (resolve sym)
        (do (-&amp;gt; sym namespace symbol serialized-require)
            (resolve sym)))
    (throw (IllegalArgumentException. (str &quot;Not a qualified symbol: &quot; sym)))))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;First, is it possible &lt;code&gt;requiring-resolve&lt;/code&gt; is actually returning &lt;code&gt;clojure.lang.Var$Unbound&lt;/code&gt; from the first call to &lt;code&gt;resolve&lt;/code&gt; when another thread is in the process of requiring that namespace via &lt;code&gt;serialized-require&lt;/code&gt;? Assuming so, should &lt;code&gt;tools.build&lt;/code&gt; (and I guess by extension most Clojure code) avoid using the &lt;code&gt;((requiring-resolve 'some-other/function))&lt;/code&gt; pattern? Is it possible &lt;code&gt;requiring-resolve&lt;/code&gt; could be modified to be thread safe?&lt;/p&gt;
&lt;p&gt;Thanks!&lt;/p&gt;
</description>
<category>Namespaces and vars</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/12346/potential-race-condition-in-requiring-resolve</guid>
<pubDate>Mon, 31 Oct 2022 05:20:05 +0000</pubDate>
</item>
<item>
<title>create-basis uses the wrong local maven repository</title>
<link>https://ask.clojure.org/index.php/12232/create-basis-uses-the-wrong-local-maven-repository</link>
<description>&lt;p&gt;I am attempting to build a Clojure project with numerous dependencies and contain everything into a single folder. The reason for doing this is because I will eventually build this software in an environment where I am not permitted to modify the home folder.&lt;/p&gt;
&lt;p&gt;The following command is being used&lt;br&gt;
&lt;code&gt;GITLIBS=/var/build/software/.gitlibs clojure -Srepro -Sdeps '{:mvn/local-repo &quot;/var/build/software/.m2/repository&quot;}' -T:build uber-aot&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;tools.deps is able to download all dependencies into the specified local repository. Once it's time for tools.build to run, I seem to get an error in the middle of a call to &lt;code&gt;b/create-basis&lt;/code&gt;. Here is what the error looks like.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Execution error (FileNotFoundException) at java.io.RandomAccessFile/open0 (RandomAccessFile.java:-2).
/home/user/.m2/repository/org/clojure/clojure/1.11.1/clojure-1.11.1.pom.part.lock (No such file or directory)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Is there any way to pass in the local Maven repository to tools.build? Preferably in the command line.&lt;/p&gt;
</description>
<category>Clojure CLI</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/12232/create-basis-uses-the-wrong-local-maven-repository</guid>
<pubDate>Sat, 24 Sep 2022 08:29:08 +0000</pubDate>
</item>
<item>
<title>tools.build git-process returns null when run on Windows.</title>
<link>https://ask.clojure.org/index.php/12196/tools-build-git-process-returns-null-when-run-on-windows</link>
<description>&lt;p&gt;I have this clojure code in my &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/djhaskin987/zic/blob/master/tools/build.clj#L7&quot;&gt;tools/build.clj&lt;/a&gt; file:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(ns build
  (:require [clojure.tools.build.api :as build]))
;; Get the number of commits reachable since the last tagged commit.
(def version
  (let [last-tag (build/git-process {:git-args &quot;describe --tags --abbrev=0&quot;})]
    (format &quot;%s.%s&quot;
            last-tag
            (build/git-process {:git-args
                                [&quot;rev-list&quot;
                                 (format &quot;%s..HEAD&quot;
                                         last-tag)
                                 &quot;--count&quot;]}))))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This sets the &lt;code&gt;version&lt;/code&gt; string to &lt;code&gt;null.null&lt;/code&gt; when run on Windows, but not when run on Linux. Thought you'd want to know.&lt;/p&gt;
</description>
<category>Clojure CLI</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/12196/tools-build-git-process-returns-null-when-run-on-windows</guid>
<pubDate>Sat, 10 Sep 2022 20:03:55 +0000</pubDate>
</item>
<item>
<title>Ability to customise java-cmd in tools.build</title>
<link>https://ask.clojure.org/index.php/12134/ability-to-customise-java-cmd-in-tools-build</link>
<description>&lt;p&gt;Moving the original &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojurians.slack.com/archives/C02B5GHQWP4/p1661625386101119&quot;&gt;question&lt;/a&gt; from Clojurians Slack:&lt;/p&gt;
&lt;p&gt;When moving one of my projects to JDK 19 I was pointing clojure to the jdk using the &lt;strong&gt;JAVA_CMD&lt;/strong&gt; env var. Everything was fine til I hit the uber jar step in the CI, where it simply refused to recognise the jdk 19 functions.&lt;/p&gt;
&lt;p&gt;Took me a while and including reading the tools.build source to realise why it wasn't propagating the &lt;strong&gt;JAVA_CMD&lt;/strong&gt; var and turns out I had to read env and send the &lt;strong&gt;:java_cmd&lt;/strong&gt; in the &lt;strong&gt;b/compile-clj&lt;/strong&gt; call.&lt;/p&gt;
&lt;p&gt;I can see why the behaviour is like this, but would &lt;strong&gt;:java_cmd&lt;/strong&gt; defaulting to the value of &lt;strong&gt;JAVA_CMD&lt;/strong&gt; something that could be considered? Feels a bit more intuitive for me, as mostly the invocations of tools.build fns would be from the shell.&lt;/p&gt;
</description>
<category>tools.build</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/12134/ability-to-customise-java-cmd-in-tools-build</guid>
<pubDate>Sat, 27 Aug 2022 20:54:32 +0000</pubDate>
</item>
<item>
<title>Exception in EdnReader$DispatchReader</title>
<link>https://ask.clojure.org/index.php/12017/exception-in-ednreaderdispatchreader</link>
<description>&lt;p&gt;(from &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojurians.slack.com/archives/C02B5GHQWP4/p1656165951371179&quot;&gt;https://clojurians.slack.com/archives/C02B5GHQWP4/p1656165951371179&lt;/a&gt;)&lt;br&gt;
When I include tick/tick {:mvn/version &quot;0.5.0-RC6&quot;} as a dep, I get the exception below.  I cannot reproduce in an deps.edn that only contains this library so I believe there is some kind of conflict with another library.  &lt;/p&gt;
&lt;p&gt;{:clojure.main/message&lt;br&gt;
 &quot;Execution error at clojure.tools.build.tasks.uber/conflict-data-readers (uber.clj:90).\nNo dispatch macro for: ?\n&quot;,&lt;br&gt;
 :clojure.main/triage&lt;br&gt;
 {:clojure.error/class java.lang.RuntimeException,&lt;br&gt;
  :clojure.error/line 90,&lt;br&gt;
  :clojure.error/cause &quot;No dispatch macro for: ?&quot;,&lt;br&gt;
  :clojure.error/symbol&lt;br&gt;
  clojure.tools.build.tasks.uber/conflict-data-readers,&lt;br&gt;
  :clojure.error/source &quot;uber.clj&quot;,&lt;br&gt;
  :clojure.error/phase :execution},&lt;br&gt;
 :clojure.main/trace&lt;br&gt;
 {:via&lt;br&gt;
  [{:type java.lang.RuntimeException,&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:message &quot;No dispatch macro for: ?&quot;,
:at [clojure.lang.Util runtimeException &quot;Util.java&quot; 221]}],
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;  :trace&lt;br&gt;
  [[clojure.lang.Util runtimeException &quot;Util.java&quot; 221]&lt;br&gt;
   [clojure.lang.EdnReader$DispatchReader invoke &quot;EdnReader.java&quot; 552]&lt;br&gt;
   [clojure.lang.EdnReader readDelimitedList &quot;EdnReader.java&quot; 757]&lt;br&gt;
   [clojure.lang.EdnReader$MapReader invoke &quot;EdnReader.java&quot; 680]&lt;br&gt;
   [clojure.lang.EdnReader read &quot;EdnReader.java&quot; 145]&lt;br&gt;
   [clojure.lang.EdnReader read &quot;EdnReader.java&quot; 111]&lt;br&gt;
   [clojure.lang.EdnReader readString &quot;EdnReader.java&quot; 67]&lt;br&gt;
   [clojure.edn$read_string invokeStatic &quot;edn.clj&quot; 46]&lt;br&gt;
   [clojure.edn$read_string invokeStatic &quot;edn.clj&quot; 37]&lt;br&gt;
   [clojure.edn$read_string invoke &quot;edn.clj&quot; 37]&lt;br&gt;
   [clojure.tools.build.tasks.uber$conflict_data_readers&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;invokeStatic
&quot;uber.clj&quot;
90]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;   [clojure.tools.build.tasks.uber$conflict_data_readers&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;invoke
&quot;uber.clj&quot;
86]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;   [clojure.tools.build.tasks.uber$handle_conflict&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;invokeStatic
&quot;uber.clj&quot;
120]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;   [clojure.tools.build.tasks.uber$handle_conflict&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;invoke
&quot;uber.clj&quot;
111]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;   [clojure.tools.build.tasks.uber$explode invokeStatic &quot;uber.clj&quot; 157]&lt;br&gt;
   [clojure.tools.build.tasks.uber$explode invoke &quot;uber.clj&quot; 137]&lt;br&gt;
   [clojure.tools.build.tasks.uber$uber$fn&lt;strong&gt;3537$fn&lt;/strong&gt;3541&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;invoke
&quot;uber.clj&quot;
253]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;   [clojure.lang.PersistentVector reduce &quot;PersistentVector.java&quot; 343]&lt;br&gt;
   [clojure.core$reduce invokeStatic &quot;core.clj&quot; 6885]&lt;br&gt;
   [clojure.core$reduce invoke &quot;core.clj&quot; 6868]&lt;br&gt;
   [clojure.tools.build.tasks.uber$uber$fn__3537 invoke &quot;uber.clj&quot; 252]&lt;br&gt;
   [clojure.core.protocols$iter_reduce invokeStatic &quot;protocols.clj&quot; 49]&lt;br&gt;
   [clojure.core.protocols$fn__8230 invokeStatic &quot;protocols.clj&quot; 75]&lt;br&gt;
   [clojure.core.protocols$fn__8230 invoke &quot;protocols.clj&quot; 75]&lt;br&gt;
   [clojure.core.protocols$fn&lt;strong&gt;8178$G&lt;/strong&gt;8173__8191&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;invoke
&quot;protocols.clj&quot;
13]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;   [clojure.core$reduce invokeStatic &quot;core.clj&quot; 6886]&lt;br&gt;
   [clojure.core$reduce invoke &quot;core.clj&quot; 6868]&lt;br&gt;
   [clojure.tools.build.tasks.uber$uber invokeStatic &quot;uber.clj&quot; 250]&lt;br&gt;
   [clojure.tools.build.tasks.uber$uber invoke &quot;uber.clj&quot; 237]&lt;br&gt;
   [clojure.lang.Var invoke &quot;Var.java&quot; 384]&lt;br&gt;
   [clojure.tools.build.api$uber invokeStatic &quot;api.clj&quot; 480]&lt;br&gt;
   [clojure.tools.build.api$uber invoke &quot;api.clj&quot; 408]&lt;br&gt;
   [org.corfield.build$uber invokeStatic &quot;build.clj&quot; 250]&lt;br&gt;
   [org.corfield.build$uber invoke &quot;build.clj&quot; 208]&lt;br&gt;
   [build$uber invokeStatic &quot;build.clj&quot; 14]&lt;br&gt;
   [build$uber invoke &quot;build.clj&quot; 12]&lt;br&gt;
   [clojure.lang.AFn applyToHelper &quot;AFn.java&quot; 154]&lt;br&gt;
   [clojure.lang.AFn applyTo &quot;AFn.java&quot; 144]&lt;br&gt;
   [clojure.lang.Var applyTo &quot;Var.java&quot; 705]&lt;br&gt;
   [clojure.core$apply invokeStatic &quot;core.clj&quot; 667]&lt;br&gt;
   [clojure.core$apply invoke &quot;core.clj&quot; 662]&lt;br&gt;
   [clojure.run.exec$exec invokeStatic &quot;exec.clj&quot; 48]&lt;br&gt;
   [clojure.run.exec$exec doInvoke &quot;exec.clj&quot; 39]&lt;br&gt;
   [clojure.lang.RestFn invoke &quot;RestFn.java&quot; 423]&lt;br&gt;
   [clojure.run.exec$_main$fn__205 invoke &quot;exec.clj&quot; 180]&lt;br&gt;
   [clojure.run.exec$_main invokeStatic &quot;exec.clj&quot; 176]&lt;br&gt;
   [clojure.run.exec$_main doInvoke &quot;exec.clj&quot; 139]&lt;br&gt;
   [clojure.lang.RestFn applyTo &quot;RestFn.java&quot; 137]&lt;br&gt;
   [clojure.lang.Var applyTo &quot;Var.java&quot; 705]&lt;br&gt;
   [clojure.core$apply invokeStatic &quot;core.clj&quot; 667]&lt;br&gt;
   [clojure.main$main_opt invokeStatic &quot;main.clj&quot; 514]&lt;br&gt;
   [clojure.main$main_opt invoke &quot;main.clj&quot; 510]&lt;br&gt;
   [clojure.main$main invokeStatic &quot;main.clj&quot; 664]&lt;br&gt;
   [clojure.main$main doInvoke &quot;main.clj&quot; 616]&lt;br&gt;
   [clojure.lang.RestFn applyTo &quot;RestFn.java&quot; 137]&lt;br&gt;
   [clojure.lang.Var applyTo &quot;Var.java&quot; 705]&lt;br&gt;
   [clojure.main main &quot;main.java&quot; 40]],&lt;br&gt;
  :cause &quot;No dispatch macro for: ?&quot;}}&lt;/p&gt;
</description>
<category>tools.build</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/12017/exception-in-ednreaderdispatchreader</guid>
<pubDate>Sat, 25 Jun 2022 16:32:02 +0000</pubDate>
</item>
<item>
<title>relative directories in classpath-roots</title>
<link>https://ask.clojure.org/index.php/11982/relative-directories-in-classpath-roots</link>
<description>&lt;p&gt;In the context of a monorepo containing several modules I have noticed an issue with &lt;code&gt;clojure.tools.build.api/compile-clj&lt;/code&gt; which is making difficult to compile files when the basis project root is not in the current directory.&lt;/p&gt;
&lt;p&gt;Here is a minimal scenario demonstrating the problem.&lt;/p&gt;
&lt;p&gt;I have a top-level monorepo &lt;code&gt;deps.edn&lt;/code&gt; using tools.build to prepare/package its modules&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; {:deps {monorepo/module-a {:local/root &quot;modules/a&quot;}}
 :aliases {:build {:deps {io.github.clojure/tools.build {:git/tag &quot;v0.8.2&quot;
                                                         :git/sha &quot;ba1a2bf&quot;}}
                   :ns-default build}}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Module A contains some clojure source files. Here is &lt;code&gt;modules/a/deps.edn&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{:paths [&quot;src&quot;]}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Those files require a compilation step. Here is the top-level &lt;code&gt;build.clj&lt;/code&gt; file expected to proccess those files.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(ns build
  (:require [clojure.tools.build.api :as b]))

(def module-a (binding [b/*project-root* &quot;modules/a&quot;]
                (b/create-basis {:project &quot;deps.edn&quot;})))

(defn compile-a [_]
  (b/compile-clj
   {:basis module-a
    :src-dirs [&quot;modules/a/src&quot;]
    :class-dir &quot;target/module-a/classes&quot;}))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;However when invoking &lt;code&gt;clojure -T:build compile-a&lt;/code&gt; from top-level directory I encounter the following error &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Execution error (FileNotFoundException) at user/eval136$fn (compile.clj:5).
Could not locate monorepo/module/a__init.class, monorepo/module/a.clj or monorepo/module/a.cljc on classpath.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The problem is that the  &quot;src&quot; relative directory is not expanded in the &lt;code&gt;:classpath-roots&lt;/code&gt; which lead &lt;code&gt;compile-clj&lt;/code&gt; to search source files in the wrong location. It is possible to work around the issue by  binding the &lt;code&gt;*project-root*&lt;/code&gt; again and adapting &lt;code&gt;:src-dirs&lt;/code&gt; and &lt;code&gt;class-dir&lt;/code&gt; relative to module A root directory like this&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(defn compile-a [_]
  (binding [b/*project-root* &quot;modules/a&quot;]
    (b/compile-clj
     {:basis module-a
      :src-dirs [&quot;src&quot;]
      :class-dir &quot;../../target/module-a/classes&quot;})))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;However IMO it would be better if the computed classpath in the basis was fully expanded by transforming relative paths into absolute ones to avoid this extra ceremony.&lt;/p&gt;
&lt;p&gt;What do you think?&lt;br&gt;
Is there a reason why relative source path directories are currently kept relative ?&lt;/p&gt;
</description>
<category>tools.build</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/11982/relative-directories-in-classpath-roots</guid>
<pubDate>Sun, 19 Jun 2022 16:50:53 +0000</pubDate>
</item>
<item>
<title>Can tools.build be configured to compile directly to project target?</title>
<link>https://ask.clojure.org/index.php/11905/can-tools-build-configured-compile-directly-project-target</link>
<description>&lt;p&gt;I’m hitting a performance bottleneck when AOT-compiling my large project with &lt;code&gt;clojure.tools.build.tasks.compile-clj/compile-clj&lt;/code&gt;. I narrowed the problem down to &lt;code&gt;clojure.tools.build.util.file/copy-contents&lt;/code&gt;, it spends about 5 minutes copying my roughly 35k class files from working directory to target/classes.&lt;/p&gt;
&lt;p&gt;We don't really need this indirection as we clean our &lt;code&gt;target&lt;/code&gt; folder each time we start the process, we would be fine with compiling directly to &lt;code&gt;target&lt;/code&gt;. Could that be introduced as an option?&lt;/p&gt;
</description>
<category>Clojure CLI</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/11905/can-tools-build-configured-compile-directly-project-target</guid>
<pubDate>Mon, 23 May 2022 21:38:43 +0000</pubDate>
</item>
<item>
<title>Files in deps :local/root :git/url will directly copy into uberjar without go through conflict-handlers</title>
<link>https://ask.clojure.org/index.php/11788/local-directly-uberjar-without-through-conflict-handlers</link>
<description>&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/clojure/tools.build/blob/1309f935b098123eb807c972a053eeab77f6f4cd/src/main/clojure/clojure/tools/build/tasks/uber.clj#L172&quot;&gt;https://github.com/clojure/tools.build/blob/1309f935b098123eb807c972a053eeab77f6f4cd/src/main/clojure/clojure/tools/build/tasks/uber.clj#L172&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The handling between jar and lib folders like git deps or local root are completely different. In my case, I have some config files in edn format (duct's duct_hierarchy.edn) exists in both jar deps and git deps. My additional conflict handler is never receiving the edn file that exists in git deps.&lt;/p&gt;
&lt;p&gt;Is it the expected behaviour? I can imagine that even &lt;strong&gt;LICENSE&lt;/strong&gt; or &lt;strong&gt;data_readers.clj&lt;/strong&gt; would suffer the same issue. e.g. being overrided by files in git deps.&lt;/p&gt;
</description>
<category>tools.build</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/11788/local-directly-uberjar-without-through-conflict-handlers</guid>
<pubDate>Fri, 22 Apr 2022 10:58:50 +0000</pubDate>
</item>
<item>
<title>(re-)building without internet access (with nix)</title>
<link>https://ask.clojure.org/index.php/11644/re-building-without-internet-access-with-nix</link>
<description>&lt;p&gt;When building something that depends on tools.build, I expect to be able to build once, which fetches all the required dependencies, and then build again without internet access.&lt;/p&gt;
&lt;p&gt;In particular, I'd like to be able to fetch all those dependencies separately and then build from inside a nix build.&lt;/p&gt;
&lt;p&gt;This works in clojure 1.10.3.855, but breaks in 1.10.3.933, and I'm not sure why.&lt;/p&gt;
&lt;p&gt;You can find a reproducible repo at &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/radvendii/clojure-tools.build-test&quot;&gt;https://github.com/radvendii/clojure-tools.build-test&lt;/a&gt;, with instructions in the readme.&lt;/p&gt;
</description>
<category>Clojure</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/11644/re-building-without-internet-access-with-nix</guid>
<pubDate>Fri, 18 Mar 2022 03:22:19 +0000</pubDate>
</item>
<item>
<title>Is it possible to set a var during compilation in tools.build?</title>
<link>https://ask.clojure.org/index.php/11610/is-it-possible-to-set-a-var-during-compilation-in-tools-build</link>
<description>&lt;p&gt;Specifically I'd like to set &lt;code&gt;clojure.test/*load-tests*&lt;/code&gt; to false, so that test code is excluded by the &lt;code&gt;clojure.test/deftest&lt;/code&gt;,&lt;code&gt;with-test&lt;/code&gt; etc. macro's. Lein provided injections as an escape hatch, tools.build doesn't seem to have an equivalent.&lt;/p&gt;
&lt;p&gt;Looking at the code, tools.build seems to compile code from a separate generated script in a temp file, which seems to make injections or wrappers impossible. Also couldn't find options to pass other than compiler options.&lt;/p&gt;
&lt;p&gt;A more in-depth description of this use case can be found on clojureverse: &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojureverse.org/t/require-import-inside-deftest/8644/3&quot;&gt;https://clojureverse.org/t/require-import-inside-deftest/8644/3&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Is there a solution or suggested workaround available?&lt;/p&gt;
</description>
<category>tools.build</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/11610/is-it-possible-to-set-a-var-during-compilation-in-tools-build</guid>
<pubDate>Mon, 28 Feb 2022 20:50:43 +0000</pubDate>
</item>
<item>
<title>tools.build/javac does not handle modules-info</title>
<link>https://ask.clojure.org/index.php/11428/tools-build-javac-does-not-handle-modules-info</link>
<description>&lt;p&gt;Attempting to compile a modular Java project will fail, reporting that it cannot not find the required modules.&lt;/p&gt;
&lt;p&gt;I fixed it by adding the module paths manually in &lt;code&gt;:javac-opts&lt;/code&gt;. Could tools.build handle this? Either by adding all the modules to the module path, or ignoring module-info.java and module-info.class. &lt;code&gt;tools.build/javac&lt;/code&gt; will also fail if there is a module-info.class in the classes directory and &lt;code&gt;tools.build/javac&lt;/code&gt; does not find the modules.&lt;/p&gt;
&lt;p&gt;Thank you.&lt;/p&gt;
</description>
<category>Tools</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/11428/tools-build-javac-does-not-handle-modules-info</guid>
<pubDate>Sun, 02 Jan 2022 15:54:15 +0000</pubDate>
</item>
<item>
<title>tools.build/jar doesn't support &quot;sections&quot; in manifest</title>
<link>https://ask.clojure.org/index.php/11358/tools-build-jar-doesnt-support-sections-in-manifest</link>
<description>&lt;p&gt;Sections are groups which start with &lt;code&gt;Name: &lt;/code&gt; and have section-specific entries in them.&lt;/p&gt;
&lt;p&gt;Capsule uses this for having platform-specific information about how to start.&lt;/p&gt;
&lt;p&gt;Here's an example of using the API to get section information:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Main-Class: clojure.main

Name: Frank
Main-Class: frank.clojure.main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;❯ clj       
Clojure 1.10.3
user=&amp;gt; (require '[clojure.java.io :as io])
nil
user=&amp;gt; (io/input-stream &quot;/tmp/MANIFEST.MF&quot;)
#object[java.io.BufferedInputStream 0x69ce2f62 &quot;java.io.BufferedInputStream@69ce2f62&quot;]
user=&amp;gt; (def mf (java.util.jar.Manifest. (io/input-stream &quot;/tmp/MANIFEST.MF&quot;)))
#'user/mf
user=&amp;gt; (.getAttributes mf &quot;Frank&quot;)
{#object[java.util.jar.Attributes$Name 0x2e3a5237 &quot;Main-Class&quot;] &quot;frank.clojure.main&quot;}
user=&amp;gt; (.getMainAttributes mf)
{#object[java.util.jar.Attributes$Name 0x2e3a5237 &quot;Main-Class&quot;] &quot;clojure.main&quot;}
user=&amp;gt; (.getEntries mf)
{&quot;Frank&quot; {#object[java.util.jar.Attributes$Name 0x2e3a5237 &quot;Main-Class&quot;] &quot;frank.clojure.main&quot;}}
&lt;/code&gt;&lt;/pre&gt;
</description>
<category>tools.build</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/11358/tools-build-jar-doesnt-support-sections-in-manifest</guid>
<pubDate>Sun, 05 Dec 2021 14:52:52 +0000</pubDate>
</item>
<item>
<title>tools.build copy-dir with replace loses file permissions</title>
<link>https://ask.clojure.org/index.php/11349/tools-build-copy-dir-with-replace-loses-file-permissions</link>
<description>&lt;p&gt;When you use &lt;code&gt;clojure.tools.build.api/copy-dir&lt;/code&gt; with &lt;code&gt;:replace&lt;/code&gt; it reads the source file and then writes a new target file -- it doesn't &quot;copy&quot; the file so the target file is created with default permissions.&lt;/p&gt;
&lt;p&gt;This is a problem if you are copying executable shell scripts and trying to replace text in them because the target file created &lt;em&gt;won't&lt;/em&gt; have executable permissions.&lt;/p&gt;
&lt;p&gt;This cropped up with &lt;code&gt;deps-new&lt;/code&gt; in this issue: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/seancorfield/deps-new/issues/22&quot;&gt;https://github.com/seancorfield/deps-new/issues/22&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I think that if you source file is executable, the target file should also be executable -- and that works fine without &lt;code&gt;:replace&lt;/code&gt;.&lt;/p&gt;
</description>
<category>tools.build</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/11349/tools-build-copy-dir-with-replace-loses-file-permissions</guid>
<pubDate>Fri, 03 Dec 2021 06:29:30 +0000</pubDate>
</item>
<item>
<title>Is it possible to build an uberwar using deps.edn using tools.build or other tool?</title>
<link>https://ask.clojure.org/index.php/11341/possible-build-uberwar-using-deps-using-tools-build-other-tool</link>
<description>&lt;p&gt;We have a small Clojure &amp;amp; ClojureScript web app running in Tomcat. The project managed to end up with a deps.edn for use with Shadow-cljs &amp;amp; lein for the backend to essentially build an uberwar. Is there a way to build an uberwar with tools-build or in some other way using deps.edn?&lt;/p&gt;
&lt;p&gt;Thanks for any pointers&lt;/p&gt;
&lt;p&gt;Cheers&lt;br&gt;
Daniel Sunnerek&lt;/p&gt;
</description>
<category>tools.build</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/11341/possible-build-uberwar-using-deps-using-tools-build-other-tool</guid>
<pubDate>Thu, 02 Dec 2021 13:22:01 +0000</pubDate>
</item>
<item>
<title>tools.build uber's default conflict handlers don't append to META-INF/services properly</title>
<link>https://ask.clojure.org/index.php/11316/tools-default-conflict-handlers-append-services-properly</link>
<description>&lt;p&gt;Our project has some dependencies that register parsers for various file formats via the java services framework.&lt;/p&gt;
&lt;p&gt;We’re using &lt;code&gt;b/uber&lt;/code&gt; and are finding some &lt;code&gt;META-INF/services/&lt;/code&gt; definitions are not correctly being appended.  &lt;/p&gt;
&lt;p&gt;I’ve chased this down to the regex in the default-handlers being &lt;code&gt;^META-INF/services/&lt;/code&gt; instead of something more like &lt;code&gt;^META-INF/services/.*&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The current regex would match under &lt;code&gt;re-find&lt;/code&gt;, but not under &lt;code&gt;re-matches&lt;/code&gt; which the implementation uses.&lt;/p&gt;
</description>
<category>tools.build</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/11316/tools-default-conflict-handlers-append-services-properly</guid>
<pubDate>Fri, 26 Nov 2021 17:29:12 +0000</pubDate>
</item>
<item>
<title>tools.build: are &quot;standard&quot; build tasks under consideration?</title>
<link>https://ask.clojure.org/index.php/11168/tools-build-are-standard-build-tasks-under-consideration</link>
<description>&lt;p&gt;What, if any, thought has been put into the idea of having &quot;standard&quot; build task names for tools.build-based builds?&lt;/p&gt;
&lt;p&gt;This could be in the form of actual code in tools.build (or a layer on top of it), or simply  an official, published convention.  At this stage I'm more interested in whether the general concept is on the radar and if so what it might look like, and less concerned with implementation specifics.&lt;/p&gt;
&lt;p&gt;This matters because while allowing authors to name their build tasks as they wish has some (small?) value to those authors, it results in a fragmented experience for the consumers of that build - a consumer cannot make any assumptions about each new tools.build based project they encounter that they wish to build themselves.&lt;/p&gt;
&lt;p&gt;While humans can introspect a build script to figure out how to operate it, that's a lot more difficult for downstream build-based automation; including (but not limited to) systems such as jitpack.io, Heroku, etc.&lt;/p&gt;
&lt;p&gt;Having started dabbling in tools.build, the current incarnation is feeling quite a bit like the Java build environment circa 2004 or so (right before Maven 1.0 was released).  At that time Apache Ant was the dominant build tool, and every single Ant build script was a special snowflake that forced consumers to spend time studying before they could be used effectively.  For all its substantial flaws, Maven 1.0 at least solved that one problem.  While comparing tools.build to Apache Ant is clearly a massive disservice in many ways (tools.build's scripting language, composability, and dependency management pieces are clearly light-eons ahead of anything Ant ever had), the lack of a well-defined &quot;interface&quot; into tools.build-based build scripts has given me a strong feeling of déjà vu...&lt;/p&gt;
</description>
<category>Tools</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/11168/tools-build-are-standard-build-tasks-under-consideration</guid>
<pubDate>Thu, 14 Oct 2021 21:40:27 +0000</pubDate>
</item>
<item>
<title>tools.build uber task fails when the dependency tree contains a dep which has no jar</title>
<link>https://ask.clojure.org/index.php/11156/tools-build-uber-task-fails-when-dependency-contains-which</link>
<description>&lt;p&gt;The &lt;code&gt;clojure.tools.build.api/uber&lt;/code&gt; task fails when the dependency tree contains a dep which has no jar.  &lt;/p&gt;
&lt;p&gt;A relatively minimal failing test case is the following tools.build task:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(ns build 
  (:require [clojure.tools.build.api :as b]))

(defn failing-uber [_]
    (b/uber {:class-dir &quot;classes&quot;
     :uber-file &quot;foo.jar&quot;
     :basis (b/create-basis {:project {:deps {'org.apache.jena/apache-jena-libs {:mvn/version &quot;4.2.0&quot; :extension &quot;pom&quot;} }}})})

(comment 
   (failing-uber {})
 )
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Evaluating the above function results in the following exception:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1. Unhandled clojure.lang.ExceptionInfo
   Unexpected lib file:
   /Users/rick/.m2/repository/org/apache/jena/apache-jena-libs/4.2.0/apache-jena-libs-4.2.0.pom
   {}
                  uber.clj:  182  clojure.tools.build.tasks.uber/explode
                  uber.clj:  141  clojure.tools.build.tasks.uber/explode
                  uber.clj:  257  clojure.tools.build.tasks.uber/uber/fn/fn
     PersistentVector.java:  343  clojure.lang.PersistentVector/reduce
                  core.clj: 6829  clojure.core/reduce
                  core.clj: 6812  clojure.core/reduce
                  uber.clj:  256  clojure.tools.build.tasks.uber/uber/fn
             protocols.clj:   49  clojure.core.protocols/iter-reduce
             protocols.clj:   75  clojure.core.protocols/fn
             protocols.clj:   75  clojure.core.protocols/fn
             protocols.clj:   13  clojure.core.protocols/fn/G
                  core.clj: 6830  clojure.core/reduce
                  core.clj: 6812  clojure.core/reduce
                  uber.clj:  254  clojure.tools.build.tasks.uber/uber
                  uber.clj:  241  clojure.tools.build.tasks.uber/uber
                  Var.java:  384  clojure.lang.Var/invoke
                   api.clj:  394  clojure.tools.build.api/uber
                   api.clj:  339  clojure.tools.build.api/uber
                      REPL:   21  build/eval25043
                      REPL:   21  build/eval25043
             Compiler.java: 7181  clojure.lang.Compiler/eval
             Compiler.java: 7136  clojure.lang.Compiler/eval
                  core.clj: 3202  clojure.core/eval
                  core.clj: 3198  clojure.core/eval
    interruptible_eval.clj:   87  nrepl.middleware.interruptible-eval/evaluate/fn/fn
                  AFn.java:  152  clojure.lang.AFn/applyToHelper
                  AFn.java:  144  clojure.lang.AFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 1977  clojure.core/with-bindings*
                  core.clj: 1977  clojure.core/with-bindings*
               RestFn.java:  425  clojure.lang.RestFn/invoke
    interruptible_eval.clj:   87  nrepl.middleware.interruptible-eval/evaluate/fn
                  main.clj:  437  clojure.main/repl/read-eval-print/fn
                  main.clj:  437  clojure.main/repl/read-eval-print
                  main.clj:  458  clojure.main/repl/fn
                  main.clj:  458  clojure.main/repl
                  main.clj:  368  clojure.main/repl
               RestFn.java:  137  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj:  662  clojure.core/apply
                regrow.clj:   20  refactor-nrepl.ns.slam.hound.regrow/wrap-clojure-repl/fn
               RestFn.java: 1523  clojure.lang.RestFn/invoke
    interruptible_eval.clj:   84  nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:   56  nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:  152  nrepl.middleware.interruptible-eval/interruptible-eval/fn/fn
                  AFn.java:   22  clojure.lang.AFn/run
               session.clj:  202  nrepl.middleware.session/session-exec/main-loop/fn
               session.clj:  201  nrepl.middleware.session/session-exec/main-loop
                  AFn.java:   22  clojure.lang.AFn/run
               Thread.java:  825  java.lang.Thread/run
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I believe this is because the above dependency has no corresponding jar file, and only contains a pom.xml which groups up a set of dependencies.&lt;/p&gt;
</description>
<category>tools.build</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/11156/tools-build-uber-task-fails-when-dependency-contains-which</guid>
<pubDate>Tue, 12 Oct 2021 14:00:42 +0000</pubDate>
</item>
<item>
<title>tools.build.api/copy-dir corrupts binary files if :replace is used</title>
<link>https://ask.clojure.org/index.php/11147/tools-build-api-copy-dir-corrupts-binary-files-replace-used</link>
<description>&lt;p&gt;Without a &lt;code&gt;:replace&lt;/code&gt; parameter, &lt;code&gt;b/copy-dir&lt;/code&gt; faithfully copies over any binary (and text) files in from the source directories.&lt;/p&gt;
&lt;p&gt;However, if a &lt;code&gt;:replace&lt;/code&gt; parameter is provided, then it corrupts any binary files when copying.  It does the replacement properly for any text files in the directories.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Repro:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a source dir &lt;code&gt;mysrc&lt;/code&gt;.  In that dir, place the file&lt;br&gt;
&lt;code&gt;cryogen.png&lt;/code&gt; from&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://raw.githubusercontent.com/cryogen-project/cryogen/master/src/leiningen/new/cryogen/img/cryogen.png&quot;&gt;https://raw.githubusercontent.com/cryogen-project/cryogen/master/src/leiningen/new/cryogen/img/cryogen.png&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Then run &lt;code&gt;(b/copy-dir :src-dirs [&quot;mysrc&quot;] :target-dir &quot;newdir&quot; :replace {&quot;&amp;lt;&amp;lt;name&amp;gt;&amp;gt;&quot; &quot;me&quot;})&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;cryogen.png&lt;/code&gt; in &lt;code&gt;newdir&lt;/code&gt; will be corrupted.&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>tools.build</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/11147/tools-build-api-copy-dir-corrupts-binary-files-replace-used</guid>
<pubDate>Sun, 10 Oct 2021 01:32:33 +0000</pubDate>
</item>
<item>
<title>tools.build's compile-clj does not allow setting jvm options</title>
<link>https://ask.clojure.org/index.php/11078/tools-builds-compile-clj-does-not-allow-setting-jvm-options</link>
<description>&lt;p&gt;I've a project that uses Malli with a custom default registry, a feature which requires the code be compiled with a certain jvm opt set &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/metosin/malli#changing-the-default-registry&quot;&gt;as is detailed in its documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It was suggested to me in &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/seancorfield/build-clj/issues/7#issuecomment-924524367&quot;&gt;this issue&lt;/a&gt; that this is currently not supported in tools.build's &lt;code&gt;compile-clj&lt;/code&gt; function. I'm posting here in the hopes this can be filed as a feature request so that I can eventually move this project to tools.build.&lt;/p&gt;
&lt;p&gt;Thanks.&lt;/p&gt;
</description>
<category>tools.build</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/11078/tools-builds-compile-clj-does-not-allow-setting-jvm-options</guid>
<pubDate>Wed, 22 Sep 2021 14:03:32 +0000</pubDate>
</item>
<item>
<title>Add git-branch function</title>
<link>https://ask.clojure.org/index.php/11072/add-git-branch-function</link>
<description>&lt;p&gt;This is useful for deciding whether to issue a SNAPSHOT release or not.&lt;/p&gt;
&lt;p&gt;Here's a working implementation if anyone wants it for their project now:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(ns build
  (:require [clojure.string :as str]
            [clojure.tools.build.api :as b]
            [clojure.tools.build.api.specs :as specs]))

(defn git-branch
  &quot;Shells out to git and returns the current branch
    git branch --show-current
  Options:
    :dir - dir to invoke this command from, by default current directory&quot;
  [{:keys [dir] :or {dir &quot;.&quot;} :as params}]
  (@#'b/assert-specs &quot;git-branch&quot; params :dir ::specs/path)
  (-&amp;gt; {:command-args [&quot;git&quot; &quot;branch&quot; &quot;--show-current&quot;]
       :dir (.getPath (b/resolve-path dir))
       :out :capture}
    b/process
    :out
    str/trim))

(def lib 'my-group/my-lib)

(def version
  (if (= &quot;master&quot; (git-branch nil))
    (format &quot;1.0.%s&quot; (b/git-count-revs nil))
    (format &quot;1.0.%s-SNAPSHOT&quot; (b/git-count-revs nil))))
&lt;/code&gt;&lt;/pre&gt;
</description>
<category>tools.build</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/11072/add-git-branch-function</guid>
<pubDate>Mon, 20 Sep 2021 22:31:14 +0000</pubDate>
</item>
<item>
<title>Should tools.build functions respect with-dir (from tools.deps.alpha)?</title>
<link>https://ask.clojure.org/index.php/11027/should-tools-build-functions-respect-with-from-tools-alpha</link>
<description>&lt;p&gt;I ran across this issue with &lt;code&gt;depstar&lt;/code&gt; but observed that &lt;code&gt;tools.build&lt;/code&gt; behaves the same, possibly incorrect, way.&lt;/p&gt;
&lt;p&gt;See &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/seancorfield/with-dir-repro&quot;&gt;https://github.com/seancorfield/with-dir-repro&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you wrap &lt;code&gt;(b/create-basis ..)&lt;/code&gt; in &lt;code&gt;with-dir&lt;/code&gt; from &lt;code&gt;tools.deps.alpha&lt;/code&gt;, it calculates the basis from the &lt;code&gt;deps.edn&lt;/code&gt; file in the context of the &lt;code&gt;with-dir&lt;/code&gt; location.&lt;/p&gt;
&lt;p&gt;However, if you use that basis with &lt;code&gt;tools.build&lt;/code&gt; functions, they do not behave correctly -- even if they are also wrapped in the same &lt;code&gt;with-dir&lt;/code&gt; context.&lt;/p&gt;
&lt;p&gt;The dependencies come from the project &lt;code&gt;deps.edn&lt;/code&gt; (Clojure 1.9.0 in this example) but the &lt;code&gt;src&lt;/code&gt; used is from the root of the repo, not from the project folder.&lt;/p&gt;
&lt;p&gt;This is counter-intuitive (and took me a while to track down with &lt;code&gt;depstar&lt;/code&gt; -- where I definitely consider it to be a bug).&lt;/p&gt;
</description>
<category>tools.build</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/11027/should-tools-build-functions-respect-with-from-tools-alpha</guid>
<pubDate>Wed, 08 Sep 2021 22:02:10 +0000</pubDate>
</item>
<item>
<title>tools.build.api/git-count-revs should support rev-lists path argument</title>
<link>https://ask.clojure.org/index.php/10958/tools-build-api-count-revs-should-support-lists-path-argument</link>
<description>&lt;p&gt;Given a monorepo it's useful to have git-count-revs return only the revs affecting a particular folder.&lt;/p&gt;
&lt;p&gt;Ie:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cd mymonorepo/service-a
$ git rev-list HEAD --count
1024 # all revs in monorepo
$ git rev-list HEAD --count -- .
17 # only count revs affecting service-a
&lt;/code&gt;&lt;/pre&gt;
</description>
<category>Tools</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/10958/tools-build-api-count-revs-should-support-lists-path-argument</guid>
<pubDate>Sun, 22 Aug 2021 10:20:03 +0000</pubDate>
</item>
<item>
<title>tools.build.api/write-pom does not expose generated pom's filename</title>
<link>https://ask.clojure.org/index.php/10956/tools-build-api-write-pom-does-expose-generated-poms-filename</link>
<description>&lt;p&gt;&lt;code&gt;tools.build.api/write-pom&lt;/code&gt; writes a pom.xml file, but does not expose the file name.&lt;/p&gt;
&lt;p&gt;Many tools that deploy to Clojars/Maven Central/etc. expect to be passed the name of a pom.xml file. For example &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/clj-commons/pomegranate/blob/41ccbf9e20a5a82680133b7438443da45de8db2d/src/main/clojure/cemerick/pomegranate/aether.clj#L403&quot;&gt;cemerick.pomegranate.aether/deploy&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/slipset/deps-deploy/blob/b4359c5d67ca002d9ed0c4b41b710d7e5a82e3bf/src/deps_deploy/deps_deploy.clj#L207&quot;&gt;deps-deploy.deps-deploy/deploy&lt;/a&gt; expect a &lt;code&gt;:pom-file&lt;/code&gt; argument.&lt;/p&gt;
&lt;p&gt;This leads to hard-coding this filename, for example in &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/seancorfield/next-jdbc/blob/5992c8d9bb25760519e02cd6a91739291f2c1e6c/deps.edn#L55&quot;&gt;next-jdbc deps.edn&lt;/a&gt;, or re-calculating it, as in &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/mainej/f-form/blob/f36bef6e4330167e4f9387436f02c647a98233db/dev/build.clj#L19&quot;&gt;f-form dev/build.clj&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Would it be possible for tools.build to expose either the &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/clojure/tools.build/blob/d3008e159eb2afbc4b0019e1d36cf20e1129c394/src/main/clojure/clojure/tools/build/tasks/write_pom.clj#L236&quot;&gt;pom directory&lt;/a&gt; or &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/clojure/tools.build/blob/d3008e159eb2afbc4b0019e1d36cf20e1129c394/src/main/clojure/clojure/tools/build/tasks/write_pom.clj#L237&quot;&gt;pom filename&lt;/a&gt;, to facilitate the integration of builds and deploys?&lt;/p&gt;
</description>
<category>Tools</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/10956/tools-build-api-write-pom-does-expose-generated-poms-filename</guid>
<pubDate>Sat, 21 Aug 2021 21:01:23 +0000</pubDate>
</item>
<item>
<title>How to control the transient deps that get compiled/assembled into an uberjar?</title>
<link>https://ask.clojure.org/index.php/10905/control-transient-deps-that-compiled-assembled-into-uberjar</link>
<description>&lt;p&gt;I am having trouble understanding how to control the contents of an uberjar using &lt;code&gt;tools.build&lt;/code&gt;. In this scenario, the runtime environment (a Spark cluster) provides some deps and thus those deps should not be in the uberjar. Let's say I have 2 classpaths (represented as aliases):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;:compile&lt;/code&gt; The classpath with all deps/classes that are required for compilation. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;:uber&lt;/code&gt; The classpath with only the deps/classes that should be in the final jar. &lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In theory, if you take the &lt;code&gt;:compile&lt;/code&gt; classpath and subtract the &lt;code&gt;:uber&lt;/code&gt; classpath, we should get the set of classes that are provided by the runtime environment. &lt;/p&gt;
&lt;p&gt;Consider the following simplified dependency graph:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://mermaid.ink/img/eyJjb2RlIjoiZ3JhcGggTFJcbiAgICBwcm9qW215LnByb2plY3QvYXBwXSAtLT4gc3FsXG4gICAgcHJvaltteS5wcm9qZWN0L2FwcF0gLS0-IGNvcmVcbiAgICBwcm9qW215LnByb2plY3QvYXBwXSAtLT4gc2NhbGFcbiAgICBwcm9qW215LnByb2plY3QvYXBwXSAtLT4gb3RoZXJbc29tZS5vdGhlci9kZXBdXG4gICAgb3RoZXIgLS0-IHRyYW5zW3NvbWUudHJhbnNpZW50L2RlcF1cbiAgICBzcWxbb3JnLmFwYWNoZS5zcGFyay9zcWxdIC0tPiBjb3JlXG4gICAgY29yZVtvcmcuYXBhY2hlLnNwYXJrL2NvcmVdIC0tPiBhcGFjaGVbb3JnLmFwYWNoZS5jb21tb25zLypdXG4gICAgY29yZVtvcmcuYXBhY2hlLnNwYXJrL2NvcmVdIC0tPiBzY2FsYVtvcmcuc2NhbGEtbGFuZy9zY2FsYS1saWJyYXJ5XVxuICAgXG4gICAgc3R5bGUgc3FsIGZpbGw6I0ZGRlxuICAgIHN0eWxlIGNvcmUgZmlsbDojRkZGXG4gICAgc3R5bGUgc2NhbGEgZmlsbDojRkZGXG4gICAgc3R5bGUgYXBhY2hlIGZpbGw6I0ZGRiIsIm1lcm1haWQiOnsidGhlbWUiOiJkZWZhdWx0In0sInVwZGF0ZUVkaXRvciI6ZmFsc2UsImF1dG9TeW5jIjp0cnVlLCJ1cGRhdGVEaWFncmFtIjpmYWxzZX0&quot; alt=&quot;dep graph&quot;&gt;&lt;/p&gt;
&lt;p&gt;We only need the blue deps to be in the jar. The white &quot;provided&quot; deps need to be used during compilation but should not be in the final uberjar. &lt;/p&gt;
&lt;p&gt;I looked into using the &lt;code&gt;:filter-nses&lt;/code&gt; option of &lt;code&gt;compile-clj&lt;/code&gt; but it creates problems with transient deps.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If we filter to only &lt;code&gt;my.project&lt;/code&gt; we will lose the important deps of &lt;code&gt;some.other/dep&lt;/code&gt; and &lt;code&gt;some.transient/dep&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If we filter to exclude &lt;code&gt;org.apache&lt;/code&gt; (not possible with &lt;code&gt;:filter-nses&lt;/code&gt;, but in theory it could be done) we would still have &lt;code&gt;org.scala-lang/scala-library&lt;/code&gt; hanging around.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also experimented using different calls to &lt;code&gt;create-basis&lt;/code&gt; during compile and jar building. I'm not sure if that makes any sense.&lt;/p&gt;
&lt;p&gt;Is it possible to leverage the dependency graph to control either 1) what gets compiled or 2) which classes get put into an uberjar? Any advice would be much appreciated.&lt;/p&gt;
</description>
<category>tools.build</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/10905/control-transient-deps-that-compiled-assembled-into-uberjar</guid>
<pubDate>Thu, 05 Aug 2021 16:36:31 +0000</pubDate>
</item>
<item>
<title>create-basis/java-command do not handle :jvm-opts</title>
<link>https://ask.clojure.org/index.php/10894/create-basis-java-command-do-not-handle-jvm-opts</link>
<description>&lt;p&gt;I have a &lt;code&gt;:test&lt;/code&gt; alias in my project, which includes &lt;code&gt;:jvm-opts&lt;/code&gt; (as well as &lt;code&gt;:extra-paths&lt;/code&gt; and &lt;code&gt;:extra-deps&lt;/code&gt;). I call &lt;code&gt;tools.build.api/create-basis&lt;/code&gt; with &lt;code&gt;{:aliases [:test]}&lt;/code&gt; and then pass that basis to &lt;code&gt;tools.build.api/java-command&lt;/code&gt; but that doesn't include those JVM options.&lt;/p&gt;
&lt;p&gt;In order to pick up those JVM options, I needed to do this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(defn run-tests
  [_]
  (let [basis    (b/create-basis {:aliases [:test]})
        combined (t/combine-aliases basis [:test])
        cmds     (b/java-command {:basis     basis
                                  :java-opts (:jvm-opts combined)
                                  :main      'clojure.main
                                  :main-args [&quot;-m&quot; &quot;cognitect.test-runner&quot;]})
        {:keys [exit]} (b/process cmds)]
    (when-not (zero? exit)
      (throw (ex-info &quot;Tests failed&quot; {})))))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(so I have to use &lt;code&gt;tools.deps.alpha/combine-aliases&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Is this expected? Should this be easier?&lt;/p&gt;
</description>
<category>Tools</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/10894/create-basis-java-command-do-not-handle-jvm-opts</guid>
<pubDate>Tue, 03 Aug 2021 04:31:20 +0000</pubDate>
</item>
<item>
<title>tools.build.api/write-pom does not update scm&gt;tag</title>
<link>https://ask.clojure.org/index.php/10893/tools-build-api-write-pom-does-not-update-scm-tag</link>
<description>&lt;p&gt;Although &lt;code&gt;write-pom&lt;/code&gt; updates the &lt;code&gt;&amp;lt;version&amp;gt;&lt;/code&gt; field in the &lt;code&gt;pom.xml&lt;/code&gt;, it does not attempt to update the &lt;code&gt;&amp;lt;scm&amp;gt;&amp;lt;tag&amp;gt;&lt;/code&gt; field. How should folks deal with that tag field when using &lt;code&gt;tools.build&lt;/code&gt;?&lt;/p&gt;
</description>
<category>Tools</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/10893/tools-build-api-write-pom-does-not-update-scm-tag</guid>
<pubDate>Tue, 03 Aug 2021 03:41:09 +0000</pubDate>
</item>
<item>
<title>tools.build create-basis cannot use alias that includes tools.deps.alpha</title>
<link>https://ask.clojure.org/index.php/10852/tools-build-create-basis-cannot-alias-includes-tools-alpha</link>
<description>&lt;p&gt;If you try to call &lt;code&gt;create-basis&lt;/code&gt; with an alias that involves &lt;code&gt;tools.deps.alpha&lt;/code&gt;, you get the following exception:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Execution error (ExceptionInfo) at clojure.tools.deps.alpha.extensions.maven/get-artifact (maven.clj:133).
Could not find artifact org.clojure:tools.deps.alpha:jar:${project.version} in central (https://repo1.maven.org/maven2/)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is because &lt;code&gt;tools.build&lt;/code&gt; includes a source version of &lt;code&gt;deps.edn&lt;/code&gt; with that string, instead of a version number:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./tools.build/src/main/resources/clojure/tools/deps/deps.edn
    :deps {:extra-deps {org.clojure/tools.deps.alpha {:mvn/version &quot;${project.version}&quot;}}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here's the minimal repro: in an otherwise empty directory:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;;; deps.edn 
{:aliases
 {:build
  {:deps {io.github.clojure/tools.build {:git/tag &quot;v0.1.6&quot; :git/sha &quot;5636e61&quot;}}
   :ns-default build}}}

;; build.clj 
(ns build
  (:require [clojure.tools.build.api :as b]))

(defn bug [_]
  (b/create-basis {:aliases [:deps]}))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then run:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;clojure -T:build bug
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Given that &lt;code&gt;tools.build&lt;/code&gt; already explicitly depends on t.d.a as follows, I don't understand why it also needs a copy of t.d.a's &lt;code&gt;deps.edn&lt;/code&gt; source in in the &lt;code&gt;resources&lt;/code&gt; tree?&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;org.clojure/tools.deps.alpha {:mvn/version &quot;0.12.1003&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Removing that file from the checked out &lt;code&gt;tools.build&lt;/code&gt; (under &lt;code&gt;~/.gitlibs/libs&lt;/code&gt;) seems to solve the problem and doesn't &lt;em&gt;appear&lt;/em&gt; to break anything else...&lt;/p&gt;
</description>
<category>tools.build</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/10852/tools-build-create-basis-cannot-alias-includes-tools-alpha</guid>
<pubDate>Mon, 26 Jul 2021 23:38:47 +0000</pubDate>
</item>
<item>
<title>What does &quot;Manifest type :jar not loaded when finding deps ...&quot; mean?</title>
<link>https://ask.clojure.org/index.php/10831/what-does-manifest-type-jar-not-loaded-when-finding-deps-mean</link>
<description>&lt;p&gt;I have a jar that I created from one of my projects using &lt;code&gt;tools.build&lt;/code&gt;. I have included it has a &lt;code&gt;:local/root&lt;/code&gt; dep in a different project but get the following error whenever I invoke &lt;code&gt;clj&lt;/code&gt; with the jar on the classpath.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Error building classpath. Manifest type :jar not loaded when finding deps for io.github.erp12/clark-scala in coordinate {:local/root &quot;/Users/eddie/Projects/Software/clark/clark-scala/target/clark-scala-2.12.13.1.jar&quot;, :deps/manifest :jar, :deps/root &quot;/Users/eddie/Projects/Software/clark/clark-scala/target/clark-scala-2.12.13.1.jar&quot;, :parents #{[]}, :paths [&quot;/Users/eddie/Projects/Software/clark/clark-scala/target/clark-scala-2.12.13.1.jar&quot;]}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This error message helps identify which dep (and in this case, which exact jar file) is causing the problem, but I don't know if there is any information in there that could help identify the cause problem. Am I missing the way to interpret this exception? Are there any common causes of this?&lt;/p&gt;
</description>
<category>tools.build</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/10831/what-does-manifest-type-jar-not-loaded-when-finding-deps-mean</guid>
<pubDate>Sun, 18 Jul 2021 06:16:17 +0000</pubDate>
</item>
</channel>
</rss>