private void scanForSystemPropertyClasses() {

        try {
            final Set<ClassPath.ClassInfo> classesInPackage = ClassPath.from(getClass().getClassLoader()).getTopLevelClassesRecursive("org.jivesoftware.openfire");
            for (final ClassPath.ClassInfo classInfo : classesInPackage) {
                final String className = classInfo.getName();
                if (!CLASSES_TO_EXCLUDE.contains(className)) {
                    try {
                        final Class<?> clazz = classInfo.load();
                        final Field[] fields = clazz.getDeclaredFields();
                        for (final Field field : fields) {
                            if (field.getType().equals(SystemProperty.class)) {
                                try {
                                    field.setAccessible(true);
                                    logger.debug("Accessing SystemProperty field {}#{}", className, field.getName());
                                    field.get(null);
                                } catch (final Throwable t) {
                                    logger.warn("Unable to access field {}#{}", className, field.getName(), t);
                                }
                            }
                        }
                    } catch (final Throwable t) {
                        logger.warn("Unable to load class {}", className, t);
                    }
                }
            }
        } catch (final Throwable t) {
            logger.warn("Unable to scan classpath for SystemProperty classes", t);
        }
    }
Finish the setup process. Because this method is meant to be called from inside
the Admin console plugin, it spawns its own thread to do the work so that the
class loader is correct.
xmppserver/src/main/java/org/jivesoftware/openfire/XMPPServer.java