Guava ClassPath.from(MyClass.class.getClassLoader()). GetTopLevelClassesRecursive("mypackage") возвращает 0 элементов
В одном из моих проектов я использую Guava, чтобы получить имя класса из командной строки, а затем вызываю соответствующий конструктор. Пользователь запускает файл.bat примерно так:
java -jar MyClass.jar OtherClass
OtherClass находится в некотором пакете, таком как mypackage.otherpackage. Я хочу назвать его конструктором в коде. Чтобы найти конструктор, я использую Guava:
Constructor classConstructor = null;
Set<ClassInfo> classInfos = ClassPath.from(MyClass.class.getClassLoader()).getTopLevelClassesRecursive("mypackage");
List<String> packageNames = classInfos.stream().map(classInfo -> classInfo.getPackageName()).distinct().collect(Collectors.toList());
for (String p : packageNames) {
try {
classConstructor = Class.forName(p + "." + args[0]).getConstructor(String.class);
} catch (ClassNotFoundException ex) {
}
if (classConstructor != null)
break;
}
И он отлично работает на одном компьютере, но не работает на другом, потому что ClassPath.from(MyClass.class.getClassLoader()).getTopLevelClassesRecursive("mypackage");
возвращает 0 элементов. Я не понимаю почему. Код на обоих компьютерах одинаковый, пакеты одинаковые, классы тоже.
1 ответ
Это было из-за версии Гуавы. По какой-то причине Guava-14, который используется на первом компьютере, работает там нормально, но на втором мне пришлось заменить его на Guava-22. Но после этого все работало нормально.