2009-06-30 32 views
44

Tôi có những điều sau đây trong một file java (MyRtmpClient.java):Cách ký tự đại diện bao gồm các tệp JAR khi biên dịch?

import org.apache.mina.common.ByteBuffer; 

ByteBuffer là bên trong một tập tin JAR (với cấu trúc thư mục thích hợp của khóa học). Tệp jar đó và những tệp khác tôi cần nằm trong cùng thư mục với tệp .java.

Sau đó, tôi biên dịch với các dòng:

javac -cp ".;*.jar" MyRtmpClient.java 

Nhưng tôi nhận được lỗi:

MyRtmpClient.java:3: package org.apache.mina.common does not exist
import org.apache.mina.common.ByteBuffer;

Làm thế nào tôi có thể bao gồm các file jar trong dự án của tôi?

Trả lời

26

dòng lệnh của bạn là đúng, nhưng có một số lưu ý:

  • bạn phải có javac> = 1.6, bởi vì chỉ có trong phiên bản trình biên dịch phân tích các "*" là tập tin JAR khác nhau.
  • bạn phải đang chạy Windows, vì ";" là phân tách đường dẫn cho hệ điều hành đó chỉ (nó không hoạt động trên Unix, dấu tách đường dẫn trên Unix là ":").

Tôi giả định rằng tệp JAR có cấu trúc thư mục thích hợp như bạn đã nêu.

+0

Thật sao? Tôi không biết rằng nó sẽ phân tích cú pháp *. Tôi đoán nó được một lúc kể từ khi tôi biên dịch bất cứ điều gì cần một classpath từ dòng lệnh. –

+0

Bạn có lẽ là câu trả lời cho tình huống khó xử của tôi. Tôi có JDK 1.5: ( –

+0

đây là nguồn: http://java.sun.com/javase/6/docs/technotes/tools/windows/javac.html#options – cd1

-2

thử bao gồm các tập tin jar trong dòng lệnh của bạn vậy:

javac MyRtmpClient.java ByteBuffer.jar

+0

Không, chắc chắn không phải. "Cách sử dụng: javac " –

+0

Tôi sẽ thử. Nhưng có rất nhiều người trong số họ. Tôi không thích ý tưởng bị buộc phải bao gồm tất cả các tập tin jar từng người một. –

16

javac không hiểu * .jar trong đối số classpath. Bạn cần xác định rõ ràng từng cái bình. ví dụ.

javac -cp ".;mina.jar" MyRtmpClient.java 
+0

Có, * thường được diễn giải bởi trình bao, nhưng ở đây nó không có cơ hội. –

+1

có, javac không hiểu * .jar trong đối số classpath. – cd1

+0

Tôi đã thử sử dụng * .jar trên Linux trước khi viết câu trả lời của tôi và nó không hoạt động. – Mark

8

Trong trường hợp của bạn, tôi nghĩ JAVAC không thể tìm thấy tệp jars.

Vui lòng thử:

PROJECT_PATH
- lib \ a.jar
- src \ gói \ b.java

cd @PROJECT_PATH 

javac -classpath lib\a.jar src\package\b.java 
+0

Trong trường hợp này, hãy sử dụng "javac -cp.; . \ lib \\ ** src \ package \ b ". Quy tắc đó sẽ khớp với các jars trong lib và cũng có các ký tự đại diện trong thư mục hiện tại. – djangofan

-2

Bạn không thể sử dụng -cp với Javac. Thay vào đó, bạn phải sử dụng -classpath (giả sử các cài đặt khác là chính xác).

4

lẽ dưới cú pháp sẽ làm việc trên cửa sổ dos lệnh

javac -cp ".;first.jar;second.jar;third.jar" MyRtmpClient.java 
+2

Bạn không cần dấu ngoặc kép trừ khi có khoảng trống trong classpath và trong trường hợp này, không có. – djangofan

6

Nếu bạn có tiện ích findtr theo ý của bạn (ví dụ như bạn đang làm việc Linux), bạn có thể làm:

javac -cp .:`find * -name "*.jar" | tr "\n" ":"` MyRtmpClient.java 

Tất cả các tệp jar trong thư mục hiện tại và tất cả các thư mục phụ của nó sẽ được thêm vào (lệnh shell liệt kê tất cả các tệp jar d đặt dấu hai chấm làm dấu phân cách giữa chúng).


Giải thích:

  • cặp backticks (') biểu thị các lệnh shell được thực thi,
  • find * -name "*.jar" phát hiện và liệt kê tất cả jar tập tin trong hệ thống phân cấp có gốc là thư mục hiện hành,
  • thanh dọc (|) là đường ống; kết nối đầu ra của find tới đầu vào của lệnh tiếp theo,
  • tr "\n" ":" thay thế tất cả newline nhân vật với ruột ký tự.
8

Trong javac JDK 6 trở lên Bạn có thể sử dụng (lưu ý thiếu .jar):

javac -cp ".;*" MyRtmpClient.java 

trích dẫn javac - Java programming language compiler

As a special convenience, a class path element containing a basename of * is considered equivalent to specifying a list of all the files in the directory with the extension .jar or .JAR.

For example, if directory foo contains a.jar and b.JAR, then the class path element foo/* is expanded to A.jar;b.JAR, except that the order of jar files is unspecified. All jar files in the specified directory, even hidden ones, are included in the list. A classpath entry consisting simply of * expands to a list of all the jar files in the current directory.

1

Trong Java 8, tùy chọn". ; * "vv được đề cập ở trên dường như không hoạt động. Tôi đã thử và thấy rằng: javac -cp '<location of jars>/*' MyRtmpClient.java

công trình:

<location of jar> có thể/usr/local/classes/* hay/home/nhà phát triển/MyProject/*

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