I'm trying to build a native image of my Spring Boot application using GraalVM, but I'm encountering an InaccessibleObjectException
related to java.util.Collections$SetFromMap
. I've attempted several solutions, but the issue persists.
When I add EclipseStore
to my Spring Boot
application and attempt to build a native image with GraalVM
, I encounter the following error related to java.util.Collections$SetFromMap
:
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field final java.util.Map java.util.Collections$SetFromMap.m accessible: module java.base does not "opens java.util" to unnamed module @60a7e509
at java.base/java.lang.reflect.AccessibleObject.throwInaccessibleObjectException(AccessibleObject.java:391)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:367)
at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:183)
at java.base/java.lang.reflect.Field.setAccessible(Field.java:177)
at org.eclipse.serializer.reflect.XReflect.setAccessible(XReflect.java:110)
...
This suggests that the application is attempting to access internal classes via reflection, which is being blocked by the Java module system.
Adding --add-opens
at Build Time:
In my pom.xml
, I included the following build arguments:
<buildArgs>
<buildArg>--add-opens=java.base/java.util=ALL-UNNAMED</buildArg>
</buildArgs>
Adding --add-opens
at Runtime:
Updated the build arguments to pass the --add-opens
option to the runtime:
<buildArgs>
<buildArg>-H:AdditionalRuntimeOptions=--add-opens=java.base/java.util=ALL-UNNAMED</buildArg>
</buildArgs>
Registering Reflection Hints:
In my RuntimeHints.java
, I registered the internal class:
hints.reflection().registerType(
TypeReference.of("java.util.Collections$SetFromMap"),
builder -> builder.withMembers(MemberCategory.values())
);
Using Reflection Configuration File:
Created a reflect-config.json
file with the necessary configuration.
Despite these attempts, the error remains the same.
Additional Information:
java.util.Collections$SetFromMap
?Any guidance or suggestions would be greatly appreciated, especially from those with experience in GraalVM or working with Java's module system in native images.
The breaking change is adding EclipseStore. If I download a new project from Spring Initializer and add my Controller, it can compile to native image and run. As soon as I add EclipseStore, the error occurs when the native image is run. Nothing I have tried above seems to change the outcome.
public class EclipseAccountAdapter {
private final EmbeddedStorageManager storageManager;
private static final Logger log = LoggerFactory.getLogger(EclipseAccountAdapter.class);
private final ApplicationContext context;
public EclipseAccountAdapter(EmbeddedStorageManager storageManager, ApplicationContext context) {
this.storageManager = storageManager;
this.context = context;
initializeRoot();
}
private void initializeRoot() {
if (storageManager.root() == null) {
log.info("Initializing root.");
storageManager.setRoot(new DataRoot());
storageManager.storeRoot();
}
}
@Write
public int save(Account account, StorerType storerType) {
getRoot().accounts().add(account);
store(getRoot().accounts().usernameToAccount(), storerType);
return getRoot().accounts().all().size();
}
@Read
public List<Account> findAll() {
return new ArrayList<>(getRoot().accounts().all());
}
private DataRoot getRoot() {
return (DataRoot) storageManager.root();
}
private void store(final Object object, StorerType storerType) {
try {
switch (storerType) {
case LAZY: {
Storer lazyStorer = storageManager.createLazyStorer();
lazyStorer.store(object);
lazyStorer.commit();
break;
}
case EAGER: {
Storer eagerStorer = storageManager.createEagerStorer();
eagerStorer.store(object);
eagerStorer.commit();
}
default:
storageManager.store(object);
}
} catch (final Throwable t) {
onStorageFailure(t);
}
}
private void onStorageFailure(final Throwable t) {
if (storageManager != null && storageManager.isRunning()) {
try {
log.error("Storage error! Shutting down storage...", t);
SpringApplication.exit(context, () -> 0);
} catch (final Throwable throwable) {
log.error(throwable.getMessage(), throwable);
}
}
DataRoot root = getRoot();
if (root != null) {
root.clear();
}
}
}
Here’s a partial pom.xml
with only the key dependencies and GraalVM
build arguments:
<dependencies>
<!-- Spring Boot and GraalVM dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.store</groupId>
<artifactId>storage-embedded</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
After compiling the native image with ./mvnw -Pnative -DbuildArgs="-Ob" native:compile -DskipTests
and then running it:
2024-10-27T08:01:30.632-05:00 INFO 19610 --- [nativeImageTest] [ main] d.n.nativeImageTest.ServiceConfig : Initializing EmbeddedStorageManager...
2024-10-27T08:01:30.634-05:00 WARN 19610 --- [nativeImageTest] [ main] w.s.c.ServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'accountController': Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'eclipseAccountAdapter': Unsatisfied dependency expressed through method 'eclipseAccountAdapter' parameter 0: Error creating bean with name 'injectStorageTest': Instantiation of supplied bean failed
2024-10-27T08:01:30.634-05:00 INFO 19610 --- [nativeImageTest] [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat]
Application run failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'accountController': Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'eclipseAccountAdapter': Unsatisfied dependency expressed through method 'eclipseAccountAdapter' parameter 0: Error creating bean with name 'injectStorageTest': Instantiation of supplied bean failed
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'eclipseAccountAdapter': Unsatisfied dependency expressed through method 'eclipseAccountAdapter' parameter 0: Error creating bean with name 'injectStorageTest': Instantiation of supplied bean failed
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'injectStorageTest': Instantiation of supplied bean failed
Caused by: org.eclipse.serializer.exceptions.NoSuchNestedClassRuntimeException: No nested class java.util.Collections$SetFromMap found in class java.util.Collections
at org.eclipse.serializer.reflect.XReflect.getDeclaredNestedClass(XReflect.java:416)
at org.eclipse.serializer.persistence.binary.java.util.BinaryHandlerSetFromMap.New(BinaryHandlerSetFromMap.java:39)
Note: I've reviewed similar questions and documentation but haven't found a solution that works. If anyone has faced a similar issue or knows how to address this, your help would be invaluable.
The issue you are facing doesn't come from EclipseStore but actually from Eclipse serializer (project page) (but also how some Eclipse Store classes are used with Eclipse Serializer).
Actually, there are two types of issues you are facing as you already noticed: Allowing deep reflective access to Collections.SetFromMap#m
and providing reflective hints.
--add-opens
already worksYour attempt 1 should already take care of the issue with reflective access:
<buildArgs>
<buildArg>--add-opens=java.base/java.util=ALL-UNNAMED</buildArg>
</buildArgs>
For reflective hints, you can use the agent (which you already tried). Since you already have tests, you can just run these tests with -agentlib:native-image-agent=config-output-dir=/path/to/your/suggested/agent/output
.
You can do that by temporarily adding that argument to the maven-surefire-plugin
and running mvn test
:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.5.0</version>
<configuration>
<!-- TODO replace the path with the actual path you want -->
<argLine>--add-opens java.base/java.util=ALL-UNNAMED -agentlib:native-image-agent=config-output-dir=/path/to/your/suggested/agent/output</argLine>
<forkCount>1</forkCount>
</configuration>
</plugin>
This should create the directory /path/to/your/suggested/agent/output
with a reflect-config.json
file that contains everything that's reflectively accessed using tests. You can then copy that file in your project and use that whenever you are building a native executable. Note that you only have to generate that file once (or possibly recreate it if you update that library and run into similar issues), not every time you want to build the executable. You can remove or comment out that part in your pom.xml
afterwards (or use a <profile>
for it).
Assuming you copied that file to native-image-config/reflect-config.json
, you can add -H:ReflectionConfigurationFiles=native-image-config/reflect-config.json
to the native-image
arguments:
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<configuration>
<buildArgs>
<buildArg>--add-opens java.base/java.util=ALL-UNNAMED</buildArg>
<buildArg>-H:ReflectionConfigurationFiles=native-image-config/reflect-config.json</buildArg>
</buildArgs>
</configuration>
</plugin>
To make the library compatible with native-image, these hints should either be added as part of the library or to the GraalVM reachability metadata repository. To do this, you might want to create an issue in the issue tracker of the project (Eclipse serializer) and ask them to either add it to their JAR or to the reachability metadata repository. It will likely be helpful if you include the reflect-config.json
you got from running the agent. However, when doing so, please run the agent on a project using Eclipse serializer and nothing else, especially without Spring (or run the Eclipse serializer tests with the agent and collect its output).
If Eclipse serializer bundles the reflective hints or these are provided in the reachability metadata repository, others should be able to use it without needing to configure everything by themselves.
reflect-config.json
Since Spring and many other things (which already provide hints) are using reflection, your reflect-config.json
also contains a lot of stuff you don't need to specify again. You can try to reduce your reflect-config.json
by removing everything that isn't related to Eclipse Store or Eclipse Serializer and also keeping java.util.Collections$SetFromMap
. When I did that, the file had only 97 entries left as opposed to 1205 entries before.
In my case, the cleaned up reflect-config.json
looks as follows:
[
{
"name":"java.util.Collections$SetFromMap",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"[Lorg.eclipse.serializer.persistence.binary.types.BinaryField;"
},
{
"name":"[Lorg.eclipse.serializer.persistence.binary.types.BinaryReferenceTraverser;"
},
{
"name":"[Lorg.eclipse.serializer.persistence.binary.types.LoadItemsChain$Entry;"
},
{
"name":"[Lorg.eclipse.serializer.persistence.types.PersistenceTypeDefinitionMemberFieldGeneric;"
},
{
"name":"[Lorg.eclipse.serializer.persistence.types.PersistenceTypeDescription;"
},
{
"name":"[Lorg.eclipse.store.afs.nio.types.NioReadableFile$Default;"
},
{
"name":"org.eclipse.serializer.collections.BulkList",
"queryAllDeclaredMethods":true
},
{
"name":"org.eclipse.serializer.collections.ConstHashEnum",
"queryAllDeclaredMethods":true
},
{
"name":"org.eclipse.serializer.collections.ConstHashTable",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"org.eclipse.serializer.collections.ConstHashTable$Keys"
},
{
"name":"org.eclipse.serializer.collections.ConstHashTable$Values"
},
{
"name":"org.eclipse.serializer.collections.ConstList",
"queryAllDeclaredMethods":true
},
{
"name":"org.eclipse.serializer.collections.Empty",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"unsafeAllocated":true
},
{
"name":"org.eclipse.serializer.collections.EmptyTable",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"unsafeAllocated":true
},
{
"name":"org.eclipse.serializer.collections.EmptyTable$Keys",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"unsafeAllocated":true
},
{
"name":"org.eclipse.serializer.collections.EmptyTable$Values",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"unsafeAllocated":true
},
{
"name":"org.eclipse.serializer.collections.EqBulkList",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"org.eclipse.serializer.collections.EqConstHashEnum",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"org.eclipse.serializer.collections.EqConstHashTable",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"org.eclipse.serializer.collections.EqConstHashTable$Keys"
},
{
"name":"org.eclipse.serializer.collections.EqConstHashTable$Values"
},
{
"name":"org.eclipse.serializer.collections.EqHashEnum",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"org.eclipse.serializer.collections.EqHashTable",
"queryAllDeclaredMethods":true
},
{
"name":"org.eclipse.serializer.collections.EqHashTable$Keys"
},
{
"name":"org.eclipse.serializer.collections.EqHashTable$Values"
},
{
"name":"org.eclipse.serializer.collections.FixedList",
"queryAllDeclaredMethods":true
},
{
"name":"org.eclipse.serializer.collections.HashEnum",
"queryAllDeclaredMethods":true
},
{
"name":"org.eclipse.serializer.collections.HashTable",
"queryAllDeclaredMethods":true
},
{
"name":"org.eclipse.serializer.collections.HashTable$Keys"
},
{
"name":"org.eclipse.serializer.collections.HashTable$Values"
},
{
"name":"org.eclipse.serializer.collections.LimitList",
"queryAllDeclaredMethods":true
},
{
"name":"org.eclipse.serializer.collections.Singleton",
"queryAllDeclaredMethods":true
},
{
"name":"org.eclipse.serializer.collections.lazy.LazyArrayList",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"methods":[{"name":"addSegment","parameterTypes":["int","int","java.lang.Object"] }]
},
{
"name":"org.eclipse.serializer.collections.lazy.LazyArrayList$Segment",
"allDeclaredFields":true,
"methods":[{"name":"cleanModified","parameterTypes":[] }, {"name":"getLazy","parameterTypes":[] }, {"name":"getLazyData","parameterTypes":[] }]
},
{
"name":"org.eclipse.serializer.collections.lazy.LazyHashMap",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"methods":[{"name":"addSegment","parameterTypes":["int","int","int","java.lang.Object"] }]
},
{
"name":"org.eclipse.serializer.collections.lazy.LazyHashMap$LazyHashMapSegmentEntryList",
"queryAllDeclaredMethods":true
},
{
"name":"org.eclipse.serializer.collections.lazy.LazyHashMap$Segment",
"allDeclaredFields":true,
"methods":[{"name":"cleanModified","parameterTypes":[] }, {"name":"getLazy","parameterTypes":[] }, {"name":"getLazyData","parameterTypes":[] }]
},
{
"name":"org.eclipse.serializer.collections.lazy.LazyHashSet",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"org.eclipse.serializer.collections.lazy.LazySegmentUnloader"
},
{
"name":"org.eclipse.serializer.hashing.HashEqualator"
},
{
"name":"org.eclipse.serializer.hashing.XHashing$SingletonIdentityHashEqualator",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"unsafeAllocated":true
},
{
"name":"org.eclipse.serializer.hashing.XHashing$SingletonKeyValueIdentityHashEqualator",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"unsafeAllocated":true
},
{
"name":"org.eclipse.serializer.hashing.XHashing$SingletonValueHashEqualator",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"unsafeAllocated":true
},
{
"name":"org.eclipse.serializer.memory.sun.JdkInternals$ObjectHeaderSizeDummy",
"allDeclaredFields":true
},
{
"name":"org.eclipse.serializer.monitoring.LazyReferenceManagerMonitor",
"queryAllPublicConstructors":true
},
{
"name":"org.eclipse.serializer.monitoring.LazyReferenceManagerMonitorMBean",
"queryAllPublicMethods":true
},
{
"name":"org.eclipse.serializer.monitoring.MonitorDescription",
"queryAllPublicMethods":true,
"methods":[{"name":"value","parameterTypes":[] }]
},
{
"name":"org.eclipse.serializer.persistence.binary.java.net.BinaryHandlerInetSocketAddress",
"allDeclaredFields":true
},
{
"name":"org.eclipse.serializer.persistence.types.PersistenceRootReference$Default",
"queryAllDeclaredMethods":true
},
{
"name":"org.eclipse.serializer.persistence.types.PersistenceRoots$Default",
"queryAllDeclaredMethods":true
},
{
"name":"org.eclipse.serializer.reference.ControlledLazyReference$Default",
"queryAllDeclaredMethods":true,
"methods":[{"name":"<init>","parameterTypes":["java.lang.Object","long","org.eclipse.serializer.reference.ObjectSwizzling"] }]
},
{
"name":"org.eclipse.serializer.reference.Lazy$Default",
"queryAllDeclaredMethods":true,
"methods":[{"name":"<init>","parameterTypes":["java.lang.Object","long","org.eclipse.serializer.reference.ObjectSwizzling"] }]
},
{
"name":"org.eclipse.serializer.reflect.ClassLoaderProvider",
"queryAllDeclaredMethods":true,
"queryAllPublicMethods":true
},
{
"name":"org.eclipse.serializer.util.Substituter$Default",
"queryAllDeclaredMethods":true
},
{
"name":"org.eclipse.store.integrations.spring.boot.types.DefaultEclipseStoreConfiguration",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"methods":[{"name":"<init>","parameterTypes":[] }, {"name":"defaultEclipseStoreProperties","parameterTypes":[] }]
},
{
"name":"org.eclipse.store.integrations.spring.boot.types.DefaultEclipseStoreConfiguration$$SpringCGLIB$$0",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"queryAllDeclaredConstructors":true,
"fields":[{"name":"CGLIB$FACTORY_DATA"}],
"methods":[{"name":"<init>","parameterTypes":[] }, {"name":"CGLIB$SET_STATIC_CALLBACKS","parameterTypes":["org.springframework.cglib.proxy.Callback[]"] }, {"name":"CGLIB$SET_THREAD_CALLBACKS","parameterTypes":["org.springframework.cglib.proxy.Callback[]"] }]
},
{
"name":"org.eclipse.store.integrations.spring.boot.types.DefaultEclipseStoreConfiguration$$SpringCGLIB$$FastClass$$0",
"methods":[{"name":"<init>","parameterTypes":["java.lang.Class"] }]
},
{
"name":"org.eclipse.store.integrations.spring.boot.types.DefaultEclipseStoreConfiguration$$SpringCGLIB$$FastClass$$1",
"methods":[{"name":"<init>","parameterTypes":["java.lang.Class"] }]
},
{
"name":"org.eclipse.store.integrations.spring.boot.types.EclipseStoreSpringBoot",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"methods":[{"name":"<init>","parameterTypes":[] }, {"name":"classLoaderProvider","parameterTypes":["org.springframework.context.ApplicationContext"] }, {"name":"eclipseStoreConfigConverter","parameterTypes":[] }, {"name":"embeddedStorageFoundationFactory","parameterTypes":["org.eclipse.store.integrations.spring.boot.types.converter.EclipseStoreConfigConverter","org.eclipse.serializer.reflect.ClassLoaderProvider"] }, {"name":"embeddedStorageManagerFactory","parameterTypes":[] }]
},
{
"name":"org.eclipse.store.integrations.spring.boot.types.EclipseStoreSpringBoot$$SpringCGLIB$$0",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"queryAllDeclaredConstructors":true,
"fields":[{"name":"CGLIB$FACTORY_DATA"}],
"methods":[{"name":"<init>","parameterTypes":[] }, {"name":"CGLIB$SET_STATIC_CALLBACKS","parameterTypes":["org.springframework.cglib.proxy.Callback[]"] }, {"name":"CGLIB$SET_THREAD_CALLBACKS","parameterTypes":["org.springframework.cglib.proxy.Callback[]"] }]
},
{
"name":"org.eclipse.store.integrations.spring.boot.types.EclipseStoreSpringBoot$$SpringCGLIB$$FastClass$$0",
"methods":[{"name":"<init>","parameterTypes":["java.lang.Class"] }]
},
{
"name":"org.eclipse.store.integrations.spring.boot.types.EclipseStoreSpringBoot$$SpringCGLIB$$FastClass$$1",
"methods":[{"name":"<init>","parameterTypes":["java.lang.Class"] }]
},
{
"name":"org.eclipse.store.integrations.spring.boot.types.concurrent.Read",
"queryAllDeclaredMethods":true
},
{
"name":"org.eclipse.store.integrations.spring.boot.types.concurrent.Write",
"queryAllDeclaredMethods":true
},
{
"name":"org.eclipse.store.integrations.spring.boot.types.configuration.ConfigurationPair"
},
{
"name":"org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"methods":[{"name":"<init>","parameterTypes":[] }, {"name":"close","parameterTypes":[] }, {"name":"shutdown","parameterTypes":[] }]
},
{
"name":"org.eclipse.store.integrations.spring.boot.types.configuration.StorageFilesystem"
},
{
"name":"org.eclipse.store.integrations.spring.boot.types.configuration.aws.AbstractAwsProperties"
},
{
"name":"org.eclipse.store.integrations.spring.boot.types.configuration.aws.Aws"
},
{
"name":"org.eclipse.store.integrations.spring.boot.types.configuration.azure.Azure"
},
{
"name":"org.eclipse.store.integrations.spring.boot.types.configuration.oraclecloud.Oraclecloud"
},
{
"name":"org.eclipse.store.integrations.spring.boot.types.configuration.sql.AbstractSqlConfiguration"
},
{
"name":"org.eclipse.store.integrations.spring.boot.types.configuration.sql.Sql"
},
{
"name":"org.eclipse.store.integrations.spring.boot.types.converter.EclipseStoreConfigConverter",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"methods":[{"name":"close","parameterTypes":[] }, {"name":"shutdown","parameterTypes":[] }]
},
{
"name":"org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"methods":[{"name":"close","parameterTypes":[] }, {"name":"shutdown","parameterTypes":[] }]
},
{
"name":"org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageManagerFactory",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"methods":[{"name":"close","parameterTypes":[] }, {"name":"shutdown","parameterTypes":[] }]
},
{
"name":"org.eclipse.store.integrations.spring.boot.types.suppliers.EmbeddedStorageFoundationSupplier"
},
{
"name":"org.eclipse.store.storage.embedded.configuration.types.EmbeddedStorageConfigurationBuilder"
},
{
"name":"org.eclipse.store.storage.embedded.types.EmbeddedStorageFoundation"
},
{
"name":"org.eclipse.store.storage.embedded.types.EmbeddedStorageManager"
},
{
"name":"org.eclipse.store.storage.embedded.types.EmbeddedStorageManager$Default"
},
{
"name":"org.eclipse.store.storage.monitoring.EntityCacheMonitor",
"queryAllPublicConstructors":true
},
{
"name":"org.eclipse.store.storage.monitoring.EntityCacheMonitorMBean",
"queryAllPublicMethods":true
},
{
"name":"org.eclipse.store.storage.monitoring.EntityCacheSummaryMonitor",
"queryAllPublicConstructors":true
},
{
"name":"org.eclipse.store.storage.monitoring.EntityCacheSummaryMonitorMBean",
"queryAllPublicMethods":true
},
{
"name":"org.eclipse.store.storage.monitoring.ObjectRegistryMonitor",
"queryAllPublicConstructors":true
},
{
"name":"org.eclipse.store.storage.monitoring.ObjectRegistryMonitorMBean",
"queryAllPublicMethods":true
},
{
"name":"org.eclipse.store.storage.monitoring.StorageChannelHousekeepingMonitor",
"queryAllPublicConstructors":true
},
{
"name":"org.eclipse.store.storage.monitoring.StorageChannelHousekeepingMonitorMBean",
"queryAllPublicMethods":true
},
{
"name":"org.eclipse.store.storage.monitoring.StorageManagerMonitor",
"queryAllPublicConstructors":true
},
{
"name":"org.eclipse.store.storage.monitoring.StorageManagerMonitor$ChannelStatistics",
"queryAllPublicMethods":true
},
{
"name":"org.eclipse.store.storage.monitoring.StorageManagerMonitor$FileStatistics",
"queryAllPublicMethods":true
},
{
"name":"org.eclipse.store.storage.monitoring.StorageManagerMonitor$StorageStatistics",
"queryAllPublicMethods":true
},
{
"name":"org.eclipse.store.storage.monitoring.StorageManagerMonitorMXBean",
"queryAllPublicMethods":true
},
{
"name":"org.eclipse.store.storage.types.StorageStructureValidator$Default"
},
{
"name":"org.eclipse.store.storage.types.StorageSystem$Default"
}
]