Skip to content

Conversation

@ikappaki
Copy link
Contributor

HI,

could you please consider a workaround for the prod-cli build step failing on Windows during CI integration test setup?

The issue seems to stem from babashka.deps/clojure, which builds the uberjar. On Windows, it occasionally fails to download dependencies due to an AccessDeniedException when renaming a temporary file during the downloads. The exact cause is unclear, but pre downloading some of the dependencies using the clojure CLI directly appears to avoidthe problem.

stack trace of the error:

{:clojure.main/message
 "Execution error (AccessDeniedException) at sun.nio.fs.WindowsException/translateToIOException (WindowsException.java:89).\r\nC:\\Users\\ikappaki\\.m2\\repository\\io\\opentelemetry\\opentelemetry-exporter-common\\1.54.1\\_remote.repositories.12805229861750152054.tmp -> C:\\Users\\ikappaki\\.m2\\repository\\io\\opentelemetry\\opentelemetry-exporter-common\\1.54.1\\_remote.repositories\r\n",
 :clojure.main/triage
 {:clojure.error/class java.nio.file.AccessDeniedException,
  :clojure.error/line 89,
  :clojure.error/cause
  "C:\\Users\\ikappaki\\.m2\\repository\\io\\opentelemetry\\opentelemetry-exporter-common\\1.54.1\\_remote.repositories.12805229861750152054.tmp -> C:\\Users\\ikappaki\\.m2\\repository\\io\\opentelemetry\\opentelemetry-exporter-common\\1.54.1\\_remote.repositories",
  :clojure.error/symbol
  sun.nio.fs.WindowsException/translateToIOException,
  :clojure.error/source "WindowsException.java",
  :clojure.error/phase :execution},
 :clojure.main/trace
 {:via
  [{:type java.io.UncheckedIOException,
    :message
    "java.nio.file.AccessDeniedException: C:\\Users\\ikappaki\\.m2\\repository\\io\\opentelemetry\\opentelemetry-exporter-common\\1.54.1\\_remote.repositories.12805229861750152054.tmp -> C:\\Users\\ikappaki\\.m2\\repository\\io\\opentelemetry\\opentelemetry-exporter-common\\1.54.1\\_remote.repositories",
    :at
    [org.eclipse.aether.internal.impl.DefaultTrackingFileManager
     update
     "DefaultTrackingFileManager.java"
     121]}
   {:type java.nio.file.AccessDeniedException,
    :message
    "C:\\Users\\ikappaki\\.m2\\repository\\io\\opentelemetry\\opentelemetry-exporter-common\\1.54.1\\_remote.repositories.12805229861750152054.tmp -> C:\\Users\\ikappaki\\.m2\\repository\\io\\opentelemetry\\opentelemetry-exporter-common\\1.54.1\\_remote.repositories",
    :at
    [sun.nio.fs.WindowsException
     translateToIOException
     "WindowsException.java"
     89]}],
  :trace
  [[sun.nio.fs.WindowsException
    translateToIOException
    "WindowsException.java"
    89]
   [sun.nio.fs.WindowsException
    rethrowAsIOException
    "WindowsException.java"
    103]
   [sun.nio.fs.WindowsFileCopy move "WindowsFileCopy.java" 317]
   [sun.nio.fs.WindowsFileSystemProvider
    move
    "WindowsFileSystemProvider.java"
    293]
   [java.nio.file.Files move "Files.java" 1432]
   [org.eclipse.aether.util.FileUtils$2 move "FileUtils.java" 121]
   [org.eclipse.aether.util.FileUtils writeFile "FileUtils.java" 192]
   [org.eclipse.aether.util.FileUtils writeFile "FileUtils.java" 152]
   [org.eclipse.aether.internal.impl.DefaultTrackingFileManager
    update
    "DefaultTrackingFileManager.java"
    108]
   [org.eclipse.aether.internal.impl.EnhancedLocalRepositoryManager
    addRepo
    "EnhancedLocalRepositoryManager.java"
    274]
   [org.eclipse.aether.internal.impl.EnhancedLocalRepositoryManager
    addArtifact
    "EnhancedLocalRepositoryManager.java"
    252]
   [org.eclipse.aether.internal.impl.EnhancedLocalRepositoryManager
    add
    "EnhancedLocalRepositoryManager.java"
    225]
   [org.eclipse.aether.internal.impl.DefaultArtifactResolver
    evaluateDownloads
    "DefaultArtifactResolver.java"
    680]
   [org.eclipse.aether.internal.impl.DefaultArtifactResolver
    performDownloads
    "DefaultArtifactResolver.java"
    592]
   [org.eclipse.aether.internal.impl.DefaultArtifactResolver
    resolve
    "DefaultArtifactResolver.java"
    478]
   [org.eclipse.aether.internal.impl.DefaultArtifactResolver
    resolveArtifacts
    "DefaultArtifactResolver.java"
    278]
   [org.eclipse.aether.internal.impl.DefaultArtifactResolver
    resolveArtifact
    "DefaultArtifactResolver.java"
    255]
   [org.apache.maven.repository.internal.DefaultArtifactDescriptorReader
    loadPom
    "DefaultArtifactDescriptorReader.java"
    240]
   [org.apache.maven.repository.internal.DefaultArtifactDescriptorReader
    readArtifactDescriptor
    "DefaultArtifactDescriptorReader.java"
    171]
   [org.eclipse.aether.internal.impl.DefaultRepositorySystem
    readArtifactDescriptor
    "DefaultRepositorySystem.java"
    286]
   [clojure.tools.deps.extensions.maven$read_descriptor
    invokeStatic
    "maven.clj"
    115]
   [clojure.tools.deps.extensions.maven$read_descriptor
    invoke
    "maven.clj"
    106]
   [clojure.tools.deps.extensions.maven$eval1707$fn__1708
    invoke
    "maven.clj"
    146]
   [clojure.lang.MultiFn invoke "MultiFn.java" 244]
   [clojure.tools.deps$expand_deps$children_task__1266$fn__1268$fn__1269
    invoke
    "deps.clj"
    416]
   [clojure.lang.AFn applyToHelper "AFn.java" 152]
   [clojure.lang.AFn applyTo "AFn.java" 144]
   [clojure.core$apply invokeStatic "core.clj" 667]
   [clojure.core$with_bindings_STAR_ invokeStatic "core.clj" 1990]
   [clojure.core$with_bindings_STAR_ doInvoke "core.clj" 1990]
   [clojure.lang.RestFn invoke "RestFn.java" 428]
   [clojure.lang.AFn applyToHelper "AFn.java" 156]
   [clojure.lang.RestFn applyTo "RestFn.java" 135]
   [clojure.core$apply invokeStatic "core.clj" 671]
   [clojure.core$bound_fn_STAR_$fn__5837 doInvoke "core.clj" 2020]
   [clojure.lang.RestFn invoke "RestFn.java" 400]
   [clojure.lang.AFn call "AFn.java" 18]
   [java.util.concurrent.FutureTask run "FutureTask.java" 264]
   [java.util.concurrent.ThreadPoolExecutor
    runWorker
    "ThreadPoolExecutor.java"
    1136]
   [java.util.concurrent.ThreadPoolExecutor$Worker
    run
    "ThreadPoolExecutor.java"
    635]
   [java.lang.Thread run "Thread.java" 833]],
  :cause
  "C:\\Users\\ikappaki\\.m2\\repository\\io\\opentelemetry\\opentelemetry-exporter-common\\1.54.1\\_remote.repositories.12805229861750152054.tmp -> C:\\Users\\ikappaki\\.m2\\repository\\io\\opentelemetry\\opentelemetry-exporter-common\\1.54.1\\_remote.repositories"}}


  • I added a entry in changelog under unreleased section.

