clojure

2026-05-11T11:07:49.446349Z

Anyone else having issues with Maven? When I run any clj command that downloads Maven deps, I'm constantly seeing:

32.63 Execution error (ExceptionInfo) at clojure.tools.deps.extensions.maven/get-artifact (maven.clj:167).
32.63 Could not find artifact com.cognitect:transit-java:jar:1.0.362 in central ()
32.63
32.63 Full report at:
32.63 /tmp/clojure-16319045093576206687.edn
I checked that the particular transit-java version https://repo1.maven.org/maven2/com/cognitect/transit-java/1.0.362/. This happens locally, in Github Actions and in CircleCI. I'm wondering if I'm hitting a rate limit or what. I'm not sure how to debug. Any ideas?

βž• 3
Alex Miller (Clojure team) 2026-05-11T12:07:35.942429Z

Can you attach the referenced full report too?

amar 2026-05-11T12:15:39.570499Z

Yes I've been experiencing the same issue for different dependencies on different runs. Has been happening at least since yesterday. I can't get it to reproduce locally. Only in GCP's Cloud Build. It's a bit challenging but I'll see if I can get a full report.

amar 2026-05-11T12:19:43.471459Z

Actually just got the error to happen locally when running clojure -Spom small excerpt:

Downloading: com/google/cloud/google-cloud-vision/3.90.0/google-cloud-vision-3.90.0.jar from central
Downloading: com/github/steffan-westcott/clj-otel-sdk-extension-autoconfigure/0.2.10/clj-otel-sdk-extension-autoconfigure-0.2.10.jar from clojars
Downloading: slingshot/slingshot/0.12.2/slingshot-0.12.2.jar from clojars
Error building classpath. Could not find artifact org.eclipse.jetty.websocket:jetty-websocket-jetty-api:jar:12.1.8 in central ()

amar 2026-05-11T12:22:11.429189Z

Just ran it again, same error

clojure -Spom
Error building classpath. Could not find artifact org.eclipse.jetty.websocket:jetty-websocket-jetty-api:jar:12.1.8 in central ()

amar 2026-05-11T12:24:09.485589Z

ran one more time and it ran successfully

dazld 2026-05-11T12:29:19.774539Z

also seeing build failures in CircleCI - similar maven problems

Error building classpath. Could not find artifact jfree:jcommon:jar:1.0.15 in central ()
seems non deterministic which dep fails

2026-05-11T12:29:30.327059Z

I can get it reproduced almost always when I nuke ~/.m2 so that it downloads everything

2026-05-11T12:30:32.889939Z

@alexmiller

Full report at:
/var/folders/0p/vtdv4p053pd6gkx8d5p98h000000gn/T/clojure-8824913635048931549.edn
➜  cat /var/folders/0p/vtdv4p053pd6gkx8d5p98h000000gn/T/clojure-8824913635048931549.edn

