2012-07-12 32 views
11

Được rồi, tôi rất mới đối với linux và dòng lệnh, và khá mới đối với java. Tôi đã thực tập một chương trình java. Cuối cùng tôi đã làm cho nó được thực hiện trên máy tính của tôi (cửa sổ) và bây giờ tôi phải di chuyển nó vào một máy linux để kiểm tra và sau đó có nó chạy như là một thực thi. Tôi đã làm nhiều việc đọc và nghiên cứu về Linux và hiểu các classpath nhưng nó vẫn rất khó để hiểu đầy đủ. Nó chỉ là không nhấp cho tôi được nêu ra. Bất cứ ai có thể giải thích mục đích của classpath một cách đơn giản bằng cách sử dụng các ví dụ? Một trong những khía cạnh khó hiểu nhất đối với tôi là xác định đường dẫn vật lý đến cái bình. Tôi có bắt đầu tất cả các cách từ usr hay tôi chỉ cần bắt đầu từ thư mục jvm? Nếu nó quan trọng, chương trình java của tôi không nằm trong thư mục jvm. Có ai có thể làm sáng tỏ cho tôi không?Cách thêm nhiều tệp jar trong classpath trong linux

EDIT: cảm ơn các bạn rất nhiều vì sự giúp đỡ của bạn, tôi không thể nói rằng tôi hoàn toàn rõ ràng nhưng sự hiểu biết của tôi về tình hình của tôi tốt hơn rất nhiều.

+0

