2010-12-11 16 views
33

czy istnieje narzędzie, które może wyświetlać "pakiety" innych firm, które zawierają klasy (strony trzeciej), do których odwołania znajdują się w pliku JAR? Powiedzmy, że rozpoznałby on pakiet "home" z definicji pliku JAR i wydrukowałby listę w pełni kwalifikowanych nazw klas stron trzecich do poziomu trzeciego, do których odwoływały się w JAR.Jak wyświetlić listę zależności JAR

org.apache.commons 
org.apache.maven 
javax.servlet.jsp 
org.eclipse.persistence 
org.apache.jackrabbit 

celem jest to, że muszę znaleźć zależności cech dla tego pliku JAR i wdrożyć go jako artefakt maven.

+2

Czy Maven nie jest przeznaczony właśnie w tym celu? – BalusC

+0

Wyobraź sobie, że masz projekt oparty na Ant i chcesz go wdrożyć w repozytorium maven, aby ktoś inny użył go jako zależności. Musisz określić jego przejściowe zależności w definicji pom. Potrzebuję sposobu, który ułatwiłby ich znalezienie. – lisak

+0

Edycja: wiem, jak to zrobić ręcznie, spędzając wiele wysiłku. Automatyczne rozpoznanie zależności powinno być teoretycznie możliwe, wszystkie informacje znajdują się już w .jar iw repozytorium Maven. –

Odpowiedz

25

JarAnalyzer:

narzędzie zarządzania zależność plików jar. Jego głównym celem jest przechodzenie przez katalog, analizowanie każdego z plików jar w tym katalogu i identyfikowanie zależności między plikami jar. Dane wyjściowe to plik xml reprezentujący plik JAR między PhysicalDependencies .

Aby uzyskać więcej informacji na PhysicalDependencies, w tym różnych wzorców projektowych, sprawdź Extensible Java ...

+0

Chrome ostrzega mnie, że witryna zawiera złośliwe oprogramowanie. –

+2

Nie ostrzega mnie, Paul. – MJB

+0

Hmm, tak, wydaje się, że odszedł. Przepraszamy za hałas. –

0

To może być alternatywa dla tego narzędzia. Ale nie wylistuje przywoływanych klas. Ostatnia liczba określa "poziom pakietu".

jar tvf yourjar.jar | perl -nle'BEGIN{$depth=(shift)-1}print join(".", (split(/\//, (split)[-1]))[0..$depth])' 3 

Problem polega na tym, że niemożliwe jest uzyskanie odwołań do klas z definicji klas. Wydaje się, że jedynym możliwym sposobem jest zrobienie tego w JAVA.

Pytanie brzmi: Czy istnieje jakieś narzędzie Java, które może to zrobić?

EDIT:

znalazłem to, czego potrzebowałem: M2eclipse posiada funkcję o nazwie Klasa wyszukiwania

W Maven przeglądania repozytoriów, kliknij prawym przyciskiem repozytorium i umożliwienia pełnego indeksu

następnie przejdź> Otwórz typ od maven - tam możesz przejrzeć wszystkie artefakty dostępne na podstawie konwencji pakietu java

+0

Jak się tam dostać. Teraz musisz zmienić listę pakietów w listę słoików, które je zawierają. Lista byłaby duża (wiele wersji bibliotek), więc chciałbyś sprawdzić kompatybilność interfejsu i znaleźć najlepiej pasującą - byłoby dużo pracy do napisania, ale brzmi to wykonalnie. Nazwałbym to 'autolinkerem' –

+0

I co przeszukuję, aby znaleźć JAR? lokalne repozytorium maven? W tej sytuacji niemożliwe byłoby przeszukiwanie zdalnego remarketingu maven. – lisak

1

Jeśli twoja jest projektem opartym na mavenach

mvn dependency:build-classpath -Dmdep.pathSeparator=":" -Dmdep.prefix='' -Dmdep.fileSeparator=":" -Dmdep.outputFile=classpath 

Spójrz na poniższy link http://maven.apache.org/plugins/maven-dependency-plugin/build-classpath-mojo.html

może być w Twoim przypadku

mvn dependency:build-classpath -Dmdep.pathSeparator=":" -Dmdep.prefix='' -Dmdep.fileSeparator=":" -Dmdep.outputFile=classpath -f pathtopom.xml of third party 
+0

Punktem tego pytania jest wymienienie wszystkich klas przywołanych w pliku JAR w formie czytelnej dla człowieka: od 3 do 5 poziomu: "org.apache.commons.blabla". ... aby ustawić listę zależności dla pliku JAR, aby wdrożyć go jako artefakt maven – lisak

