diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageRegistry.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageRegistry.java index 6f1755b9be..bdd930cb3e 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageRegistry.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageRegistry.java @@ -6,6 +6,8 @@ package net.sourceforge.pmd.lang; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; +import java.util.Collections; +import java.util.Comparator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -21,19 +23,34 @@ public final class LanguageRegistry { private Map languages; private LanguageRegistry() { - languages = new LinkedHashMap<>(); + List languagesList = new ArrayList<>(); ServiceLoader languageLoader = ServiceLoader.load(Language.class); Iterator iterator = languageLoader.iterator(); while (iterator.hasNext()) { try { Language language = iterator.next(); - languages.put(language.getName(), language); + languagesList.add(language); } catch (UnsupportedClassVersionError e) { // Some languages require java8 and are therefore only available // if java8 or later is used as runtime. System.err.println("Ignoring language for PMD: " + e.toString()); } } + + // sort languages by terse name. Avoiding differences in the order of languages + // across JVM versions / OS. + Collections.sort(languagesList, new Comparator() { + @Override + public int compare(Language o1, Language o2) { + return o1.getTerseName().compareToIgnoreCase(o2.getTerseName()); + } + }); + + // using a linked hash map to maintain insertion order + languages = new LinkedHashMap<>(); + for (Language language : languagesList) { + languages.put(language.getName(), language); + } } public static LanguageRegistry getInstance() { diff --git a/pmd-dist/src/test/java/net/sourceforge/pmd/it/BinaryDistributionIT.java b/pmd-dist/src/test/java/net/sourceforge/pmd/it/BinaryDistributionIT.java index 992ede22e0..7544651537 100644 --- a/pmd-dist/src/test/java/net/sourceforge/pmd/it/BinaryDistributionIT.java +++ b/pmd-dist/src/test/java/net/sourceforge/pmd/it/BinaryDistributionIT.java @@ -71,7 +71,7 @@ public class BinaryDistributionIT { PMDExecutionResult result; result = PMDExecutor.runPMD(tempDir, "-h"); - result.assertPMDExecutionResult(1, "apex, java, ecmascript, jsp, plsql, vm, xml, xsl, wsdl, pom"); + result.assertPMDExecutionResult(1, "apex, ecmascript, java, jsp, plsql, pom, vm, wsdl, xml, xsl"); result = PMDExecutor.runPMDRules(tempDir, srcDir, "java-basic"); result.assertPMDExecutionResult(4, "JumbledIncrementer.java:8:");