{:clojure.main/message
 "Execution error (ExceptionInfo) at clojure.tools.deps.extensions.maven/get-artifact (maven.clj:167).\nCould not find artifact com.cognitect:transit-java:jar:1.0.362 in central ()\n",
 :clojure.main/triage
 {:clojure.error/class clojure.lang.ExceptionInfo,
  :clojure.error/line 167,
  :clojure.error/cause
  "Could not find artifact com.cognitect:transit-java:jar:1.0.362 in central ()",
  :clojure.error/symbol
  clojure.tools.deps.extensions.maven/get-artifact,
  :clojure.error/source "maven.clj",
  :clojure.error/phase :execution},
 :clojure.main/trace
 {:via
  [{:type clojure.lang.ExceptionInfo,
    :message
    "Could not find artifact com.cognitect:transit-java:jar:1.0.362 in central ()",
    :data
    {:lib com.cognitect/transit-java,
     :coord
     {:mvn/version "1.0.362",
      :exclusions #{org.clojure/clojure},
      :deps/manifest :mvn,
      :dependents [org.clojure/clojurescript],
      :parents #{[org.clojure/clojurescript]}}},
    :at
    [clojure.tools.deps.extensions.maven$get_artifact
     invokeStatic
     "maven.clj"
     167]}],
  :trace
  [[clojure.tools.deps.extensions.maven$get_artifact
    invokeStatic
    "maven.clj"
    167]
   [clojure.tools.deps.extensions.maven$get_artifact
    invoke
    "maven.clj"
    155]
   [clojure.tools.deps.extensions.maven$eval1237$fn__1240
    invoke
    "maven.clj"
    178]
   [clojure.lang.MultiFn invoke "MultiFn.java" 244]
   [clojure.tools.deps$download_libs$fn__814$fn__815
    invoke
    "deps.clj"
    477]
   [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__5839 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" 317]
   [java.util.concurrent.ThreadPoolExecutor
    runWorker
    "ThreadPoolExecutor.java"
    1144]
   [java.util.concurrent.ThreadPoolExecutor$Worker
    run
    "ThreadPoolExecutor.java"
    642]
   [java.lang.Thread run "Thread.java" 1583]],
  :cause
  "Could not find artifact com.cognitect:transit-java:jar:1.0.362 in central ()",
  :data
  {:lib com.cognitect/transit-java,
   :coord
   {:mvn/version "1.0.362",
    :exclusions #{org.clojure/clojure},
    :deps/manifest :mvn,
    :dependents [org.clojure/clojurescript],
    :parents #{[org.clojure/clojurescript]}}}}}

dazld 2026-05-11T12:36:49.933099Z

fwiw, adding the google central mirror to :mvn/repos seems to have cleared our builds.

"google-maven-central-mirror" {:url ""}

πŸ™ 3
2026-05-11T12:40:25.586319Z

Same here, I switched to google mirror and can confirm it works

βž• 3
roklenarcic 2026-05-11T19:27:49.936109Z

you just add this to mvn/repos?

roklenarcic 2026-05-11T19:28:13.521439Z

or do you need to somehow disable/remove the default one?

2026-05-11T19:36:34.097909Z

@roklenarcic Add it in your deps.edn file. It should look something like this:

{:paths ["src"]

 :aliases
 {,,,}

 :deps
 {,,,}

 :mvn/repos
 {"google-central" {:url ""}}}

roklenarcic 2026-05-11T19:37:46.139179Z

thanks

Alex Miller (Clojure team) 2026-05-11T19:39:36.175299Z

FYI, Maven itself supports mirrors explicitly, and tools.deps will use those https://maven.apache.org/guides/mini/guide-mirror-settings.html

Alex Miller (Clojure team) 2026-05-11T19:39:49.591009Z

you then don't need to modify your deps.edn at all

seancorfield 2026-05-16T17:40:58.885229Z

Ran into this myself this morning. We use BitBucket Pipelines at work, and it keeps a Maven cache... but it deletes the cache every few weeks so it gets rebuilt fresh with whatever new dependencies you have then... and of course, 429. Thanks for the pointer to the Google Central mirror -- that got me past it!

MIJOTHY 2026-05-12T15:00:54.217279Z

we were discussing the same in #leiningen FYI https://clojurians.slack.com/archives/C0AB48493/p1778381725840669

dvorme 2026-05-12T18:18:19.865589Z

I'm having the same problem. Sonatype's rate limiting is so aggressive that a single-threaded invocation of the clojure cli (e.g.: clojure -Sthreads 1 ...) can't download all my dependencies for a single build (with a fresh .m2 cache). And I don't have that many top-level dependencies! My firm seems to be blocked from the Google Maven mirror mentioned previously in this thread, so that workaround doesn't work for me. Has anyone figured out a workaround? @alexmiller More generally, it seems that Clojure's Maven resolver needs to honor the Retry-After: header in the 429 response, pause that amount of time, and then retry--rather than aborting? Or are there reasons this won't work?

Alex Miller (Clojure team) 2026-05-12T18:29:04.777309Z

Clojure uses the official Maven libraries for access

Alex Miller (Clojure team) 2026-05-12T18:29:16.694609Z

so that's not even something I control

2026-05-12T19:05:16.778789Z

This might be a good time to revisit whether there's a way to let deps.edn express a repository ordering like you can in a maven config xml. I think Maven always searches in listing order and since deps.edn is a map there's no way to express the ordering in a deterministic way

2026-05-12T19:05:33.097959Z

I could be 100% wrong about that though

Alex Miller (Clojure team) 2026-05-12T19:22:05.383659Z

no, that's correct. but also, it is hardcoded to always check maven central first, then clojars, then user specified repos

Alex Miller (Clojure team) 2026-05-12T19:22:30.195909Z

Maven mirrors and proxies are both supported and the recommended way to "swap out" the Maven central location though

Alex Miller (Clojure team) 2026-05-12T19:26:17.559979Z

there are https://maven.apache.org/resolver/configuration.html that might be useful, specifically, messing with the aether.transport.http.... ones. You can get these to take effect in the Clojure CLI by setting the env var CLJ_JVM_OPTS ala:

export CLJ_JVM_OPTS=aether.transport.http.retryHandler.interval=10000
(default is 5000 ms)

Alex Miller (Clojure team) 2026-05-12T19:26:39.186399Z

I've also opened a support case with sonatype to see if there's more info to glean

❀️ 5
2026-05-12T22:17:49.489739Z

I believe that tools.deps' usage of the maven resolver already honors the Retry-After: header, and retries (based on my testing)

2026-05-12T22:51:45.357489Z

Nope, I lied. I had tested lein from main, not tools.deps. Lein does honor retry-after, but I'm not sure what triggers that. It's using pomegranate without any special settings, and pomegranate doesn't seem to have anything special to enable it.

dvorme 2026-05-12T22:56:14.929369Z

Thanks Alex. For reference, my data points are: β€’ Unsurprising: A CI build in company infra; likely competing with other builds using Maven libraries on the same virtualized/NAT'd IP address. β€’ Surprising: A local build, after disconnecting from the VPN, after mv .m2 .m2.backup fails!

2026-05-12T22:58:14.537849Z

@dvorme I think the limit is really low; I can trigger it easily from my local machine if I have a project with a moderate amount of deps and I remove .m2/repository/.

πŸ‘ 1
Alex Miller (Clojure team) 2026-05-12T22:59:54.645569Z

Both lein and tools.deps are using the same maven lib so it would be surprising if they did not behave similarly

πŸ‘ 1
2026-05-13T00:02:58.035009Z

This is 100% a you're holding it wrong problem on our end, but we managed to befuddle ourselves for a bit by replacing central with the Google mirror and then having a bunch of builds fail because they were using delaguardo/setup-clojure with cli:latest. This would then blow up when we'd run -T commands because: β€’ the root deps.edn inside the clojure.tools.deps.edn we got with the latest CLI points to 1.12.5 as of today β€’ make-classpath2 (correctly) ignores your local :deps when you're setting up to run a -T command, but doesn't ignore your local :repos key β€’ the Google mirror didn't actually have the Clojure 1.12.5 jar yet, so the dep fetching phase failed Our fault, no fix needed. Only mentioning it in case someone else has the same brief confusing "wait, but all of my deps.edns are asking for Clojure 1.12.4" moment we did.

2026-05-13T00:43:04.752169Z

@alexmiller That was my expectation as well, but they do behave differently. lein blocks and retries, tools.deps throws an exception immediately:

$ clojure -M:deps
Error building classpath. Failed to read artifact descriptor for org.clojure:tools.deps.cli:jar:0.15.131
org.eclipse.aether.resolution.ArtifactDescriptorException: Failed to read artifact descriptor for org.clojure:tools.deps.cli:jar:0.15.131
        at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom(DefaultArtifactDescriptorReader.java:255)
        at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.readArtifactDescriptor(DefaultArtifactDescriptorReader.java:171)
        at org.eclipse.aether.internal.impl.DefaultRepositorySystem.readArtifactDescriptor(DefaultRepositorySystem.java:263)
        at clojure.tools.deps.extensions.maven$read_descriptor.invokeStatic(maven.clj:115)
        at clojure.tools.deps.extensions.maven$fn__1340.invokeStatic(maven.clj:143)
        at clojure.tools.deps.extensions.maven$fn__1340.invoke(maven.clj:143)
        at clojure.lang.MultiFn.invoke(MultiFn.java:244)
        at clojure.tools.deps$expand_deps$children_task__959$fn__961$fn__962.invoke(deps.clj:299)
        at clojure.lang.AFn.applyToHelper(AFn.java:152)
        at clojure.lang.AFn.applyTo(AFn.java:144)
        at clojure.core$apply.invokeStatic(core.clj:667)
        at clojure.core$with_bindings_STAR_.invokeStatic(core.clj:1990)
        at clojure.core$with_bindings_STAR_.doInvoke(core.clj:1990)
        at clojure.lang.RestFn.invoke(RestFn.java:428)
        at clojure.lang.AFn.applyToHelper(AFn.java:156)
        at clojure.lang.RestFn.applyTo(RestFn.java:135)
        at clojure.core$apply.invokeStatic(core.clj:671)
        at clojure.core$bound_fn_STAR_$fn__5839.doInvoke(core.clj:2020)
        at clojure.lang.RestFn.invoke(RestFn.java:400)
        at clojure.lang.AFn.call(AFn.java:18)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:328)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
        at java.base/java.lang.Thread.run(Thread.java:1474)
Caused by: org.eclipse.aether.resolution.ArtifactResolutionException: Could not transfer artifact org.clojure:tools.deps.cli:pom:0.15.131 from/to central (): status code: 429, reason phrase: Too Many Requests (429)
        at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:431)
        at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts(DefaultArtifactResolver.java:235)
        at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifact(DefaultArtifactResolver.java:212)
        at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom(DefaultArtifactDescriptorReader.java:240)
        ... 23 more
Caused by: org.eclipse.aether.transfer.ArtifactTransferException: Could not transfer artifact org.clojure:tools.deps.cli:pom:0.15.131 from/to central (): status code: 429, reason phrase: Too Many Requests (429)
        at org.eclipse.aether.connector.basic.ArtifactTransportListener.transferFailed(ArtifactTransportListener.java:52)
        at org.eclipse.aether.connector.basic.BasicRepositoryConnector$TaskRunner.run(BasicRepositoryConnector.java:401)
        at org.eclipse.aether.util.concurrency.RunnableErrorForwarder.lambda$wrap$0(RunnableErrorForwarder.java:73)
        at org.eclipse.aether.connector.basic.BasicRepositoryConnector$DirectExecutor.execute(BasicRepositoryConnector.java:669)
        at org.eclipse.aether.connector.basic.BasicRepositoryConnector.get(BasicRepositoryConnector.java:290)
        at org.eclipse.aether.internal.impl.DefaultArtifactResolver.performDownloads(DefaultArtifactResolver.java:520)
        at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:408)
        ... 26 more
Caused by: org.apache.http.client.HttpResponseException: status code: 429, reason phrase: Too Many Requests (429)
        at org.eclipse.aether.transport.http.HttpTransporter.handleStatus(HttpTransporter.java:541)
        at org.eclipse.aether.transport.http.HttpTransporter.execute(HttpTransporter.java:363)
        at org.eclipse.aether.transport.http.HttpTransporter.implGet(HttpTransporter.java:294)
        at org.eclipse.aether.spi.connector.transport.AbstractTransporter.get(AbstractTransporter.java:72)
        at org.eclipse.aether.connector.basic.BasicRepositoryConnector$GetTaskRunner.runTask(BasicRepositoryConnector.java:496)
        at org.eclipse.aether.connector.basic.BasicRepositoryConnector$TaskRunner.run(BasicRepositoryConnector.java:396)
        ... 31 more

1
Alex Miller (Clojure team) 2026-05-13T14:21:32.973549Z

good to know. sonatype responded and indeed there are some rate limits that are being ratcheted down right now. sounds like maybe the lack of setting user agent may be contributing in CLI, but I'm talking to them. @tcrawley I will really like to intro you to the sonatype folks too - they have a repository consortium and it would be great to have clojars involved in that I think

dvorme 2026-05-13T17:22:39.892529Z

Thanks for the update @alexmiller!!!

2026-05-13T20:08:42.900599Z

@alexmiller I'd love an introduction, thanks! I'll DM you.

Alex Miller (Clojure team) 2026-05-13T21:14:55.180499Z

They've updated the 429 page in response to my requests with more info https://central.sonatype.org/faq/429-error/

Alex Miller (Clojure team) 2026-05-13T21:36:42.911119Z

I think the 429 handling is down to a consequence of http client and which version of the Maven transporters is in use. there are of course, complications. :)

Alex Miller (Clojure team) 2026-05-28T18:53:25.976319Z

please try the new version of the Clojure CLI (dev only at the moment), without the Maven mirror if you have a chance https://clojurians.slack.com/archives/C06MAR553/p1779993239724119

seancorfield 2026-05-28T19:16:15.729749Z

Yup, tried 1654 with all the caches blown away and the mirror removed. Success.

2026-05-11T13:37:23.206919Z

Hi everybody, I'm trying to call a method which I can call directly but no by reflection, in which case I get :

Execution error (IllegalAccessException) at jdk.internal.reflect.Reflection/newIllegalAccessException (Reflection.java:394).
class clojure.lang.Reflector cannot access a member of ... with modifiers "public"
I see it has been asked before but I'm confused if I'm missing somthing or this is still an issue. Repl example in the 🧡...

βœ… 1
2026-05-11T13:38:48.609699Z

clj -Sdeps '{:deps {org.apache.logging.log4j/log4j-core {:mvn/version "2.25.4"} commons-logging/commons-logging {:mvn/version "1.3.6"}}}'
Clojure 1.12.4

user=> (import '[org.apache.commons.logging Log LogFactory])

user=> (def logger (LogFactory/getLog ""))

user=> (.trace logger "Hello world") ;; works fine

;; Now call trace via reflection. We get the method
user=> (def mm (.getDeclaredMethod (class logger) "trace" (into-array Class [Object])))

user=> mm ;; methods says public
#object[java.lang.reflect.Method 0x59c33386 "public void org.apache.commons.logging.impl.Log4jApiLogFactory$Log4j2Log.trace(java.lang.Object)"]

;; but can't be called
user=> (.invoke mm ^Log logger (to-array ["Hello world"]))

Execution error (IllegalAccessException) at jdk.internal.reflect.Reflection/newIllegalAccessException (Reflection.java:394).
class clojure.lang.Reflector cannot access a member of class org.apache.commons.logging.impl.Log4jApiLogFactory$Log4j2Log with modifiers "public"

Alex Miller (Clojure team) 2026-05-11T13:51:31.504299Z

You're checking methods on the log impl class but calling through the Log interface (I think) and those are distinct. The former may be running into module visibility access for invocation (does not prevent reflective information access)

Alex Miller (Clojure team) 2026-05-11T13:52:35.911549Z

Have you tried pulling the method from Log instead?

2026-05-11T13:53:07.886569Z

> You're checking methods on the log impl class but calling through the Log interface (I think) and those are distinct you mean because of the ^Log hint? I added that just to see if it helped

2026-05-11T13:53:56.640489Z

> Have you tried pulling the method from Log instead? no, can try that

Alex Miller (Clojure team) 2026-05-11T13:54:51.995119Z

It's a common pattern to have a public interface and a non module visible implementation class - you must then go through the public interface’s method

2026-05-11T13:54:52.847009Z

that seams to work

2026-05-11T13:54:59.817999Z

thanks!!

arohner 2026-05-11T15:02:34.825969Z

A couple of months ago there was a layer cake chart that illustrated code written in Clojure 1.0 and whether it survived or was replaced, and then Clojure 1.1, 1.2, etc. Where can I find it?

ghadi 2026-05-11T15:07:25.408979Z

it's in the history paper https://clojure.org/about/history

dpsutton 2026-05-11T15:07:30.108059Z

page 26

arohner 2026-05-11T15:08:30.359509Z

Thanks!