+0

Możesz odczytać dane wyjściowe wytworzone przez powyższe polecenie i użyć go do wdrożenia! – srinannapa

+0

Wyglądasz, wszystko, co masz, to jakiś JAR i chcesz stworzyć definicję pom i zająć się nim jako artefaktem ... Nie mam żadnego maven projektu ... Po prostu chcę zdefiniować jego przejściowe zależności ... I nie jestem pewna, że ​​rozumiesz, o co chodzi w tym pytaniu. – lisak

2

Moją pierwszą myślą było to, że można to zrobić za pomocą programu ładującego klasy iteracyjne nad wszystkie pliki klas w słoiku i użyj refleksji, aby przeanalizować każdy z nich pod kątem zależności. Jednak klasa Class nie ma metody, która przekazuje ci tę informację. Tak więc następną myślą byłoby użycie jakiegoś analizatora bajtów (na przykład), aby wyciągnąć wszystkie przywoływane klasy z klasy kompilacji.

Zakładając, że możesz zdobyć te informacje, następnym problemem będzie powrót do śledzenia klas do słoików.W pewnym sensie byłaby to łatwa część, ponieważ wszystko, co musisz zrobić, to stworzyć moduł ładujący klasy dla każdego słoika w swoim maven repo, katalogu lub gdziekolwiek są słoiki, a następnie zapytać każdego z nich, czy zawierał on określoną klasę.

Wadą tego myślenia jest to, że klasa java (surowe źródło lub skompilowana) nie określa, skąd pobrać importowaną klasę. Więc jeśli masz dwie klasy o tym samym pakiecie i nazwie (dzieje się to częściej niż myślisz), to nie będziesz w stanie stwierdzić, którego użyć.

Nawet java zakłada, że ​​pierwszy znaleziony w ścieżce klasy jest prawidłowy i zgłasza wyjątek, jeśli okaże się niepoprawny (MethodNotFoundException). Więc jeśli nie zamierzasz dalej analizować kodu bajtowego, aby dowiedzieć się, jakie metody na poszczególnych klasach są wywoływane, a następnie porównać je z klasami w ścieżce klasy, nadal nie będziesz w stanie być poprawny.

Krótko mówiąc, prawdopodobnie można robić, co się chce, ale może być bardzo trudne i czasochłonne.

Sposób, w jaki normalnie radzić sobie z tym jest po prostu odpalić klasy w kodzie testowym i dodajemy zależności dopóki mogę je wykonać każdą metodę jestem zainteresowany.

+0

Cześć Derek, dziękuję za twoje myśli. Byłoby to dość wymagające. Przyjmuję odpowiedź MJB, ponieważ JarAnalyzer jest dokładnie tym, czego szukałem. Jeśli obsługuje rekursywne wyszukiwanie katalogów, praktycznie zawiera listę wymaganych zależności. Bez numerów wersji i użytecznego wyjścia, ale możesz ustawić definicję pom bardzo łatwo. – lisak

3

Jeśli używasz Maven (jak Zrozumiałem), możesz po prostu użyć wtyczki Maven Dependency.

Najpierw musisz napisać podstawowe pom.xml ze wszystkimi swoimi słoików, można skopiować ten przykład (używam hibernacji jako przykład), i zastąpić swoimi słoiki:

<?xml version="1.0" encoding="UTF-8"?> 
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
     <modelVersion>4.0.0</modelVersion> 
     <groupId>com.mycompany.app</groupId> 
     <artifactId>my-app</artifactId> 
     <version>1.0-SNAPSHOT</version> 
     <packaging>jar</packaging> 
     <name>Maven Quick Start Archetype</name> 
     <url>http://maven.apache.org</url> 
     <dependencies> 
      <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-core</artifactId> 
      <version>3.5.0-Final</version> 
      </dependency> 
<!-- add here other dependencies --> 
     </dependencies> 
    </project> 

następnie otworzyć terminal wchodzić zawierający folder pom.xml powyżej i uruchom polecenie:

mvn zależność: drzewo

będzie wydrukować listę zależności ...

lub jeśli chcesz pobrać i skopiować w folderze wszystkie zależności uruchom następujące polecenie:

mvn zależnościami: copy-zależnościami

znajdą Państwo wszystkie zależności w folderze ./target/dependencies

2

Tattleltale jest narzędziem z JBoss, który robi to

tattletale.jboss.org/

7

można wykonać następujące czynności (jeśli jego projekt maven):

mvn dependency:tree 

Pokazuje także zależności przechodnie, co bardzo pomaga w debugowaniu konfliktów zależności.

Powiązane problemy