program tip

클래스 이름이 주어진 jar 파일을 찾으십니까?

radiobox 2020. 11. 27. 07:58
반응형

클래스 이름이 주어진 jar 파일을 찾으십니까?


이것은 Java 개발자에게 매우 기본적인 질문이어야하지만 클래스 이름이 주어진 적절한 jar 파일 을 찾는 가장 좋은 방법은 무엇 입니까?

예를 들어, " com.ibm.websphere.security.auth.WSSubject "가 주어지면 적절한 jar 파일을 어떻게 추적합니까? ( "google"은 제가 찾고있는 답이 아닙니다!)

자바 문서는 jar 파일의 힌트를 제공하지 않으며, 분명히 jar 파일의 이름 자체는 단서를 제공하지 않습니다.

자바 세계에는 '로컬 항아리 검색'또는 일종의 '종속성 자동 해결'트릭이 있어야합니다. 이상적으로는 이것을 수행하는 '공식적인'방법을 찾고 있습니다. 나는 cygwin이없는 윈도우 머신에있다.


이것을 findclass.sh (또는 무엇이든)로 저장하고 경로에 넣고 실행 가능하게 만드십시오.

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

첫 번째 매개 변수는 재귀 적으로 검색 할 디렉토리이고 두 번째 매개 변수는 검색 할 정규식 (일반적으로 단순한 클래스 이름)입니다.

$ findclass.sh . WSSubject

스크립트는 jar 명령 (내용을 나열)에 -t 옵션을 사용하고 각 목차를 greps하여 발견 된 JAR 파일의 경로와 일치하는 레이블을 지정합니다.


이에 대한 프로그램을 작성했습니다 : https://github.com/javalite/jar-explorer 또한 기존 바이트 코드를 디 컴파일하여 인터페이스, 메서드, 수퍼 클래스를 표시하고 텍스트, 이미지, html 등 다른 리소스의 내용을 표시합니다. 등


이 AFAIK를 수행하는 "공식적인"Java 방법은 없습니다.

내가 보통 찾는 방법은 findjar사용 하여 주어진 트리의 모든 jar 파일을 살펴 보는 것입니다.

> 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

Windows를 사용 중이고 Cygwin을 설치하지 않으려면 jar 파일을 찾기 위해 배치 스크립트를 작성해야한다고 가정합니다.


시스템 (예 : Solaris)의 grep에 Dan Dyer의 예에서 사용 된 것처럼 -H 및 --label이없는 경우 다음을 사용할 수 있습니다.

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

현재 디렉토리에서 모든 jar를 검색하고 abcD 클래스가 포함 된 jar를 반환하려면 다음을 수행하십시오.

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

클래스 abcD (또는 유사한 접미사를 가진 클래스)의 모든 인스턴스를보고하고이를 포함하는 jar 만 인쇄합니다.

일반적인 출력 :

$ 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

다음과 같은 서비스를 시도해 볼 수 있습니다.

또는

또는

  • 검색 기능이있는 메이븐 엔터프라이즈 저장소 (예 : Nexus (OFC, 찾고있는 jar가 색인화되어 저장소에 설치된 경우에만 작동 함)

추신 : Jarhoo는 Javacio.us와 협력하여 100,000 명의 Java 개발자가 Google 검색 결과와 통합 된 링크를 통해 Jarhoo에 무료로 액세스 할 수 있도록했습니다. Javacio.us 구독은 무료이며 Google 계정이있는 모든 사람에게 공개됩니다. 자세한 내용은 Javacio.usJarhoo 제안 페이지 를 방문하십시오 .


Windows에서 cmd.exe를 실행하고 다음을 입력합니다.

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

jar는 현재 디렉토리에 있어야합니다. For에는 디렉토리를 가져와 재귀 적으로 검색 할 수있는 / R 옵션도 있습니다.

Jar.exe가 경로에 없으면 @C : \ jdk \ bin \ jar.exe와 같은 작업을 수행 할 수 있습니다.


findjar.com을 사용해보십시오. 공개 도메인에있는 경우 가져와야합니다. alos mavenjava.com이 있습니다 (하지만 해당 사이트가 다운 된 것 같습니다)


내가 확인하는 내용을 볼 수 있도록 목록을 인쇄합니다. 대부분 lib / app 디렉토리를 찾고 있지만 찾기 대신 찾을 수 있습니다.

예 :

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

종속성을 처리하려는 시도에 대한 귀하의 의견을 감안할 때 내가 할 일은 사용중인 라이브러리에 초점을 맞추는 것입니다. 이것을 알면 클래스 경로에 어떤 jar가 있어야하는지 알 수 있으며 그것에주의를 기울일 수 있습니다. 또한 종속성 관리 빌더 (Maven과 Ant는 두 가지 인기있는 것임)가 있으며 내부에 종속성이있는 프로젝트를 패키지화 할 수 있습니다. 그러나 결국 어떤 종속성이 있는지 알고 해당 종속성에 대한 요구 사항에주의를 기울이는 것은 개발자의 몫입니다. 이것이 Eclipse와 같은 IDE를 사용하고 Maven 또는 Ant와 같은 빌드 도구를 사용하는 것이 큰 프로젝트에서 좋은 이유 중 하나입니다. 프로젝트에 대해 20 개의 종속성이있을 때 관리하기 어려울 수 있습니다.


나는 jarscan을 사용 합니다 . 찾고있는 클래스가 포함 된 jar에 대한 전체 폴더 구조를 재귀 적으로 검색 할 수있는 실행 가능한 jar 파일입니다. 클래스 이름, 패키지 이름 또는 정규식으로 검색합니다.


Windows PowerShell에서는이 명령을 사용할 수 있습니다. 만나는 모든 JAR 파일을 나열하지만 클래스를 찾는 위치를 쉽게 찾을 수있는 추가 행이 있습니다.

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

유용 할 것 같은 웹 사이트 있습니다. http://www.findjar.com/


.jar 찾기 | xargs grep com.ibm.websphere.security.auth.WSSubject


WSSubject를 계속 검색하는 경우 jar는 wssec.jar입니다. sas.jar 내부의 WSSecurityException 클래스


Maven, Eclipse 및 m2eclipse를 사용하는 것이 좋습니다.

1 단계-특정 가져 오기 추가

alt text

2 단계-원하는 병을 찾아서 다운로드 (자동으로)

alt text


Building up on Dan's excellent answer, the following script solves the problem of mangled output in case some of the jars are actually broken symlinks (while at the same time not skipping proper symlinks) It also searches in the current directory if no argument is provided.

#!/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

참고URL : https://stackoverflow.com/questions/1500141/find-a-jar-file-given-the-class-name

반응형