pulumi / pulumi/pulumi-java

ClassDefNotFoundError on resource package scanning corrupts stacks

Open
#1,869 4 comments 3 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

kind/bug
Dominant language
Java
Stars
85
Forks
26
Avg merge
11h 49m
Merged PRs (30d)
22

Description

What happened?

Here is a stack trace we got:

java.lang.IllegalStateException: Failed to load class 'reactor.core.publisher.ContextPropagation$ReactorScopeImpl' (package: 'reactor.core.publisher') from class path: io/micrometer/context/ContextSnapshot$Scope

The code that throws this error is here

And the usage is here.

The issue is that depending on where the failure happens, it can cause resources to be deleted which should not be and leaves the stack in a corrupted state.

I tried to work around this by using event handlers in the UpdateOptions but this appears to occur before the preludeEvent.

Also, the log handlers onStandardOutput and onStandardError do not catch this as it is thrown by DeploymentImpl:

2025-07-17T19:51:56.407-0700	ERROR	ForkJoinPool.commonPool-worker-6	com.pulumi.deployment.internal.DeploymentImpl	Running program [PID: 78011] ... failed with an unhandled exception:
java.lang.IllegalStateException: Failed to load class 'org.flywaydb.core.internal.scanner.classpath.jboss.JBossVFSv3ClassPathLocationScanner$1' (package: 'org.flywaydb.core.internal.scanner.classpath.jboss') from class path: org/jboss/vfs/VirtualFileFilter
	at com.pulumi.serialization.internal.ResourcePackages.lambda$discoverResourceTypes$0(ResourcePackages.java:73)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:215)
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:197)
	at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:1024)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:570)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:560)
	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:265)

Any way we can use a "*" to disable the resource scanning behavior? Or any other recommended fix/workaround?

When rebasing this often causes failures: I set the pulumi.resourcepackages.excludes to a long list of packages but new ones from newly added imports trigger these failures.

Example
2025-07-17T19:51:56.407-0700	ERROR	ForkJoinPool.commonPool-worker-6	com.pulumi.deployment.internal.DeploymentImpl	Running program [PID: 78011] ... failed with an unhandled exception:
java.lang.IllegalStateException: Failed to load class 'org.flywaydb.core.internal.scanner.classpath.jboss.JBossVFSv3ClassPathLocationScanner$1' (package: 'org.flywaydb.core.internal.scanner.classpath.jboss') from class path: org/jboss/vfs/VirtualFileFilter
	at com.pulumi.serialization.internal.ResourcePackages.lambda$discoverResourceTypes$0(ResourcePackages.java:73)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:215)
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:197)
	at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:1024)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:570)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:560)
	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:265)
Output of pulumi about
Version      3.175.0
Go Version   go1.24.3
Go Compiler  gc

Host     
OS       darwin
Version  15.5
Arch     arm64

Current Stack: IceGuard/cyber-range/elon-dev

