2012-05-03 20 views
11

Tôi đã sử dụng các hướng dẫn được tìm thấy tại https://stackoverflow.com/a/5893391/14731 để thêm mục nhập tùy ý vào thuộc tính Class-Path. Dưới đây là tập tin MANIFEST.MF của tôi:JAR thực thi bỏ qua thuộc tính Class-Path của riêng mình

Manifest-Version: 1.0 
Class-Path: jace-runtime.jar 
Main-Class: org.jace.examples.Test 

tôi xác định org.jace.examples.Test như sau:

public class Test 
{ 
    public static void main(String[] args) 
    { 
     System.out.println("classpath: " + System.getProperty("java.class.path")); 
     System.out.println("PeerExample: " + Class.forName("org.jace.util.ShutdownHook")); 
    } 
} 

nơi org.jace.util.ShutdownHook được định nghĩa trong jace-runtime.jar. Khi tôi gọi java -jar peer_example1.jar tôi nhận được kết quả như sau:

classpath: peer_example1.jar ngoại lệ trong chủ đề java.lang.ClassNotFoundException "chính": org.jace.util.ShutdownHook

Nói cách khác, Java được bổ sung thêm file JAR thực thi đến classpath nhưng bỏ qua Class-Path. Nếu tôi gọi java -cp jace-runtime.jar;peer_example1.jar org.jace.examples.Test tôi nhận được kết quả mong muốn:

classpath: jace-runtime.jar;peer_example1.jar

Bất kỳ ý tưởng?

+0

Bạn có thể cần ../jace-runtime.jar nếu gốc jar được coi là thư mục làm việc hiện tại. –

+0

@MarkoTopolnik: Tôi vừa thử nó. Nó không hoạt động. – Gili

+2

Nhưng bạn đã thử truy cập một lớp trong bình khác chưa?Có vẻ như java.class.path không phản ánh đường dẫn lớp được đọc từ tệp kê khai. –

Trả lời

12

Trả lời câu hỏi của riêng tôi:

  1. Thêm mục tùy ý để Class-Path là tốt ngày của riêng mình. Vấn đề nảy sinh khi bạn kích hoạt JAR lập chỉ mục sử dụng:

    <configuration> 
        <archive> 
        <index>true</index> 
        </archive> 
    </configuration> 
    

    Maven sẽ bỏ qua mục của bạn từ META-INF/INDEX.LIST.

  2. Khi bạn sử dụng JAR khi chạy, Java sẽ xem INDEX.LIST để tìm các lớp, chứ không phải MANIFEST.MF.

  3. Vì các mục nhập của bạn bị thiếu trong INDEX.LIST, chúng sẽ không được tìm thấy bởi trình nạp lớp, bất kể tệp kê khai nói gì.

Cách giải quyết đơn giản là tắt tính năng lập chỉ mục JAR. Tôi không chắc chắn làm thế nào để tiêm một tùy ý Class-Path với lập chỉ mục được kích hoạt.

-3

mỗi trang tooldocs cho các tùy chọn jar - Link to docs

Khi bạn sử dụng tùy chọn này, tập tin JAR là nguồn gốc của mọi tầng lớp người dùng, và các thiết lập con đường sử dụng lớp khác được bỏ qua.

+1

-1: Tài liệu tham chiếu đến thực tế là tùy chọn dòng lệnh '-cp/-classpath' bị bỏ qua vì lợi ích của' Lớp-đường dẫn' mà tôi đang sử dụng, vì vậy đây không phải là vấn đề. – Gili

0

Đối với những người có thể không biết, cơ chế lưu trữ thực thi có đường dẫn lớp kê khai và sử dụng nó để tải lớp học bên ngoài vào lưu trữ.

Vì vậy, nếu bạn đang mong đợi WAR có đường dẫn tệp kê khai của WEB-INF/classes để tìm lớp trong mục WEB-INF/classes bên trong thì bạn sẽ thất vọng.

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