@ericdallo
Copy link
Member

Awesome! this error was pissing me off for some time in clojure-lsp as well

FYI @borkdude about babashka not downloading the deps, I saw that multiple times already.

@ericdallo ericdallo merged commit 6ad9077 into editor-code-assistant:master Oct 30, 2025
9 checks passed
@borkdude
Copy link

@ikappaki @ericdallo Please create a repro in babashka or deps.clj. Not sure why/where it uses temp files. Perhaps during the installation of the tools jar?

@borkdude
Copy link

No, it's not that. The stack trace shows tools.deps usage. If you can repro this using deps.clj please let me know.

@ikappaki
Copy link
Contributor Author

ikappaki commented Oct 30, 2025

Just a quick update. It is babashka.deps/clojure that shells out to the clojure CLI (1), which runs build.clj/aot-jar (2). That calls clojure.tools.build.api/create-basis, where the exception is thrown inside org.eclipse.aether.internal.impl/update shown below, from aether's DefaultTrackingFileManager class (3). It appears to me this is likely an aether issue rather than something happening in the clojure ecosystem. It's defenitely not a babashka.deps shelling condittion issue, because i can reproduce it outside of it.

    @Override
073    public Properties update(File file, Map<String, String> updates) {
074        Properties props = new Properties();
075
076        try {
077            Files.createDirectories(file.getParentFile().toPath());
078        } catch (IOException e) {
079            LOGGER.warn("Failed to create tracking file parent '{}'", file, e);
080            throw new UncheckedIOException(e);
081        }
082
083        synchronized (getMutex(file)) {
084            try (RandomAccessFile raf = new RandomAccessFile(file, "rw");
085                    FileLock unused = fileLock(raf.getChannel(), Math.max(1, raf.length()), false)) {
086                if (raf.length() > 0) {
087                    byte[] buffer = new byte[(int) raf.length()];
088                    raf.readFully(buffer);
089                    props.load(new ByteArrayInputStream(buffer));
090                }
091
092                for (Map.Entry<String, String> update : updates.entrySet()) {
093                    if (update.getValue() == null) {
094                        props.remove(update.getKey());
095                    } else {
096                        props.setProperty(update.getKey(), update.getValue());
097                    }
098                }
099
100                LOGGER.debug("Writing tracking file '{}'", file);
101                ByteArrayOutputStream stream = new ByteArrayOutputStream(1024 * 2);
102                props.store(
103                        stream,
104                        "NOTE: This is a Maven Resolver internal implementation file"
105                                + ", its format can be changed without prior notice.");
106                raf.seek(0L);
107                raf.write(stream.toByteArray());
108                raf.setLength(raf.getFilePointer());
109            } catch (IOException e) {
110                LOGGER.warn("Failed to write tracking file '{}'", file, e);
111                throw new UncheckedIOException(e);
112            }
113        }
114
115        return props;
116    }