TYPE                                                 URN
pulumi:pulumi:Stack                                  urn:pulumi:elon-dev::cyber-range::pulumi:pulumi:Stack::cyber-range-elon-dev
iceguard:cloudtrail                                  urn:pulumi:elon-dev::cyber-range::iceguard:cloudtrail::data-events-cloudtrail
iceguard:eks:MinimalEksCluster                       urn:pulumi:elon-dev::cyber-range::iceguard:eks:MinimalEksCluster::cyber-range
pulumi:providers:aws                                 urn:pulumi:elon-dev::cyber-range::pulumi:providers:aws::iceguard-aws-us-west-2
pulumi:providers:awsx                                urn:pulumi:elon-dev::cyber-range::pulumi:providers:awsx::default_2_22_0
aws:s3/bucketV2:BucketV2                             urn:pulumi:elon-dev::cyber-range::iceguard:cloudtrail$aws:s3/bucketV2:BucketV2::data-events-cloudtrail-CloudTrailBucket
pulumi:providers:tls                                 urn:pulumi:elon-dev::cyber-range::pulumi:providers:tls::iceguard-aws-tls-us-west-2
awsx:ec2:Vpc                                         urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc::cyber-range-vpc
pulumi:providers:aws                                 urn:pulumi:elon-dev::cyber-range::pulumi:providers:aws::default_6_66_3
aws:iam/role:Role                                    urn:pulumi:elon-dev::cyber-range::aws:iam/role:Role::nodegroup-role
aws:s3/bucketPolicy:BucketPolicy                     urn:pulumi:elon-dev::cyber-range::aws:s3/bucketPolicy:BucketPolicy::cloudTrailBucketPolicy
aws:iam/instanceProfile:InstanceProfile              urn:pulumi:elon-dev::cyber-range::aws:iam/instanceProfile:InstanceProfile::nodegroup-instance-profile
aws:iam/rolePolicyAttachment:RolePolicyAttachment    urn:pulumi:elon-dev::cyber-range::aws:iam/rolePolicyAttachment:RolePolicyAttachment::cni-nodegroup-policy
aws:cloudtrail/trail:Trail                           urn:pulumi:elon-dev::cyber-range::iceguard:cloudtrail$aws:cloudtrail/trail:Trail::dataEventsTrail
aws:iam/rolePolicyAttachment:RolePolicyAttachment    urn:pulumi:elon-dev::cyber-range::aws:iam/rolePolicyAttachment:RolePolicyAttachment::ecr-nodegroup-policy
aws:iam/rolePolicyAttachment:RolePolicyAttachment    urn:pulumi:elon-dev::cyber-range::aws:iam/rolePolicyAttachment:RolePolicyAttachment::worker-nodegroup-policy
aws:ec2/vpc:Vpc                                      urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc::cyber-range-vpc
aws:ec2/internetGateway:InternetGateway              urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/internetGateway:InternetGateway::cyber-range-vpc
aws:ec2/subnet:Subnet                                urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet::cyber-range-vpc-public-2
aws:ec2/subnet:Subnet                                urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet::cyber-range-vpc-public-1
aws:ec2/subnet:Subnet                                urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet::cyber-range-vpc-private-1
aws:ec2/subnet:Subnet                                urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet::cyber-range-vpc-private-3
aws:ec2/subnet:Subnet                                urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet::cyber-range-vpc-private-2
aws:ec2/subnet:Subnet                                urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet::cyber-range-vpc-public-3
aws:ec2/routeTable:RouteTable                        urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet$aws:ec2/routeTable:RouteTable::cyber-range-vpc-public-2
aws:ec2/eip:Eip                                      urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet$aws:ec2/eip:Eip::cyber-range-vpc-2
aws:ec2/routeTable:RouteTable                        urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet$aws:ec2/routeTable:RouteTable::cyber-range-vpc-public-1
aws:ec2/eip:Eip                                      urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet$aws:ec2/eip:Eip::cyber-range-vpc-1
aws:ec2/routeTable:RouteTable                        urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet$aws:ec2/routeTable:RouteTable::cyber-range-vpc-private-1
aws:ec2/routeTable:RouteTable                        urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet$aws:ec2/routeTable:RouteTable::cyber-range-vpc-private-3
aws:ec2/routeTable:RouteTable                        urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet$aws:ec2/routeTable:RouteTable::cyber-range-vpc-private-2
aws:ec2/routeTable:RouteTable                        urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet$aws:ec2/routeTable:RouteTable::cyber-range-vpc-public-3
aws:ec2/eip:Eip                                      urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet$aws:ec2/eip:Eip::cyber-range-vpc-3
aws:ec2/route:Route                                  urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet$aws:ec2/routeTable:RouteTable$aws:ec2/route:Route::cyber-range-vpc-public-2
aws:ec2/natGateway:NatGateway                        urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet$aws:ec2/natGateway:NatGateway::cyber-range-vpc-1
aws:ec2/route:Route                                  urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet$aws:ec2/routeTable:RouteTable$aws:ec2/route:Route::cyber-range-vpc-public-1
aws:ec2/routeTableAssociation:RouteTableAssociation  urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet$aws:ec2/routeTable:RouteTable$aws:ec2/routeTableAssociation:RouteTableAssociation::cyber-range-vpc-public-1
aws:ec2/natGateway:NatGateway                        urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet$aws:ec2/natGateway:NatGateway::cyber-range-vpc-2
aws:ec2/routeTableAssociation:RouteTableAssociation  urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet$aws:ec2/routeTable:RouteTable$aws:ec2/routeTableAssociation:RouteTableAssociation::cyber-range-vpc-public-2
aws:ec2/routeTableAssociation:RouteTableAssociation  urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet$aws:ec2/routeTable:RouteTable$aws:ec2/routeTableAssociation:RouteTableAssociation::cyber-range-vpc-private-2
aws:ec2/routeTableAssociation:RouteTableAssociation  urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet$aws:ec2/routeTable:RouteTable$aws:ec2/routeTableAssociation:RouteTableAssociation::cyber-range-vpc-private-1
aws:ec2/routeTableAssociation:RouteTableAssociation  urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet$aws:ec2/routeTable:RouteTable$aws:ec2/routeTableAssociation:RouteTableAssociation::cyber-range-vpc-private-3
aws:ec2/route:Route                                  urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet$aws:ec2/routeTable:RouteTable$aws:ec2/route:Route::cyber-range-vpc-public-3
aws:ec2/routeTableAssociation:RouteTableAssociation  urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet$aws:ec2/routeTable:RouteTable$aws:ec2/routeTableAssociation:RouteTableAssociation::cyber-range-vpc-public-3
aws:ec2/natGateway:NatGateway                        urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet$aws:ec2/natGateway:NatGateway::cyber-range-vpc-3
aws:ec2/route:Route                                  urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet$aws:ec2/routeTable:RouteTable$aws:ec2/route:Route::cyber-range-vpc-private-1
aws:ec2/route:Route                                  urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet$aws:ec2/routeTable:RouteTable$aws:ec2/route:Route::cyber-range-vpc-private-2
aws:ec2/route:Route                                  urn:pulumi:elon-dev::cyber-range::awsx:ec2:Vpc$aws:ec2/vpc:Vpc$aws:ec2/subnet:Subnet$aws:ec2/routeTable:RouteTable$aws:ec2/route:Route::cyber-range-vpc-private-3


Found no pending operations associated with IceGuard/elon-dev

Backend        
Name           pulumi.com
URL            https://app.pulumi.com/eloniceguard
User           eloniceguard
Organizations  eloniceguard, IceGuard
Token type     personal

Pulumi locates its logs in /var/folders/by/sytsdqz94jv_bcpmqmlzl5z80000gn/T/ by default
Additional context

No response

Contributing

Vote on this issue by adding a 👍 reaction.
To contribute a fix for this issue, leave a comment (and link to your pull request, if you've opened one already).

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start in sdk/java/pulumi/src/main/java/com/pulumi/serialization/internal/ResourcePackages.java, especially discoverResourceTypes and its use around lines 66-78, then reproduce the reported class-loading failures during a deployment. Trace how the exception reaches DeploymentImpl and verify that a missing class during resource scanning no longer causes unhandled failure or resource deletion, with coverage for the reported scanning cases.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
backend
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.