Bản sao có thể có của [Bao gồm tất cả các lọ trong một thư mục trong đường dẫn lớp Java] (https://stackoverflow.com/questions/219585/including-all-the-jars-in-a-directory -within-the-java-classpath) – Stewart

Trả lời

10

Bạn sử dụng đối số -classpath. Bạn có thể sử dụng đường dẫn tương đối hoặc tuyệt đối. Điều đó có nghĩa là bạn có thể sử dụng một đường dẫn liên quan đến thư mục hiện tại của bạn, HOẶC bạn có thể sử dụng đường dẫn tuyệt đối bắt đầu tại gốc /.

Ví dụ:

bash$ java -classpath path/to/jar/file MyMainClass 

Trong ví dụ này main chức năng nằm ở MyMainClass và sẽ được đưa vào nơi nào đó trong file jar.

Để biên dịch bạn cần phải sử dụng javac

Ví dụ:

bash$ javac -classpath path/to/jar/file MyMainClass.java 

Bạn cũng có thể chỉ định classpath qua biến môi trường, hãy làm theo :

bash$ export CLASSPATH="path/to/jar/file:path/tojar/file2" 
bash$ javac MyMainClass.java 

Đối với bất kỳ java thường phức tạp dự án bạn nên tìm kịch bản kiến ​​có tên build.xml

+1

Vì vậy, nếu chương trình java mà tôi đang cố gắng biên dịch có tên là SnortMonitor, ví dụ của bạn sẽ thay đổi thành: bash $ java -classpath path/tới/jar/file SnortMonitor –

+1

Ah để biên dịch bạn cần để gọi 'javac' thay vì' java', nhưng bạn vẫn sử dụng -classpath và thư mục nguồn. – Petriborg

+0

thankyou cho sự giúp đỡ của bạn nhưng bạn có thể xin vui lòng cụ thể hơn một chút? Có lẽ vì tôi thiếu hiểu biết. Khi tôi viết "javac SnortMonitor.java, tôi nhận được một danh sách các lỗi và tôi biết nó vì tôi cần bao gồm 2 tệp jar từ một thư mục có tên là jsendnsca.Tôi có cần bao gồm các lọ đó trong classpath mỗi lần tôi biên dịch và chạy chương trình không? –

5

Đường dẫn lớp là nơi diễn ra trình biên dịch java (lệnh: javac) và giao diện JVM (lệnh: java) để tìm các lớp mà ứng dụng của bạn tham chiếu. Có nghĩa là gì đối với một ứng dụng tham chiếu đến một lớp học khác? Nói một cách đơn giản, nó có nghĩa là sử dụng lớp đó ở đâu đó trong mã của nó:

Ví dụ:

public class MyClass{ 
    private AnotherClass referenceToAnotherClass; 
    ..... 
} 

Khi bạn cố gắng để biên dịch này (javac) trình biên dịch sẽ cần lớp AnotherClass. Cũng giống như khi bạn cố chạy ứng dụng của mình: JVM sẽ cần lớp AnotherClass. Để tìm lớp này, javac và JVM sẽ tìm một (các) địa điểm cụ thể. Những địa điểm này được chỉ định bởi classpath mà trên linux là một danh sách phân tách các thư mục được phân cách bằng dấu hai chấm (các thư mục mà javac/JVM sẽ tìm để xác định vị trí của AnotherClass khi chúng cần).

Vì vậy, để biên dịch lớp học của bạn và sau đó để chạy nó, bạn nên đảm bảo rằng classpath chứa thư mục chứa lớp AnotherClass. Sau đó, bạn gọi nó như sau:

javac -classpath "dir1;dir2;path/to/AnotherClass;...;dirN" MyClass.java //to compile it 
java -classpath "dir1;dir2;path/to/AnotherClass;...;dirN" MyClass //to run it 

Các lớp thông thường có dạng "gói" được gọi là tệp/thư viện jar.Trong trường hợp này, bạn phải chắc chắn rằng jar chứa các lớp AnotherClass là trên classpaht của bạn:

javac -classpath "dir1;dir2;path/to/jar/containing/AnotherClass;...;dirN" MyClass.java //to compile it 
java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;...;dirN" MyClass //to run it 

Trong ví dụ trên, bạn có thể xem làm thế nào để biên dịch một lớp (MyClass.java) nằm trong thư mục làm việc và sau đó chạy lớp được biên dịch (Lưu ý "." ở đầu đường dẫn lớp mà viết tắt của thư mục hiện tại). Thư mục này cũng phải được thêm vào classpath. Nếu không, JVM sẽ không thể tìm thấy nó.

Nếu bạn có lớp học trong tệp jar, như bạn đã chỉ định trong câu hỏi, thì bạn phải đảm bảo rằng bình cũng nằm trong đường dẫn lớp, cùng với các thư mục còn lại cần thiết.

Ví dụ:

java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;path/to/MyClass/jar...;dirN" MyClass //to run it 

hoặc tổng quát hơn (giả sử một số hệ thống phân cấp gói):

java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;path/to/MyClass/jar...;dirN" package.subpackage.MyClass //to run it 

Để tránh thiết lập classpath mọi lúc bạn muốn chạy một ứng dụng mà bạn có thể định nghĩa một biến môi trường được gọi là CLASSPATH.

Trong Linux, tại dấu nhắc lệnh:

export CLASSPATH="dir1;dir2;path/to/jar/containing/AnotherClass;...;dirN" 

hoặc chỉnh sửa ~/.bashrc và thêm dòng này ở đâu đó ở cuối;

Tuy nhiên, đường dẫn lớp có thể thay đổi thường xuyên, vì vậy, bạn có thể muốn đặt classpath thành tập hợp các thư mục cốt lõi, bạn cần thường xuyên và sau đó mở rộng đường dẫn lớp mỗi lần bạn chỉ cần cho phiên đó. Như thế này:

export CLASSPATH=$CLASSPATH:"new directories according to your current needs" 
+0

Tôi có phải định nghĩa các đường dẫn lớp này mỗi lần tôi muốn biên dịch và chạy không? –

+0

Tôi đã chỉnh sửa câu trả lời của mình – Razvan

16

Giả sử bạn có nhiều tệp jar a.jar, b.jar và c.jar. Để thêm chúng vào classpath khi biên dịch bạn cần làm

$javac -cp .:a.jar:b.jar:c.jar HelloWorld.java 

Để chạy làm

$java -cp .:a.jar:b.jar:c.jar HelloWorld 
0

Bước 1.

vi ~/.bashrc 

Bước 2. Nối dòng này vào cuối cùng:

export CLASSPATH=$CLASSPATH:/home/abc/lib/*; (Assuming the jars are stored in /home/abc/lib) 

Bước 3.

source ~/.bashrc 

Sau khi các bước này tiếp tục trực tiếp và chạy chương trình của bạn (ví dụ: javac xyz.java)

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