2009-09-30 15 views
61

To musi być bardzo podstawowe pytanie dla programistów Java, ale jaki jest najlepszy sposób znalezienia odpowiedniego pliku JAR o nazwie o nazwie klasy?Znajdź plik jar, biorąc pod uwagę nazwę klasy?

Na przykład, biorąc pod uwagę "com.ibm.websphere.security.auth.WSSubject", jak wyśledzić odpowiedni plik jar? ("google" nie jest odpowiedzią, której szukam!)

java docs nie dają żadnych wskazówek w pliku jar, i oczywiście same nazwy plików jar nie mają pojęcia.

Musi być "wyszukaj lokalne słoiki" lub jakieś "automatyczne rozwiązywanie zależności", podstęp w świecie java. Idealnie, szukam "oficjalnego" sposobu na zrobienie tego. Tak się składa, że ​​jestem na maszynie z Windows bez cygwin.

+0

Czy próbujesz rozwiązać zależność? np. po uruchomieniu kodu nie można znaleźć klasy, więc chcesz umieścić ją w ścieżce klas? – aperkins

+0

Tak, właśnie to próbuję zrobić. –

+0

Myślę, że zadajesz niewłaściwe pytanie. Myślę, że pytanie, które masz zamiar zadać, brzmi: "Próbuję opracować aplikację cienkiego klienta przy użyciu WAS w wersji 6.1. Który słoik powinienem umieścić na ścieżce mojej klasy JVM, aby wykonać uwierzytelnianie (prawdopodobnie WSSubject)?" W zależności od tego, co faktycznie chcesz zrobić, wyszukiwanie w InfoCenter dla "cienkiego klienta" lub "cienkiego klienta wssubject" jest prawdopodobnie tym, czego szukasz. Jeśli podasz szczegóły, prawdopodobnie otrzymasz właściwy słoik zamiast zgadywania na podstawie poniższych odpowiedzi. –

Odpowiedz

74

Zapisz to jako findclass.sh (lub cokolwiek), umieścić go na swojej drodze i uczynić go wykonywalnym:

#!/bin/sh 
find "$1" -name "*.jar" -exec sh -c 'jar -tf {}|grep -H --label {} '$2'' \; 

Pierwszy parametr jest katalog szukać rekurencyjnie a drugi parametr jest wyrażeniem regularnym (zazwyczaj tylko prosta nazwa klasy), aby wyszukać dla.

$ findclass.sh . WSSubject 

Scenariusz opiera się na opcji -t do polecenia jar (który wymienia zawartość) i greps każdy spis treści, etykietowanie jakiekolwiek mecze ze ścieżką do pliku JAR, w którym został znaleziony.

+0

Nie jestem pewien, czy Ty lub Dave Costa odpowiedzieliście w pierwszej kolejności, ale to działa i mogę korzystać z tego skryptu w przyszłości. Dzięki! –

+0

Dave odpowiedział pierwszy.Jego odpowiedź jest prostsza i będzie działać szybciej, ale myślę, że moja jest nieco bardziej elastyczna, ponieważ nie musisz określać w pełni kwalifikowanej nazwy klasy. –

+1

Powinno to zostać oznaczone jako Linux/Unix - bez użycia w systemie Windows. – orbfish

3

można spróbować usługi takie jak:

Albo

Albo

  • przedsiębiorstw Maven z funkcji wyszukiwania na przykład Nexus (OFC, to będzie działać tylko wtedy, słoiki, których szukasz są indeksowane tzn zainstalowany w repozytorium)

PS: Jarhoo podjął współpracę z Javacio.us dostarczyć 100.000 programistów Java z bezpłatnym dostępem do Jarhoo poprzez linki zintegrowane z wynikami wyszukiwania Google. Subskrypcja Javacio.us jest bezpłatna i dostępna dla każdego, kto posiada konto Google. Aby uzyskać więcej informacji, odwiedź stronę Jarhoo offer page at Javacio.us.

+0

