Affects PMD Version:
7.10.0 and 7.11.0
Make sure, to test with the latest PMD version.
Description:
We got reports of PMD analysis blocking the build pipelines. It seems to happen in one particular project using the sonar-pmd plugin which uses PMD 7.10.0. Running with PMD plugin in Intellij (PMD 7.7.0) and running from command line with 7.11.0 and pmd check -t 10
on same code base also results in deadlocks. The source code is a Java Spring Boot application.
Exception Stacktrace:
From jstack:Found one Java-level deadlock:
=============================
"PmdThread 1":
waiting to lock monitor 0x00006000032dc340 (object 0x00000004085d1cd8, a net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub$1),
which is held by "PmdThread 4"
"PmdThread 4":
waiting to lock monitor 0x00006000032dc410 (object 0x0000000408510468, a net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub$1),
which is held by "PmdThread 1"
Java stack information for the threads listed above:
===================================================
"PmdThread 1":
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.getFinalStatus(ParseLock.java:41)
- waiting to lock <0x00000004085d1cd8> (a net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub$1)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.isFailed(ParseLock.java:82)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub.isUnresolved(ClassStub.java:524)
at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.checkUserEnclosingTypeIsOk(ClassTypeImpl.java:452)
at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.validateParams(ClassTypeImpl.java:418)
at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.<init>(ClassTypeImpl.java:69)
at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.<init>(ClassTypeImpl.java:64)
at net.sourceforge.pmd.lang.java.types.TypeSystem.typeOf(TypeSystem.java:466)
at net.sourceforge.pmd.lang.java.types.TypeSystem.rawType(TypeSystem.java:493)
at net.sourceforge.pmd.lang.java.types.TypeSystem.parameterise(TypeSystem.java:527)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeSigParser$TypeScanner.makeClassType(TypeSigParser.java:364)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeSigParser.classType(TypeSigParser.java:164)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeSigParser.typeSignature(TypeSigParser.java:148)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeSigParser.typeSignature(TypeSigParser.java:124)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeSigParser.arrayType(TypeSigParser.java:216)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeSigParser.typeSignature(TypeSigParser.java:146)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeSigParser.methodType(TypeSigParser.java:53)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.SignatureParser.parseMethodType(SignatureParser.java:65)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$LazyMethodType.doParse(GenericSigBase.java:265)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$1.doParse(GenericSigBase.java:56)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.getFinalStatus(ParseLock.java:48)
- locked <0x00000004085d1d00> (a net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$1)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.ensureParsed(ParseLock.java:27)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase.ensureParsed(GenericSigBase.java:87)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$LazyMethodType.getParameterTypes(GenericSigBase.java:333)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ExecutableStub.getArity(ExecutableStub.java:83)
at net.sourceforge.pmd.lang.java.symbols.JMethodSymbol.isAnnotationAttribute(JMethodSymbol.java:51)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub$1$$Lambda/0x00003ffc013641c8.test(Unknown Source)
at java.util.stream.ReferencePipeline$2$1.accept(java.base@23.0.2/ReferencePipeline.java:196)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(java.base@23.0.2/ArrayList.java:1709)
at java.util.stream.AbstractPipeline.copyInto(java.base@23.0.2/AbstractPipeline.java:570)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(java.base@23.0.2/AbstractPipeline.java:560)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(java.base@23.0.2/ReduceOps.java:921)
at java.util.stream.AbstractPipeline.evaluate(java.base@23.0.2/AbstractPipeline.java:265)
at java.util.stream.ReferencePipeline.collect(java.base@23.0.2/ReferencePipeline.java:727)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub$1.finishParse(ClassStub.java:139)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.getFinalStatus(ParseLock.java:50)
- locked <0x0000000408510468> (a net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub$1)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.isFailed(ParseLock.java:82)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub.isUnresolved(ClassStub.java:524)
at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.checkUserEnclosingTypeIsOk(ClassTypeImpl.java:452)
at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.validateParams(ClassTypeImpl.java:418)
at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.<init>(ClassTypeImpl.java:69)
at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.<init>(ClassTypeImpl.java:64)
at net.sourceforge.pmd.lang.java.types.TypeSystem.typeOf(TypeSystem.java:466)
at net.sourceforge.pmd.lang.java.symbols.table.internal.SymTableFactory.fillSingleImports(SymTableFactory.java:299)
at net.sourceforge.pmd.lang.java.symbols.table.internal.SymTableFactory.singleImportsSymbolTable(SymTableFactory.java:270)
at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver$MyVisitor.visit(SymbolTableResolver.java:232)
at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver$MyVisitor.visit(SymbolTableResolver.java:138)
at net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit.acceptVisitor(ASTCompilationUnit.java:109)
at net.sourceforge.pmd.lang.java.ast.AbstractJavaNode.acceptVisitor(AbstractJavaNode.java:38)
at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver$MyVisitor.traverse(SymbolTableResolver.java:164)
at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver.traverse(SymbolTableResolver.java:101)
at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.lambda$process$1(JavaAstProcessor.java:132)
at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor$$Lambda/0x00003ffc01358000.run(Unknown Source)
at net.sourceforge.pmd.benchmark.TimeTracker.bench(TimeTracker.java:163)
at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.process(JavaAstProcessor.java:132)
at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.process(JavaAstProcessor.java:166)
at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.process(JavaAstProcessor.java:150)
at net.sourceforge.pmd.lang.java.ast.JavaParser.parseImpl(JavaParser.java:69)
at net.sourceforge.pmd.lang.java.ast.JavaParser.parseImpl(JavaParser.java:25)
at net.sourceforge.pmd.lang.ast.impl.javacc.JjtreeParserAdapter.parse(JjtreeParserAdapter.java:36)
at net.sourceforge.pmd.lang.impl.PmdRunnable.parse(PmdRunnable.java:112)
at net.sourceforge.pmd.lang.impl.PmdRunnable.processSource(PmdRunnable.java:132)
at net.sourceforge.pmd.lang.impl.PmdRunnable.run(PmdRunnable.java:80)
at java.util.concurrent.Executors$RunnableAdapter.call(java.base@23.0.2/Executors.java:572)
at java.util.concurrent.FutureTask.run(java.base@23.0.2/FutureTask.java:317)
at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@23.0.2/ThreadPoolExecutor.java:1144)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@23.0.2/ThreadPoolExecutor.java:642)
at java.lang.Thread.runWith(java.base@23.0.2/Thread.java:1588)
at java.lang.Thread.run(java.base@23.0.2/Thread.java:1575)
"PmdThread 4":
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.getFinalStatus(ParseLock.java:41)
- waiting to lock <0x0000000408510468> (a net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub$1)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.ensureParsed(ParseLock.java:27)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub.getEnclosingTypeParameterOwner(ClassStub.java:418)
at net.sourceforge.pmd.lang.java.symbols.JTypeParameterOwnerSymbol.getLexicalScope(JTypeParameterOwnerSymbol.java:40)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub.getLexicalScope(ClassStub.java:333)
at net.sourceforge.pmd.lang.java.symbols.JTypeParameterOwnerSymbol.getLexicalScope(JTypeParameterOwnerSymbol.java:41)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub.getLexicalScope(ClassStub.java:333)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase.getEnclosingTypeParams(GenericSigBase.java:83)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.SignatureParser.typeParamsWrapper(SignatureParser.java:94)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.SignatureParser.parseMethodType(SignatureParser.java:64)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$LazyMethodType.doParse(GenericSigBase.java:265)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$1.doParse(GenericSigBase.java:56)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.getFinalStatus(ParseLock.java:48)
- locked <0x00000004085104b0> (a net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$1)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.ensureParsed(ParseLock.java:27)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase.ensureParsed(GenericSigBase.java:87)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$LazyMethodType.getParameterTypes(GenericSigBase.java:333)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ExecutableStub.getArity(ExecutableStub.java:83)
at net.sourceforge.pmd.lang.java.symbols.JMethodSymbol.isAnnotationAttribute(JMethodSymbol.java:51)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub$1$$Lambda/0x00003ffc013641c8.test(Unknown Source)
at java.util.stream.ReferencePipeline$2$1.accept(java.base@23.0.2/ReferencePipeline.java:196)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(java.base@23.0.2/ArrayList.java:1709)
at java.util.stream.AbstractPipeline.copyInto(java.base@23.0.2/AbstractPipeline.java:570)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(java.base@23.0.2/AbstractPipeline.java:560)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(java.base@23.0.2/ReduceOps.java:921)
at java.util.stream.AbstractPipeline.evaluate(java.base@23.0.2/AbstractPipeline.java:265)
at java.util.stream.ReferencePipeline.collect(java.base@23.0.2/ReferencePipeline.java:727)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub$1.finishParse(ClassStub.java:139)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.getFinalStatus(ParseLock.java:50)
- locked <0x00000004085d1cd8> (a net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub$1)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.isFailed(ParseLock.java:82)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub.isUnresolved(ClassStub.java:524)
at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.checkUserEnclosingTypeIsOk(ClassTypeImpl.java:452)
at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.validateParams(ClassTypeImpl.java:418)
at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.<init>(ClassTypeImpl.java:69)
at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.<init>(ClassTypeImpl.java:64)
at net.sourceforge.pmd.lang.java.types.TypeSystem.typeOf(TypeSystem.java:466)
at net.sourceforge.pmd.lang.java.types.TypeSystem.rawType(TypeSystem.java:493)
at net.sourceforge.pmd.lang.java.types.TypeSystem.parameterise(TypeSystem.java:527)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeSigParser$TypeScanner.makeClassType(TypeSigParser.java:364)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeSigParser.classType(TypeSigParser.java:164)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeSigParser.typeSignature(TypeSigParser.java:148)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeSigParser.typeSignature(TypeSigParser.java:124)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeSigParser.arrayType(TypeSigParser.java:216)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeSigParser.typeSignature(TypeSigParser.java:146)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeSigParser.methodType(TypeSigParser.java:53)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.SignatureParser.parseMethodType(SignatureParser.java:65)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$LazyMethodType.doParse(GenericSigBase.java:265)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$1.doParse(GenericSigBase.java:56)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.getFinalStatus(ParseLock.java:48)
- locked <0x0000000408510490> (a net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$1)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.ensureParsed(ParseLock.java:27)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase.ensureParsed(GenericSigBase.java:87)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$LazyMethodType.getParameterTypes(GenericSigBase.java:333)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ExecutableStub.getArity(ExecutableStub.java:83)
at net.sourceforge.pmd.lang.java.symbols.JMethodSymbol.isAnnotationAttribute(JMethodSymbol.java:51)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub$1$$Lambda/0x00003ffc013641c8.test(Unknown Source)
at java.util.stream.ReferencePipeline$2$1.accept(java.base@23.0.2/ReferencePipeline.java:196)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(java.base@23.0.2/ArrayList.java:1709)
at java.util.stream.AbstractPipeline.copyInto(java.base@23.0.2/AbstractPipeline.java:570)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(java.base@23.0.2/AbstractPipeline.java:560)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(java.base@23.0.2/ReduceOps.java:921)
at java.util.stream.AbstractPipeline.evaluate(java.base@23.0.2/AbstractPipeline.java:265)
at java.util.stream.ReferencePipeline.collect(java.base@23.0.2/ReferencePipeline.java:727)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub$1.finishParse(ClassStub.java:139)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.getFinalStatus(ParseLock.java:50)
- locked <0x0000000408510a38> (a net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub$1)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.isFailed(ParseLock.java:82)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub.isUnresolved(ClassStub.java:524)
at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.checkUserEnclosingTypeIsOk(ClassTypeImpl.java:452)
at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.validateParams(ClassTypeImpl.java:418)
at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.<init>(ClassTypeImpl.java:69)
at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.<init>(ClassTypeImpl.java:64)
at net.sourceforge.pmd.lang.java.types.TypeSystem.typeOf(TypeSystem.java:466)
at net.sourceforge.pmd.lang.java.symbols.table.internal.SymTableFactory.fillSingleImports(SymTableFactory.java:299)
at net.sourceforge.pmd.lang.java.symbols.table.internal.SymTableFactory.singleImportsSymbolTable(SymTableFactory.java:270)
at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver$MyVisitor.visit(SymbolTableResolver.java:232)
at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver$MyVisitor.visit(SymbolTableResolver.java:138)
at net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit.acceptVisitor(ASTCompilationUnit.java:109)
at net.sourceforge.pmd.lang.java.ast.AbstractJavaNode.acceptVisitor(AbstractJavaNode.java:38)
at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver$MyVisitor.traverse(SymbolTableResolver.java:164)
at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver.traverse(SymbolTableResolver.java:101)
at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.lambda$process$1(JavaAstProcessor.java:132)
at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor$$Lambda/0x00003ffc01358000.run(Unknown Source)
at net.sourceforge.pmd.benchmark.TimeTracker.bench(TimeTracker.java:163)
at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.process(JavaAstProcessor.java:132)
at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.process(JavaAstProcessor.java:166)
at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.process(JavaAstProcessor.java:150)
at net.sourceforge.pmd.lang.java.ast.JavaParser.parseImpl(JavaParser.java:69)
at net.sourceforge.pmd.lang.java.ast.JavaParser.parseImpl(JavaParser.java:25)
at net.sourceforge.pmd.lang.ast.impl.javacc.JjtreeParserAdapter.parse(JjtreeParserAdapter.java:36)
at net.sourceforge.pmd.lang.impl.PmdRunnable.parse(PmdRunnable.java:112)
at net.sourceforge.pmd.lang.impl.PmdRunnable.processSource(PmdRunnable.java:132)
at net.sourceforge.pmd.lang.impl.PmdRunnable.run(PmdRunnable.java:80)
at java.util.concurrent.Executors$RunnableAdapter.call(java.base@23.0.2/Executors.java:572)
at java.util.concurrent.FutureTask.run(java.base@23.0.2/FutureTask.java:317)
at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@23.0.2/ThreadPoolExecutor.java:1144)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@23.0.2/ThreadPoolExecutor.java:642)
at java.lang.Thread.runWith(java.base@23.0.2/Thread.java:1588)
at java.lang.Thread.run(java.base@23.0.2/Thread.java:1575)
Found 1 deadlock.
A heapdump analysis on the hanging threads shows at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.getFinalStatus
:
Thread 1: ClassStub:org/springframework/context/annotation/ComponentScan$Filter
Thread 4: ClassStub:org/springframework/context/annotation/ComponentScan
Further up the stack we see in net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit.acceptVisitor
these two files are parsed: ApiApplication.java
(thread 4) and `JpaConfiguration.java' (thread 1)
We notice @ComponentScan
annotation used in ApiApplication.java
and @EnableJpaRepositories
annotation used in JpaConfiguration.java
.
We notice that @EnableJpaRepositories
uses the Filter
inner interface from ComponentScan
via
import org.springframework.context.annotation.ComponentScan.Filter;
When we remove @EnableJpaRepositories
from JpaConfiguration.java
and remove the java import of that org.springframework.data.jpa.repository.config.EnableJpaRepositories
annotation, we cannot get deadlock situation.
Code Sample demonstrating the issue:
ApiApplication.java:
@SpringBootApplication @ComponentScan({"io.example.auth", "io.example.api"}) public class ApiApplication { public static void main(String[] args) { SpringApplication.run(ApiApplication.class, args); } }
JpaConfiguration.java:
@Configuration @EnableJpaRepositories(repositoryFactoryBeanClass = SomeRepositoryFactoryBean.class, basePackages = "io.example.persistence") public class JpaConfiguration { ... }
If needed, we can try to create a small SpringBoot app that triggers the deadlock.
Steps to reproduce:
From cli (note it is running with 10 threads, if running with 1 no deadlock occurs):
/.../pmd-bin-7.11.0/bin/pmd check -t 10 -R /.../PMD-jPinpoint-rules/rulesets/java/jpinpoint-rules.xml -d src/main/java -f text --aux-classpath=target/classes:$(cat classpath.txt) -r java-issues-$(date +"%Y%m%d_%H%M").txt
Need to run multiple times to get deadlock, but happens quite often on machine described below.
To generate classpath.txt
:
mvn dependency:build-classpath -Dmdep.outputFile=classpath.txt
Running PMD through: CLI (see above) | Maven (via sonar:sonar) | PMD Intellij Plugin
When running locally in command line on MacOS (Apple M1 Max - Sequoia 15.3.1):
java -version openjdk version "23.0.2" 2025-01-21 OpenJDK Runtime Environment Zulu23.32+11-CA (build 23.0.2+7) OpenJDK 64-Bit Server VM Zulu23.32+11-CA (build 23.0.2+7, mixed mode, sharing)
Same happens with Java 21.
Might be related to #5293.
Can deadlock be caused by use of inner interface/class? E.g. org/springframework/context/annotation/ComponentScan$Filter
Related / Similar issues in the past:
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4