2017-09-17 47 views

Odpowiedz

10
ModuleLayer.boot().modules().stream() 
       .map(Module::getName) 
       .forEach(System.out::println); 
+2

Jest to prawdziwe tylko wtedy, gdy warstwa startowa jest jedyną warstwą. Jeśli moduły są ładowane przez różne programy ładujące klasy, lista ta będzie niekompletna. –

+3

Oczywiście, ale fragment kodu dostanie osobę zadającą pytanie. Istnieją oczywiście interfejsy API do narzędzi i debuggerów, które wyliczają wszystkie moduły w maszynie wirtualnej, w tym moduły nienazwane, ale to znacznie wykracza poza moje podejrzenia. –

+0

Nie zgadzam się, Alan Bateman - ta odpowiedź jest niekompletna. Jak wspominasz w swoim komentarzu, nie zwraca to nawet nienazwanych modułów ani automatycznych modułów, które są i będą bardzo powszechne w początkowych latach Java 9. –

3

Korzystanie słoik lub katalogu modułów jako wejście dla aplikacji, można ewentualnie użyć ModuleFinder rozpocząć mecz i dalsze wykorzystanie w findAll znaleźć zbiór wszystkich referencji moduł ten Finder Znajdź.

Path dir1, dir2, dir3; 
ModuleFinder finder = ModuleFinder.of(dir1, dir2, dir3); 
Set<ModuleReference> moduleReferences = finder.findAll(); 

To jest łatwo możliwe przy opcji wiersza poleceń do listy modułów jak:

java -p <jarfile> --list-modules 

które powinny być wystarczające, jednak, jeśli nie chce celowo dostać się tweaking things z ModuleLayer i Configuration z , jak wskazano dokładnie przez @Alan's answer.