- jarhoo kosztuje pieniądze - docjar nie znajduje "WSSubject" z mojego przykładu (http://www.docjar.com/docs2web/s.jsp?q=WSSubject&t=q&start=0). Musi być metoda "wyszukaj lokalne słoiki", z której zazwyczaj korzystają deweloperzy java ..? –

+0

Mam nadzieję na opcję offline. Często spotykam się z nieco niejasnymi słojami od dostawców zewnętrznych. –

+0

AFAIK, nie ma nic wbudowanego pod Windows, które może w tym pomóc. Jeśli więc wykluczysz cygwin, Googke Desktop może być najlepszą (najgorszą?) Opcją. –

0

zlokalizować .jar | xargs grep com.ibm.websphere.security.auth.WSSubject

+0

Dobra odpowiedź dla * nix, ale to nie pomaga w oknach (chociaż sądząc po jego przykładzie * nix byłoby w porządku). –

+0

Wystarczająco uczciwe, ale jakie jest standardowe podejście dla programisty Java na komputerze z systemem Windows, który nie wymaga instalacji cygwin? –

+0

Znajdź w plikach * .jar, z klasą jako ciągiem znaków? (właściwie nie wiem, czy to działa, ale jeśli grep działa, powinno to być) – TREE

12

Nie ma "oficjalnej" metody Java do zrobienia tego AFAIK.

Sposób, w jaki zwykle polują na to jest użycie znaleźć i słoik przejrzeć wszystkie pliki jar w danym drzewie.

> find . -name \*.jar -print -exec jar tf {} oracle/sql/BLOB.class \; 
./v2.6.1/lib/csw_library.jar 
./v2.6.1/lib/oracle_drivers_12_01.jar 
oracle/sql/BLOB.class 

Jeśli jesteś na Windows i nie chce zainstalować Cygwin, to chyba trzeba by napisać skrypt wsadowy, aby zlokalizować pliki jar.

+0

Zwróć uwagę, że pliki JAR są plikami zip, a nazwa pliku w słoiku skutecznie odwzorowuje pakiet i klasę. – TREE

+0

Podoba mi się to bardziej, ponieważ nie dotyczy grep –

2

Drukuję listę tak, jak to robię, więc widzę, co sprawdzam. Głównie szukam w katalogu lib/app, ale możesz zastąpić lokalizator dla znaleziska.

np.

for jar in $(find some_dir/lib -name "*.jar"); 
do 
echo -------------$jar------------------- 
jar -tf $jar | grep TheNameOfTheClassImLookingFor 
done 
1

Biorąc pod uwagę twój komentarz na temat prób radzenia sobie z zależnościami, chciałbym skupić się na bibliotekach, z których korzystasz. Wiedząc to, będziesz wiedział, jakie słoiki muszą znajdować się w ścieżce klas, i możesz na to zwrócić uwagę. Istnieją również narzędzia do budowania zarządzania zależnościami (Maven i Ant są dwoma popularnymi), które mogą pakować projekty z ich wewnętrznymi zależnościami. Ostatecznie jednak to deweloper musi wiedzieć, jakie mają zależności, i zwrócić uwagę na wymagania dla tych zależności. Jest to jeden z powodów, dla których używanie IDE takiego jak Eclipse i tworzenie narzędzi takich jak Maven czy Ant jest tak dobre w dużych projektach, jak wtedy, gdy masz 20 zależności dla projektu, które mogą stać się dość trudne do zarządzania.

0

Polecam korzystanie z Maven, Eclipse i m2eclipse.

Krok 1 - dodać specyficzny import

alt text

Krok 2 - znaleźć i pobrać (automatycznie) pożądane słoik

alt text

3

W systemie Windows, należy uruchomić cmd.exe i typ:

for %i in (*.jar) do @jar tvf %i | find "/com/company/MyClass.class" 

Słoiki muszą znajdować się w bieżącym katalogu. Ma również opcję/R, która pobiera katalog i pozwala na rekursywne wyszukiwanie.

Jeśli Jar.exe nie znajduje się na twojej ścieżce, możesz zrobić coś w stylu @C: \ jdk \ bin \ jar.exe.

5

Jeśli grep w systemie (np Solaris) nie ma -H i --label jak w przykładzie Dan Dyer, można użyć:

find . -name '*.jar' -type f | xargs -i bash -c "jar -tvf {}| tr/. | grep WSSubject && echo {}" 
3

Spróbuj findjar.com. Jeśli jest w domenie publicznej, powinieneś ją zdobyć. Jest alos mavenjava.com (ale to miejsce wydaje się być w dół)

+0

Istnieje również http://www.jarfinder.com. Ale obaj wydają się oferować raczej przestarzałe wersje słoików. W przeciwieństwie do http://grepcode.com/ pozostaje aktualny na kodzie publicznym, ale może być używany tylko jako wskazówka, gdzie szukać i jaka jest faktyczna nazwa słoika. – Vadzim

+0

Możesz nawet wypróbować http://javasearch.buggybread.com/, aby znaleźć framework z klasą. –

1

Używam jarscan. Jest to plik wykonywalny jar, który może rekursywnie przeszukiwać całą strukturę folderów dla słoików, które zawierają klasę, której szukasz. Wyszukuje według nazwy klasy, nazwy pakietu lub wyrażenia regularnego.

+0

Należy zachować ostrożność, publikując kopie i wklejając obowiązkowe odpowiedzi na wiele pytań, które zazwyczaj są oznaczone jako "spam" przez społeczność. Jeśli to robisz, oznacza to zazwyczaj, że pytania są duplikowane, więc oznacz je jako takie. – Kev

+0

do użytku z oknami, umieściłem plik jarscan.jar w PATH razem z jarscan.bat, który zawiera 'java -jar% ~ dp0jarscan.jar -class% 1% 2% 3% 4% 5% 6% 7% 8% 9' - wtedy może być użyty po prostu z "jarscan ServletRequest" – eis

5

Aby wyszukać wszystkie słoiki w bieżącym katalogu i zwróci jeden (ów), które zawierają ABCD klasa zrobić:

find . -iname *.jar | while read JARF; do jar tvf $JARF | grep a/b/c/D.class && echo $JARF ; done 

będzie zgłaszać wszystkie instancje klasy ABCD (lub klas z podobnym przyrostek) i wydrukuje tylko słoiki, które go zawierają.

Typowe wyjście:

$ find . -iname *.jar | while read JARF; do jar tvf $JARF | grep Log.class && echo $JARF ; done 
479 Fri Oct 10 18:19:40 PDT 2003 org/apache/commons/logging/Log.class 
3714 Fri Oct 10 18:19:40 PDT 2003 org/apache/commons/logging/impl/Log4JCategoryLog.class 
1963 Fri Oct 10 18:19:40 PDT 2003 org/apache/commons/logging/impl/NoOpLog.class 
9065 Fri Oct 10 18:19:40 PDT 2003 org/apache/commons/logging/impl/SimpleLog.class 
./WebContent/WEB-INF/lib/commons-logging.jar 
1

jeśli nadal szuka WSSubject, następnie słoik jest wssec.jar. WSSecurityException klasa inside sas.jar

1

W oknie powershell możesz użyć tego polecenia. Zawiera listę wszystkich plików JAR, które napotkał, ale ma dodatkową linię, która jest bardzo łatwa do wykrycia, gdzie znajduje również twoją klasę.

Get-ChildItem -recurse -Filter *.jar | Foreach {echo $_.fullname; c:\somepath\JDK\BIN\jar tvf $_.fullname | Select-String -pattern "Cabbages.class"} 
0

Opierając się na Dan's excellent answer następujący skrypt rozwiązuje problem zniekształcone wyjście w przypadku niektórych słoje są rzeczywiście złamane dowiązania (podczas gdy w tym samym czasie nie omijając odpowiednie dowiązania) wyszukuje również w bieżącym katalogu, jeśli nie argument jest dostarczony.

#!/usr/bin/env bash 

if [[ ($# -ne 1) && ($# -ne 2) ]] 
then 
    echo "usage is $0 <grep RegEx to look for in contents of jar> [<top-of-folder-hierarchy> or, if missing, current dir]" 
else 
    REG_EXP=$1 
    DIR=${2:-.} 
    if [ ! -d $DIR ]; then 
     echo "directory [$DIR] does not exist"; 
     exit 1; 
    fi 
    find "$DIR" -name "*.jar" -exec sh -c ' 
    (test -e {}) 
    exitStatus=$? 
    if [ "$exitStatus" -eq 0 ]; then # this is done to avoid broken symlinks 
     jar -tf {}|grep -i -H --label {} '$REG_EXP' 
    fi 
' \; 
fi 
Powiązane problemy