Czy używasz jakiegoś środowiska IDE? Ponieważ zostanie ono automatycznie wyświetlone, jeśli używasz takiego.
joey rohan
Używam Eclipse, ale muszę to zrobić z kodem.
sticksu
@LuiggiMendoza - Potencjalny duplikat ma odpowiedzi z przykładami, a także zasoby do dokumentacji. Wyszukiwanie jednej z tych nazw klas + przykład da kilka przydatnych wyników.
Aiias
@Alias możliwy duplikat określa, jak znaleźć i pobrać plik z jar, podczas gdy pytanie dotyczy pobrania nazw klas wewnątrz jar (prawdopodobnie klas we wszystkich pakietach w nim). Łącze w odpowiedzi ErikKaju wskazuje na możliwe rozwiązanie przy użyciu klas JarInputStreami JarEntry, których nie mogę znaleźć w żadnej odpowiedzi na Twój odsyłacz.
Luiggi Mendoza
Odpowiedzi:
68
Niestety Java nie zapewnia łatwego sposobu wyświetlania klas w „natywnym” środowisku JRE. To pozostawia kilka opcji: (a) dla dowolnego pliku JAR można wyświetlić listę wpisów w tym pliku JAR, znaleźć .classpliki, a następnie określić, którą klasę Java .classreprezentuje każdy plik; lub (b) możesz skorzystać z biblioteki, która zrobi to za Ciebie.
Opcja (a): Ręczne skanowanie plików JAR
W tej opcji wypełnimy classNameslistę wszystkich klas Java zawartych w pliku jar pod adresem /path/to/jar/file.jar.
List<String> classNames =newArrayList<String>();ZipInputStream zip =newZipInputStream(newFileInputStream("/path/to/jar/file.jar"));for(ZipEntry entry = zip.getNextEntry(); entry !=null; entry = zip.getNextEntry()){if(!entry.isDirectory()&& entry.getName().endsWith(".class")){// This ZipEntry represents a class. Now, what class does it represent?String className = entry.getName().replace('/','.');// including ".class"
classNames.add(className.substring(0, className.length()-".class".length()));}}
Opcja (b): Korzystanie ze specjalistycznych bibliotek odbić
Guawa
Guawa ma ClassPathod co najmniej 14,0, którego używałem i lubiłem. Jedną z fajnych rzeczy ClassPathjest to, że nie ładuje znalezionych klas, co jest ważne, gdy skanujesz w poszukiwaniu dużej liczby klas.
ClassPath cp=ClassPath.from(Thread.currentThread().getContextClassLoader());for(ClassPath.ClassInfo info : cp.getTopLevelClassesRecurusive("my.package.name")){// Do stuff with classes here...}
Refleksje
Osobiście nie korzystałem z biblioteki Reflections , ale wydaje się, że jest ona lubiana. Na stronie internetowej znajdują się świetne przykłady, takie jak szybki sposób załadowania wszystkich klas w pakiecie dostarczonym przez dowolny plik JAR, który może być również przydatny dla twojej aplikacji.
Dzięki. Odpowiada to na część PO „po prostu uzyskaj listę zajęć”, o którą nie pytano.
octopusgrabbus
9
Możesz także użyć unzip -l jarfile.jarw szczypanie. Plik JAR to po prostu plik zip z manifestem!
podpisany
3
Problem polega na tym, że prawdopodobnie chciał dostać pliki klas do jar w czasie wykonywania, biorąc pod uwagę instancję classloader (prawdopodobnie sprawdził, jakie klasy są ładowane w tym konkretnym jar).
Richard Duerr,
19
Może szukasz jarpolecenia, aby pobrać listę klas w terminalu,
to było dokładnie to, czego potrzebowałem, nawet jeśli właściciel pytania potrzebował rozwiązania opartego na kodzie. Dzięki!
Providencemac
10
To jest hack, którego używam:
Możesz użyć javaautouzupełniania w następujący sposób:
java -cp path_to.jar <Tab>
W ten sposób otrzymasz listę klas dostępnych do zaliczenia jako klasa początkowa. Oczywiście próba użycia takiej, która nie ma pliku głównego, nic nie da, ale możesz zobaczyć, co javawedług nich .jarsą wywoływane klasy wewnątrz .
Dodaj konkretny przykład na przykładowym słoiku do swojej odpowiedzi.
Juru
4
Poniższe polecenie wyświetli zawartość pliku jar .
polecenie: - unzip -l jarfilename.jar.
próbka o / p: -
Archive: hello-world.jar
Length Date Time Name
--------- ---------- ----- ----
43161 10-18-2017 15:44 hello-world/com/ami/so/search/So.class
20531 10-18-2017 15:44 hello-world/com/ami/so/util/SoUtil.class
--------- -------
63692 2 files
Zgodnie z instrukcją unzip
-l wyświetla listę plików archiwalnych (krótki format). Drukowane są nazwy, rozmiary nieskompresowanych plików oraz daty i godziny modyfikacji określonych plików, a także sumy wszystkich określonych plików. Jeśli UnZip został skompilowany ze zdefiniowanym OS2_EAS, opcja -l wyświetla także kolumny dla rozmiarów przechowywanych atrybutów rozszerzonych OS / 2 (EA) i list kontroli dostępu (ACL) OS / 2. Ponadto wyświetlany jest komentarz do pliku zip i komentarze do poszczególnych plików (jeśli istnieją). Jeśli plik został zarchiwizowany z systemu plików z pojedynczą wielkością liter (na przykład stary system plików MS-DOS FAT) i podano opcję -L, nazwa pliku jest konwertowana na małe litery i poprzedzona znakiem daszka (^).
Choć ten fragment kodu jest mile widziany i może zapewnić jakąś pomoc, byłoby znacznie się poprawiła, gdyby obejmowała wyjaśnienie z how i dlaczego to rozwiązuje problem. Pamiętaj, że odpowiadasz na pytanie do czytelników w przyszłości, a nie tylko osoba, która zapyta teraz! Proszę edytować swoje odpowiedzi, aby dodać wyjaśnienie, i dać wskazówkę co zastosować ograniczenia i założenia.
Toby Speight,
2
Możesz spróbować tego:
unzip -v /your/jar.jar
Będzie to pomocne tylko wtedy, gdy twój jar jest wykonywalny, tj. W manifeście zdefiniowałeś jakąś klasę jako klasę główną
JarInputStream
iJarEntry
, których nie mogę znaleźć w żadnej odpowiedzi na Twój odsyłacz.Odpowiedzi:
Niestety Java nie zapewnia łatwego sposobu wyświetlania klas w „natywnym” środowisku JRE. To pozostawia kilka opcji: (a) dla dowolnego pliku JAR można wyświetlić listę wpisów w tym pliku JAR, znaleźć
.class
pliki, a następnie określić, którą klasę Java.class
reprezentuje każdy plik; lub (b) możesz skorzystać z biblioteki, która zrobi to za Ciebie.Opcja (a): Ręczne skanowanie plików JAR
W tej opcji wypełnimy
classNames
listę wszystkich klas Java zawartych w pliku jar pod adresem/path/to/jar/file.jar
.Opcja (b): Korzystanie ze specjalistycznych bibliotek odbić
Guawa
Guawa ma
ClassPath
od co najmniej 14,0, którego używałem i lubiłem. Jedną z fajnych rzeczyClassPath
jest to, że nie ładuje znalezionych klas, co jest ważne, gdy skanujesz w poszukiwaniu dużej liczby klas.Refleksje
Osobiście nie korzystałem z biblioteki Reflections , ale wydaje się, że jest ona lubiana. Na stronie internetowej znajdują się świetne przykłady, takie jak szybki sposób załadowania wszystkich klas w pakiecie dostarczonym przez dowolny plik JAR, który może być również przydatny dla twojej aplikacji.
źródło
Możesz użyć
jar
narzędzia Java . Wypisz zawartość pliku jar w pliku txt, a zobaczysz wszystkie klasy w pliku jar.źródło
unzip -l jarfile.jar
w szczypanie. Plik JAR to po prostu plik zip z manifestem!Może szukasz
jar
polecenia, aby pobrać listę klas w terminalu,gdzie,
Lub po prostu grep powyżej wyniku, aby zobaczyć
.class
tylko esAby zobaczyć liczbę
class
es,źródło
To jest hack, którego używam:
Możesz użyć
java
autouzupełniania w następujący sposób:W ten sposób otrzymasz listę klas dostępnych do zaliczenia jako klasa początkowa. Oczywiście próba użycia takiej, która nie ma pliku głównego, nic nie da, ale możesz zobaczyć, co
java
według nich.jar
są wywoływane klasy wewnątrz .źródło
Możesz użyć
źródło
Możesz spróbować:
Będzie to pomocne tylko wtedy, gdy twój jar jest wykonywalny, tj. W manifeście zdefiniowałeś jakąś klasę jako klasę główną
źródło
Poniższe polecenie wyświetli zawartość pliku jar .
polecenie: -
unzip -l jarfilename.jar
.próbka o / p: -
Archive: hello-world.jar Length Date Time Name --------- ---------- ----- ---- 43161 10-18-2017 15:44 hello-world/com/ami/so/search/So.class 20531 10-18-2017 15:44 hello-world/com/ami/so/util/SoUtil.class --------- ------- 63692 2 files
Zgodnie z instrukcją
unzip
źródło
Możesz spróbować tego:
Będzie to pomocne tylko wtedy, gdy twój jar jest wykonywalny, tj. W manifeście zdefiniowałeś jakąś klasę jako klasę główną
źródło
Użyj tego skryptu bash:
to wyświetli listę klas wewnątrz jars w twoim katalogu w postaci:
Przykładowe dane wyjściowe:
W Windows możesz użyć PowerShell:
źródło
Opis rozwiązania : Eclipse IDE można w tym celu wykorzystać, tworząc przykładowy projekt java i dodając wszystkie pliki JAR w ścieżce Project Build
KROKI poniżej :
Utwórz przykładowy projekt Eclipse Java.
Wszystkie słoiki, które masz na swojej ścieżce budowania
CTRL + SHIFT + T i wpisz pełną nazwę klasy.
Wyniki zostaną wyświetlone w oknie ze wszystkimi słoikami posiadającymi tę klasę. Zobacz załączone zdjęcie.
źródło
cmd windows: To zadziała, jeśli masz wszystkie te jars w tym samym katalogu i wykonasz poniższe polecenie
źródło
Mac OS: w terminalu:
źródło