(1):

java "-XX:-OmitStackTraceInFastThrow" "-Dclojure.basis=.cpcache\\B5DF661B23A3C0074648F59E0423B4DC.basis" "-classpath" "resources;.;C:\\Users\\ikappaki\\.m2\\repository\\babashka\\fs\\0.5.22\\fs-0.5.22.jar;C:\\Users\\ikappaki\\.m2\\repository\\babashka\\process\\0.6.23\\process-0.6.23.jar;C:\\Users\\ikappaki\\.m2\\repository\\ch\\qos\\logback\\logback-classic\\1.4.14\\logback-classic-1.4.14.jar;C:\\Users\\ikappaki\\.m2\\repository\\com\\github\\ericdallo\\deps-bin\\1.0.0\\deps-bin-1.0.0.jar;C:\\Users\\ikappaki\\.gitlibs\\libs\\io.github.clojure\\tools.build\\573711ea65f7d324a6a6cdd3ac20cb30bba47e48\\src\\main\\clojure;C:\\Users\\ikappaki\\.gitlibs\\libs\\io.github.clojure\\tools.build\\573711ea65f7d324a6a6cdd3ac20cb30bba47e48\\src\\main\\resources;C:\\Users\\ikappaki\\.m2\\repository\\org\\clojure\\clojure\\1.12.0\\clojure-1.12.0.jar;...;C:\\Users\\ikappaki\\.m2\\repository\\org\\codehaus\\plexus\\plexus-container-default\\1.0-alpha-9-stable-1\\plexus-container-default-1.0-alpha-9-stable-1.jar;C:\\Users\\ikappaki\\.m2\\repository\\org\\clojure\\core.cache\\1.1.234\\core.cache-1.1.234.jar;C:\\Users\\ikappaki\\.m2\\repository\\classworlds\\classworlds\\1.1-alpha-2\\classworlds-1.1-alpha-2.jar;C:\\Users\\ikappaki\\.m2\\repository\\junit\\junit\\3.8.1\\junit-3.8.1.jar;C:\\Users\\ikappaki\\.m2\\repository\\org\\clojure\\data.priority-map\\1.2.0\\data.priority-map-1.2.0.jar;C:\\Users\\ikappaki\\scoop\\apps\\clj-deps\\current\\exec.jar" "clojure.main" "-m" "clojure.run.exec" "prod-cli"

(2):

eca/build.clj

Lines 25 to 39 in 6969f56

(defn ^:private aot-jar [opts]
(clean opts)
(println "Building uberjar...")
(let [basis (b/create-basis (update basis :aliases concat (:extra-aliases opts)))
src-dirs (into ["src" "resources"] (:extra-dirs opts))]
(b/copy-dir {:src-dirs src-dirs
:target-dir class-dir})
(b/compile-clj {:basis basis
:src-dirs src-dirs
:java-opts ["-server"]
:class-dir class-dir})
(b/uber {:class-dir class-dir
:uber-file file
:main 'eca.main
:basis basis})))

(3): https://maven.apache.org/resolver-archives/resolver-1.9.22/apidocs/src-html/org/eclipse/aether/internal/impl/DefaultTrackingFileManager.html

@ikappaki
Copy link
Contributor Author

ikappaki commented Nov 2, 2025

Likely a clojure.tools.build issue. Minimal repro: https://github.com/ikappaki/issue-clj-create-basis
. Reported to the Clojure team with https://clojure.atlassian.net/browse/TBUILD-47.

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

Successfully merging this pull request may close these issues.

3 participants