2024 年 Clojure 状态调查中分享您的想法!

欢迎!请参阅关于页面,了解更多关于这个工作的信息。

+3
工具
已关闭

有时(可能 ~1%?!)在我的 CI 报告中,这个错误没有任何原因。

这是一个大型工具依赖项 CLI 项目,许多本地/git/maven 依赖在 CircleCI/Docker 上运行

zulu-openjdk-11
dev-utils-tools-deps 1.10.3.814

Error building classpath. class java.util.HashMap$Node cannot be cast to class java.util.HashMap$TreeNode (java.util.HashMap$Node and java.util.HashMap$TreeNode are in module java.base of loader 'bootstrap')
java.lang.ClassCastException: class java.util.HashMap$Node cannot be cast to class java.util.HashMap$TreeNode (java.util.HashMap$Node and java.util.HashMap$TreeNode are in module java.base of loader 'bootstrap')
	at java.base/java.util.HashMap$TreeNode.moveRootToFront(HashMap.java:1882)
	at java.base/java.util.HashMap$TreeNode.putTreeVal(HashMap.java:2061)
	at java.base/java.util.HashMap.putVal(HashMap.java:633)
	at java.base/java.util.HashMap.put(HashMap.java:607)
	at java.base/java.util.HashSet.add(HashSet.java:220)
	at org.apache.maven.model.validation.DefaultModelValidator.validateId(DefaultModelValidator.java:847)
	at org.apache.maven.model.validation.DefaultModelValidator.validateEffectiveDependency(DefaultModelValidator.java:659)
	at org.apache.maven.model.validation.DefaultModelValidator.validateEffectiveDependencies(DefaultModelValidator.java:583)
	at org.apache.maven.model.validation.DefaultModelValidator.validateEffectiveModel(DefaultModelValidator.java:373)
	at org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:494)
	at org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:440)
	at org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:430)
	at org.apache.maven.model.building.DefaultModelBuilder.importDependencyManagement(DefaultModelBuilder.java:1299)
	at org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:474)
	at org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:440)
	at org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:430)
	at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom(DefaultArtifactDescriptorReader.java:292)
	at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.readArtifactDescriptor(DefaultArtifactDescriptorReader.java:171)
	at org.eclipse.aether.internal.impl.DefaultRepositorySystem.readArtifactDescriptor(DefaultRepositorySystem.java:255)
	at clojure.tools.deps.alpha.extensions.maven$eval1076$fn__1078.invoke(maven.clj:107)
	at clojure.lang.MultiFn.invoke(MultiFn.java:244)
	at clojure.tools.deps.alpha$expand_deps$children_task__790$fn__792$fn__793.invoke(alpha.clj:403)
	at clojure.tools.deps.alpha.util.concurrent$submit_task$task__505.invoke(concurrent.clj:34)
	at clojure.lang.AFn.call(AFn.java:18)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:834)
已关闭,备注:在 1.11.0.1100 中修复

1 个答案

+1

这已经记录在 https://clojure.atlassian.net/browse/TDEPS-153 中,有一些关于如何修复的想法,但还没有时间来处理它。

我怀疑如果您传递 -Sthreads 1,这可能是一个解决方案(我想不管哪种方式,了解一下是否这样做是有好处的)。

这只是关于我在 1.10.3.967 上遇到这个问题的报告。

```
openjdk 版本 "1.8.0_302"
OpenJDK 运行时环境 (Temurin)(构建 1.8.0_302-b08)
OpenJDK 64位服务器虚拟机 (Temurin)(构建 25.302-b08, 混合模式)
```

```
构建类路径错误。无法将 java.util.HashMap$Node 强制转换为 java.util.HashMap$TreeNode
java.lang.ClassCastException: 无法将 java.util.HashMap$Node 转换为 java.util.HashMap$TreeNode
        在 java.util.HashMap$TreeNode.moveRootToFront(HashMap.java:1835)
        在 java.util.HashMap$TreeNode.treeify(HashMap.java:1951)
        在 java.util.HashMap.treeifyBin(HashMap.java:772)
        在 java.util.HashMap.putVal(HashMap.java:644)
        在 java.util.HashMap.put(HashMap.java:612)
        在 java.util.HashSet.add(HashSet.java:220)
        在 org.apache.maven.model.validation.DefaultModelValidator.validateId(DefaultModelValidator.java:848)
        在 org.apache.maven.model.validation.DefaultModelValidator.validateEffectiveDependency(DefaultModelValidator.java:660)
        在 org.apache.maven.model.validation.DefaultModelValidator.validateEffectiveDependencies(DefaultModelValidator.java:584)
        在 org.apache.maven.model.validation.DefaultModelValidator.validateEffectiveModel(DefaultModelValidator.java:374)
        在 org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:501)
        在 org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:437)
        在 org.apache.maven.model.building.DefaultModelBuilder.importDependencyManagement(DefaultModelBuilder.java:1313)
        在 org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:481)
        在 org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:437)
        在 org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:252)
        在 org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom(DefaultArtifactDescriptorReader.java:293)
        在 org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.readArtifactDescriptor(DefaultArtifactDescriptorReader.java:171)
        在 org.eclipse.aether.internal.impl.DefaultRepositorySystem.readArtifactDescriptor(DefaultRepositorySystem.java:257)
        在 clojure.tools.deps.alpha.extensions.maven$fn__1053.invokeStatic(maven.clj:132)
        在 clojure.tools.deps.alpha.extensions.maven$fn__1053.invoke(maven.clj:122)
        在 clojure.lang.MultiFn.invoke(MultiFn.java:244)
        在 clojure.tools.deps.alpha$expand_deps$children_task__746$fn__748$fn__749.invoke(alpha.clj:406)
        在 clojure.tools.deps.alpha.util.concurrent$submit_task$task__479.invoke(concurrent.clj:34)
        在 clojure.lang.AFn.call(AFn.java:18)
        在 java.util.concurrent.FutureTask.run(FutureTask.java:266)
        在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        在 java.lang.Thread.run(Thread.java:748)
```
by
版本 1.10.3.1029 仍然存在此错误。
by
应该在最新的 1.10.3.1058 中得到修复。
by
我遇到了相同的堆栈跟踪,使用以下环境

