public static Map<String, Version> getAll(ClassLoader classLoader) {
        requireNonNull(classLoader, "classLoader");

        return VERSIONS.computeIfAbsent(classLoader, cl -> {
            boolean foundProperties = false;

            // Collect all properties.
            final Properties props = new Properties();
            try {
                final Enumeration<URL> resources = cl.getResources(PROP_RESOURCE_PATH);
                while (resources.hasMoreElements()) {
                    foundProperties = true;
                    final URL url = resources.nextElement();
                    final InputStream in = url.openStream();
                    try {
                        props.load(in);
                    } finally {
                        Closeables.closeQuietly(in);
                    }
                }
            } catch (Exception ignore) {
                // Not critical. Just ignore.
            }

            if (!foundProperties) {
                logger.info(
                        "Could not find any property files at " +
                        "META-INF/com.linecorp.armeria.versions.properties. " +
                        "This usually indicates an issue with your application packaging, for example using " +
                        "a fat JAR method that only keeps one copy of any file. For maximum functionality, " +
                        "it is recommended to fix your packaging to include these files.");
                return ImmutableMap.of();
            }

            // Collect all artifactIds.
            final Set<String> artifactIds = new HashSet<>();
            for (Object o : props.keySet()) {
                final String k = (String) o;

                final int dotIndex = k.lastIndexOf('.');
                if (dotIndex <= 0) {
                    continue;
                }

                final String artifactId = k.substring(0, dotIndex);

                // Skip the entries without required information.
                if (!props.containsKey(artifactId + PROP_VERSION) ||
                    !props.containsKey(artifactId + PROP_COMMIT_DATE) ||
                    !props.containsKey(artifactId + PROP_SHORT_COMMIT_HASH) ||
                    !props.containsKey(artifactId + PROP_LONG_COMMIT_HASH) ||
                    !props.containsKey(artifactId + PROP_REPO_STATUS)) {
                    continue;
                }

                artifactIds.add(artifactId);
            }

            final ImmutableSortedMap.Builder<String, Version> versions = ImmutableSortedMap.naturalOrder();
            for (String artifactId : artifactIds) {
                versions.put(
                        artifactId,
                        new Version(
                                artifactId,
                                props.getProperty(artifactId + PROP_VERSION),
                                parseIso8601(props.getProperty(artifactId + PROP_COMMIT_DATE)),
                                props.getProperty(artifactId + PROP_SHORT_COMMIT_HASH),
                                props.getProperty(artifactId + PROP_LONG_COMMIT_HASH),
                                props.getProperty(artifactId + PROP_REPO_STATUS)));
            }

            return versions.build();
        });
    }
Retrieves the version information of Armeria artifacts using the specified {@link ClassLoader}.

@return A {@link Map} whose keys are Maven artifact IDs and whose values are {@link Version}s
core/src/main/java/com/linecorp/armeria/common/util/Version.java