AppDynamics Knowledge Base

Fix: NoClassDefFoundError in Eclipse Equinox with Java Agent <= 26.1

Fix: NoClassDefFoundError in Eclipse Equinox with Java Agent <= 26.1

Resolving Eclipse Equinox Boot-Delegation and NoClassDefFoundError Exceptions in Java Agent 26.1 and Below

When instrumenting enterprise applications that embed the Eclipse Equinox OSGi framework, runtime initialization errors can halt deployment. Understanding how the underlying framework processes JVM bootstrap properties is critical to restoring agent visibility.

Technical Symptoms: Java Agent Initialization Failure Exception

The following exception occurs during Java Agent initialization when the customer attempted to instrument their application ( Informatica 10.5.8 – latest version of Informatica at the time) with Java Agent version <= 26.1 (latest version of Java Agent at the time)

NoClassDefFoundError: com/singularity/ee/agent/appagent/entrypoint/bciengine/FastMethodInterceptorDelegatorBoot


Root Cause Diagnosis: Equinox OSGi Framework and System Property Siloing

The root cause is due to the com.singularity.* package not being boot-delegated within the Eclipse Equinox OSGi framework used by Informatica 10.5.8.

The JVM arguments do include:

-Dorg.osgi.framework.bootdelegation=com.singularity.*

which was added as a system property, and the FastMethodInterceptorDelegatorBoot class is present on the boot classpath (confirmed by the agent starting successfully). However, the Equinox framework is not reading this value from system properties.

Eclipse Equinox, like Apache Felix, can be initialized programmatically by passing a configuration Map to its constructor:

new org.eclipse.osgi.launch.Equinox(Map<String, String> configuration)

When launched this way, the framework reads its properties (including org.osgi.framework.bootdelegation) exclusively from the provided configuration map.

System properties set via -D flags are not automatically included unless the embedding application explicitly copies them into the map.

A similar challenge had already been addressed for Apache Felix.

Internal Engineering Context

The Java Agent code includes ApacheFelixOSGiInterceptor that intercepts org.apache.felix.framework.Felix.<init>(Map) and injects com.singularity.* into the org.osgi.framework.bootdelegation entry of the configuration map :
https://bitbucket.corp.appdynamics.com/projects/JAVA/repos/agent-java/browse/java_agent/agent/java/a...

However, no equivalent interceptor exists for Eclipse Equinox. Informatica 10.5.8 embeds Equinox and initializes it programmatically with its own configuration. At no point does the Informatica startup code read the org.osgi.framework.bootdelegation system property into the Equinox configuration map. The customer has no external configuration mechanism to influence this — the map contents are controlled entirely by Informatica's internal code.

Resolution Roadmap: Workaround Configuration and Permanent Fixes

Tactical Workaround: Implementing Custom Interceptors

The issue is resolved by intercepting the Equinox constructor the same way the agent already intercepts the Felix constructor.

 Placing custom-interceptors.xml at <AGENT_HOME>/ver<version>/conf/ reuses the existing ApacheFelixOSGiInterceptor logic against the Equinox entry point.

This works because both Felix and Equinox follow the OSGi specification (org.osgi.framework.launch.Framework), where framework launch properties are passed as a Map<String, String> in the constructor. The ApacheFelixOSGiInterceptor reads the first parameter of the intercepted constructor (the configuration map), and adds com.singularity.* to the org.osgi.framework.bootdelegation entry. Since the Equinox constructor follows the same signature and contract, the interceptor works identically for both frameworks.

Release Update Notes

A permanent fix has been addressed in JavaAgent-26.4.0

Labels (1)
Attachments
Version history
Last update:
Wednesday
Updated by: