2010-12-11 29 views
33

là có một công cụ có thể liệt kê các gói "bên thứ ba" của bên thứ ba chứa các lớp (bên thứ ba) được tham chiếu trong JAR không? Giả sử rằng nó sẽ nhận ra gói "home" từ định nghĩa tệp JAR và nó sẽ in ra một danh sách các tên đầy đủ của các lớp bên thứ ba lên đến cấp 3 đã được tham chiếu trong JAR.Làm thế nào để liệt kê các phụ thuộc của một JAR

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

mục đích là tôi cần tìm phụ thuộc maven cho tệp JAR đó và triển khai nó dưới dạng tạo tác maven.

+2

Không phải Maven cho mục đích chính xác này? – BalusC

+0

Hãy tưởng tượng rằng bạn có một dự án dựa trên Ant và bạn muốn triển khai nó vào kho lưu trữ maven cho người khác để sử dụng nó như là một sự phụ thuộc. Bạn phải xác định phụ thuộc transitive của nó trong định nghĩa pom. Tôi cần một cách để dễ dàng tìm kiếm chúng – lisak

+0

Chỉnh sửa: Tôi biết cách thực hiện thủ công, tốn nhiều công sức. Độ phân giải phụ thuộc tự động nên về lý thuyết có thể, tất cả thông tin có trong .jar và trong kho lưu trữ Maven rồi. –

Trả lời

25

JarAnalyzer:

một tiện ích quản lý phụ thuộc cho các tập tin jar. Mục đích chính là duyệt qua một thư mục, phân tích từng tệp jar trong thư mục đó và xác định các phụ thuộc giữa các tệp jar. Đầu ra là tệp xml đại diện cho PhysicalDependencies giữa các tệp jar.

Để biết thêm thông tin về PhysicalDependencies, bao gồm một loạt các mẫu thiết kế, kiểm tra Extensible Java ...

+0

Chrome cảnh báo tôi rằng trang web chứa phần mềm độc hại. –

+2

Không cảnh báo tôi là Paul. – MJB

+0

Hmm, có vẻ như đã biến mất. Xin lỗi vì tiếng ồn. –

0

Đây có thể là giải pháp thay thế cho công cụ này. Nhưng nó không liệt kê các lớp được tham chiếu. Số cuối cùng xác định "mức gói".

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

Vấn đề là, theo cách này, không thể lấy các lớp được tham chiếu ngoài định nghĩa lớp học. Vì vậy, cách duy nhất có thể có vẻ là làm điều đó trong JAVA.

Câu hỏi đặt ra là: Có công cụ Java nào có thể thực hiện được không?

EDIT:

tôi thấy những gì tôi cần: M2eclipse có một tính năng gọi là Lớp tìm kiếm

Trong maven kho xem, nhấn chuột phải một kho lưu trữ và cho phép chỉ số đầy đủ

Sau đó Navigate> Mở loại từ maven - ở đó bạn có thể xem qua tất cả các hiện vật có sẵn dựa trên quy ước gói java

+0

Đến đó. Bây giờ bạn cần phải chuyển danh sách các gói thành danh sách các lọ chứa chúng. Danh sách sẽ lớn (nhiều phiên bản của thư viện), vì vậy bạn muốn kiểm tra khả năng tương thích của giao diện và tìm đối sánh phù hợp nhất - nó sẽ có nhiều công việc để viết, nhưng nó nghe có vẻ khả thi. Tôi sẽ gọi nó là 'autolinker' –

+0

Và tôi sẽ tìm kiếm thông tin gì để tìm các JAR? kho lưu trữ maven cục bộ? Nó sẽ không thể tìm kiếm thông qua repo maven từ xa trong tình huống này – lisak

1

Nếu bạn là một dự án dựa trên maven

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

Nhìn vào liên kết dưới đây http://maven.apache.org/plugins/maven-dependency-plugin/build-classpath-mojo.html

Có thể trong trường hợp của bạn

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

Điểm của câu hỏi này là liệt kê tất cả các lớp được tham chiếu trong một JAR trong một biểu mẫu có thể đọc được của con người: lên đến cấp 3 - 5: "org.apache.commons.blabla". ... để thiết lập một danh sách phụ thuộc cho JAR để triển khai nó như một tạo tác maven – lisak

+0

Bạn có thể đọc đầu ra được tạo ra bởi lệnh trên và sử dụng nó để triển khai! – srinannapa

+0

nhìn, tất cả những gì bạn có là một số JAR và bạn muốn tạo một định nghĩa pom cho nó và triển khai nó như một tạo tác ... Tôi không có dự án maven nào ... Tôi chỉ muốn định nghĩa các phụ thuộc chuyển tiếp của nó ... 'không chắc bạn hiểu điểm của câu hỏi này là gì – lisak

2

Suy nghĩ đầu tiên của tôi là bạn có thể làm điều này bằng cách sử dụng một bộ nạp lớp để lặp qua tất cả các tệp lớp trong jar và sử dụng sự phản chiếu để phân tích từng tệp cho sự phụ thuộc của chúng. Tuy nhiên, lớp Class không có phương thức nào cho bạn biết thông tin này. Vì vậy, suy nghĩ tiếp theo sẽ là sử dụng một số loại phân tích bytecode (ví dụ: asm) để rút ra tất cả các lớp được tham chiếu từ một lớp biên dịch.

Giả sử rằng bạn có thể nhận được thông tin này, vấn đề tiếp theo sẽ là để theo dõi các lớp trong lọ.Trong một nghĩa nào đó, đây sẽ là phần dễ dàng bởi vì tất cả những gì bạn cần làm là tạo một trình nạp lớp cho mỗi jar trong repo maven của bạn, hoặc thư mục hoặc bất cứ nơi nào các lọ, và sau đó hỏi từng cái một nếu nó chứa lớp cụ thể.

Lỗ hổng trong suy nghĩ đó là một lớp java (nguồn thô hoặc được biên dịch) không chi tiết nơi để có được lớp được nhập từ đó. Vì vậy, nếu bạn có hai lớp học với cùng một gói và tên (xảy ra thường xuyên hơn bạn có thể nghĩ), sau đó bạn sẽ không thể nói được sử dụng.

Ngay cả java chỉ giả định rằng đầu tiên nó tìm thấy trong đường dẫn lớp là đúng và ném một ngoại lệ nếu nó hóa ra là không chính xác (MethodNotFoundException). Vì vậy, trừ khi bạn sẽ phân tích sâu hơn bytecode để tìm ra phương thức nào trên mỗi lớp được gọi và sau đó so sánh những phương thức với các lớp trong đường dẫn lớp của bạn, bạn vẫn sẽ không thể đúng.

Tóm lại, có thể bạn sẽ làm những gì bạn muốn, nhưng có thể sẽ rất khó khăn và mất thời gian.

Con đường tôi thường đối phó với điều này chỉ đơn giản là cháy lên lớp trong mã thử nghiệm và tiếp tục bổ sung phụ thuộc cho đến khi tôi có thể lấy nó để thực hiện tất cả các phương pháp Tôi quan tâm đến.

+0

Xin chào Derek, cảm ơn vì những suy nghĩ của bạn. Nó sẽ là khá thời gian đòi hỏi. Tôi sẽ chấp nhận câu trả lời của MJB vì JarAnalyzer chính xác là những gì tôi đang tìm kiếm. Nếu nó hỗ trợ tìm kiếm thư mục đệ quy, nó thực tế sẽ liệt kê các phụ thuộc maven mà bạn cần. Không có số phiên bản và đầu ra có thể sử dụng, nhưng bạn có thể thiết lập định nghĩa pom khá dễ dàng với nó. – lisak

3

Nếu bạn sử dụng maven (như Tôi hiểu), bạn chỉ có thể sử dụng plugin Maven Dependency.

Trước tiên, bạn cần phải viết một pom.xml cơ bản với tất cả các lọ, bạn có thể sao chép ví dụ này (tôi sử dụng ngủ đông làm ví dụ), và thay thế lọ của bạn:

<?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> 

terminal sau đó mở, đi vào thư mục chứa các pom.xml trên và chạy lệnh này:

mvn phụ thuộc: cây

này sẽ in một danh sách phụ thuộc ...

hoặc nếu bạn muốn tải về và copy vào thư mục tất cả phụ thuộc chạy lệnh sau:

mvn phụ thuộc: sao chép phụ thuộc

bạn sẽ tìm thấy tất cả các phụ thuộc của bạn trong thư mục ./target/dependencies

2

Tattleltale là một công cụ từ JBoss mà thực hiện điều này

tattletale.jboss.org/

7

Bạn có thể làm như sau (nếu nó là một dự án maven):

mvn dependency:tree 

Nó cũng hiển thị các phụ thuộc chuyển tiếp, làm cho nó rất hữu ích để gỡ lỗi xung đột phụ thuộc.

4

Có một công cụ mới kể từ JDK 8: jdeps

https://wiki.openjdk.java.net/display/JDK8/Java+Dependency+Analysis+Tool

jdeps là một công cụ dòng lệnh mới được bổ sung từ JDK 8 cho các nhà phát triển sử dụng để hiểu sự phụ thuộc tĩnh của các ứng dụng của họ và thư viện. jdeps là công cụ phân tích tĩnh trên các tệp lớp đã cho

Các vấn đề liên quan