```
$ java -version
openjdk 版本 "11.0.10" 2021-01-19 LTS
OpenJDK 运行时环境 Corretto-11.0.10.9.1 (构建 11.0.10+9-LTS)
OpenJDK 64位服务器 VM Corretto-11.0.10.9.1 (构建 11.0.10+9-LTS, 混合模式,共享)

$ clojure --version
Clojure CLI 版本 1.10.3.1087
```
by
`DefaultModelValidator` 似乎只是不是线程安全的。

异常就这样抛出了(maven 3.8.4)
https://github.com/apache/maven/blob/maven-3.8.4/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java#L848

validIds 是一个私有 HashSet。

在 master 中它仍然是 HashSet,我没有看到任何旨在更改这一点的 issue 或 PR。

ModelValidator 实例位于 ModelBuilder 实例上,而 ModelBuilder 实例处于 ArtifactDescriptorReader 实例上,这看起来可能是共享的(并且不是为每个 artefact 请求构建的)在 DefaultRepositorySystem 上。也许吧。所以如果系统在线程间共享,那就是罪魁祸首。可能 ModelBuilder 本身就不应该共享。
by
谢谢!这些信息都很有帮助。
by
我已经发布了一个 Clojure CLI 预发布版 1.10.3.1093 来修复这个问题,并期待任何帮助测试它!
我有坏消息:我仍然在使用 Clojure CLI 版本 1.11.1.1105 时看到这个错误。

```
构建类路径时出错。无法将 class java.util.HashMap$Node 转换为 class java.util.HashMap$TreeNode(java.util.HashMap$Node 和 java.util.HashMap$TreeNode 都在加载器 'bootstrap' 的 java.base 模块中)。
java.lang.ClassCastException: class java.util.HashMap$Node cannot be cast to class java.util.HashMap$TreeNode (java.util.HashMap$Node 和 java.util.HashMap$TreeNode 都在模块 java.base 的加载器 'bootstrap' 中)
    在 java.base/java.util.HashMap$TreeNode.moveRootToFront(HashMap.java:1900)
    在 java.base/java.util.HashMap$TreeNode.treeify(HashMap.java:2016)
    在 java.base/java.util.HashMap.treeifyBin(HashMap.java:768)
    在 java.base/java.util.HashMap.putVal(HashMap.java:640)
    在 java.base/java.util.HashMap.put(HashMap.java:608)
    在 java.base/java.util.HashSet.add(HashSet.java:220)
    在 org.apache.maven.model.validation.DefaultModelValidator.validateId(DefaultModelValidator.java:848)
    在 org.apache.maven.model.validation.DefaultModelValidator.validateEffectiveDependency(DefaultModelValidator.java:660)
    在 org.apache.maven.model.validation.DefaultModelValidator.validateEffectiveDependencies(DefaultModelValidator.java:584)
    在 org.apache.maven.model.validation.DefaultModelValidator.validateEffectiveModel(DefaultModelValidator.java:374)
    在 org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:501)
    在 org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:437)
    在 org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:252)
    在 org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom(DefaultArtifactDescriptorReader.java:297)
    在 org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.readArtifactDescriptor(DefaultArtifactDescriptorReader.java:175)
    在 org.eclipse.aether.internal.impl.DefaultRepositorySystem.readArtifactDescriptor(DefaultRepositorySystem.java:255)
    在 clojure.tools.deps.alpha.extensions.maven$read_descriptor.invokeStatic(maven.clj:115)
    在 clojure.tools.deps.alpha.extensions.maven$fn__1128.invokeStatic(maven.clj:143)
    在 clojure.tools.deps.alpha.extensions.maven$fn__1128.invoke(maven.clj:143)
    在 clojure.lang.MultiFn.invoke(MultiFn.java:244)
    在 clojure.tools.deps.alpha$expand_deps$children_task__771$fn__773$fn__774.invoke(alpha.clj:405)
    在 clojure.tools.deps.alpha.util.concurrent$submit_task$task__479.invoke(concurrent.clj:35)
    在 clojure.lang.AFn.call(AFn.java:18)
    在 java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    在 java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    在 java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    在 java.base/java.lang.Thread.run(Thread.java:829)
```
...