Bao gồm tất cả các tệp trong một thư mục trong đường dẫn Java


1019

Có cách nào để bao gồm tất cả các tệp jar trong một thư mục trong đường dẫn lớp không?

Tôi đang cố gắng java -classpath lib/*.jar:. my.package.Programvà không thể tìm thấy các tệp lớp chắc chắn trong các lọ đó. Tôi có cần thêm từng tệp jar vào đường dẫn riêng không?


3
Xin lỗi tôi chưa bao giờ chấp nhận điều này. Nó phải là một wiki cộng đồng. Không bao giờ sử dụng một trong những câu trả lời được cung cấp. Tôi tin rằng tôi đã tạo một tập lệnh shell chỉ quét thư mục lib / và tạo đường dẫn lớp từ phân tích tên tệp.
Chris Serra

Có một số loại lỗi trong tính năng Java mới này, vì nó không hoạt động như mô tả. Tôi đã từ bỏ và sử dụng Ant để làm việc xung quanh nó, như được mô tả trong một trong những câu trả lời.
Alex R


1
Có vấn đề với xử lý ký tự đại diện trong Windows. stackoverflow.com/questions/11607873/
Mạnh

6
Câu trả lời ngắn: (1) bỏ .jarphần, (2) phải có ít nhất 2 phần, cách nhau bởi một ;trên Windows (thường :ở nơi khác). Ví dụ:java -classpath ".;lib/*" Program
Evgeni Sergeev

Câu trả lời:


1160

Sử dụng Java 6 trở lên, tùy chọn classpath hỗ trợ các ký tự đại diện. Lưu ý những điều dưới đây:

  • Sử dụng dấu ngoặc kép thẳng ( ")
  • Sử dụng *, không*.jar

các cửa sổ

java -cp "Test.jar;lib/*" my.package.MainClass

Unix

java -cp "Test.jar:lib/*" my.package.MainClass

Điều này tương tự như Windows, nhưng sử dụng :thay vì ;. Nếu bạn không thể sử dụng ký tự đại diện, hãy bashcho phép cú pháp sau ( libthư mục chứa tất cả các tệp lưu trữ Java):

java -cp $(echo lib/*.jar | tr ' ' ':')

(Lưu ý rằng việc sử dụng đường dẫn lớp không tương thích với -jar tùy chọn. Xem thêm: Thực thi tệp jar với nhiều thư viện đường dẫn từ dấu nhắc lệnh )

Hiểu ký tự đại diện

Từ Classpath tài liệu :

Các mục nhập đường dẫn lớp có thể chứa ký tự đại diện tên cơ sở *, được coi là tương đương với việc chỉ định danh sách tất cả các tệp trong thư mục có phần mở rộng .jarhoặc .JAR. Ví dụ, mục nhập đường dẫn lớp foo/*chỉ định tất cả các tệp JAR trong thư mục có tên foo. Một mục classpath chỉ đơn giản là* mở rộng ra một danh sách tất cả các tệp jar trong thư mục hiện tại.

Một mục nhập đường dẫn lớp chứa *sẽ không khớp với các tệp lớp. Để khớp cả hai lớp và tệp JAR trong một thư mục foo, hãy sử dụng foo;foo/*hoặc foo/*;foo. Thứ tự được chọn xác định xem các lớp và tài nguyên trong foođược tải trước các tệp JAR foohay ngược lại.

Các thư mục con không được tìm kiếm đệ quy. Ví dụ: chỉ foo/*tìm các tệp JAR foo, không phải trongfoo/bar , foo/bazvv

Thứ tự mà các tệp JAR trong một thư mục được liệt kê trong đường dẫn lớp mở rộng không được chỉ định và có thể thay đổi từ nền tảng đến nền tảng và thậm chí từ khoảnh khắc này sang khoảnh khắc khác trên cùng một máy. Một ứng dụng được xây dựng tốt không nên phụ thuộc vào bất kỳ thứ tự cụ thể nào. Nếu một thứ tự cụ thể được yêu cầu thì các tệp JAR có thể được liệt kê rõ ràng trong đường dẫn lớp.

Việc mở rộng các ký tự đại diện được thực hiện sớm, trước khi gọi phương thức chính của chương trình, thay vì muộn, trong quá trình nạp lớp. Mỗi phần tử của đường dẫn lớp đầu vào chứa ký tự đại diện được thay thế bằng chuỗi các phần tử (có thể trống) được tạo bằng cách liệt kê các tệp JAR trong thư mục được đặt tên. Ví dụ, nếu thư mục foochứa a.jar, b.jarc.jar, thì đường dẫn lớp foo/*được mở rộng thành foo/a.jar;foo/b.jar;foo/c.jarvà chuỗi đó sẽ là giá trị của thuộc tính hệ thống java.class.path.

Biến CLASSPATHmôi trường không được xử lý khác với tùy chọn dòng lệnh -classpath(hoặc -cp). Đó là, ký tự đại diện được vinh danh trong tất cả các trường hợp. Tuy nhiên, các ký tự đại diện đường dẫn lớp không được vinh danh trong Class-Path jar-manifesttiêu đề.

Lưu ý: do lỗi đã biết trong java 8, các ví dụ về cửa sổ phải sử dụng dấu gạch chéo ngược trước các dấu hoa thị: https://bugs.openjdk.java.net/browse/JDK-8131329


2
Tính năng này được ghi lại kém và dường như yêu cầu một số điều kiện trước không rõ ràng phải được thỏa mãn để hoạt động như dự định.
Alex R

1
+1 cho thủ thuật bash / tr cuối cùng. Java / JamVM ở đây không thích các ký tự đại diện cho các đường dẫn bên ngoài thư mục làm việc, nhưng tham chiếu rõ ràng từng JAR bằng cách sử dụng shell wildcard + trhoạt động!
Supr

1
Tôi có một lệnh java -classpath /jars/*:/anotherJarsDir/* com.test.MyClassmà không có bất kỳ trích dẫn và nó hoạt động tốt. Tôi đang tự hỏi tại sao shell không mở rộng nó và lỗi?
yellavon

3
Cũng không sử dụng ~trong -cp
Sohail Si

1
Ví dụ về cửa sổ của bạn không hoạt động với java 8 hoặc sớm hơn, nhưng với classpath này: Test.jar; lib \ * ... dấu gạch chéo về phía trước là ổn trừ khi trước dấu hoa thị và một vài dấu hiệu khác ... xem bug.openjdk. java.net/browse/JDK-8131329
philwalk

226

Dưới cửa sổ này hoạt động:

java -cp "Test.jar;lib/*" my.package.MainClass

và điều này không hoạt động:

java -cp "Test.jar;lib/*.jar" my.package.MainClass

chú ý * .jar, vì vậy nên sử dụng ký tự đại diện * một mình .


Trên Linux, các công việc sau:

java -cp "Test.jar:lib/*" my.package.MainClass

Các dấu phân cách là dấu hai chấm thay vì dấu chấm phẩy.


17
Câu trả lời hoàn hảo. 2 điều quan trọng cần chú ý: 1) Sử dụng dấu ngoặc kép và 2) Chỉ sử dụng *, không * .jar
Wim Deblauwe

4
Một năm và 8 tháng sau, bản chỉnh sửa tôi thực hiện để bao gồm phiên bản UNIX đã giúp tôi tiết kiệm một lần nữa. :) Hài hước làm sao nó không nhận ra các tập tin jar của tôi *.jarnhưng chỉ với *.
jmort253

Tôi thấy rằng thứ tự của các đường dẫn là quan trọng (nhưng tôi không biết tại sao). Tôi đã nhận được lỗi cho đến khi tôi chuyển thứ tự các đường dẫn lớp.
dùng13107

@ jmort253, điều này là, đây không phải là vỏ * mở rộng, nhưng ký tự đại diện là java phân tích cú pháp lớp, nhìn thấy * và điền vào ký tự đại diện
Sebastian

1
@SebastianGodelet - Yeh, đó chỉ là tôi bị nhầm lẫn giữa các ký tự đại diện Regex và ký hiệu này, không giống như tôi đoán. Hầu hết, những gì đã cứu tôi là biết sự khác biệt giữa :trên nền tảng này và nền tảng ;khác. :) Tôi biên dịch với Java từ dòng lệnh khoảng một lần mỗi năm, chỉ đủ để không nhớ mức độ thường xuyên đủ gây khó chịu.
jmort253

67

Chúng tôi nhận được xung quanh vấn đề này bằng cách triển khai một chính file jar myapp.jarcó chứa manifest ( Manifest.mf) tập tin xác định một classpath với lọ cần khác, mà sau đó được triển khai song song với nó. Trong trường hợp này, bạn chỉ cần khai báo java -jar myapp.jarkhi chạy mã.

Vì vậy, nếu bạn triển khai chính jarvào một thư mục nào đó, rồi đặt các lọ phụ thuộc vào một libthư mục bên dưới, tệp kê khai trông như sau:

Manifest-Version: 1.0
Implementation-Title: myapp
Implementation-Version: 1.0.1
Class-Path: lib/dep1.jar lib/dep2.jar

NB: đây là độc lập với nền tảng - chúng ta có thể sử dụng cùng một lọ để khởi chạy trên máy chủ UNIX hoặc trên PC Windows.


Điều này dường như hoạt động đối với nhiều người, tuy nhiên, Java dường như bỏ qua các mục Đường dẫn lớp trong tệp kê khai ở đây. Chúng tôi không thể chạy ứng dụng mà không cần thêm "lib / *" vào đường dẫn lớp bằng cách sử dụng -cp. Có ý kiến ​​gì không?
Raku

6
Câu trả lời của oxbow_lakes không hoàn toàn chính xác; điều Class-Path được vinh danh (và CHỈ được vinh danh; -cp /-classpath bị bỏ qua!) nếu bạn bắt đầu jar này với java -jar myapp.jar. Tôi đoán oxbow_lakes có nghĩa là viết điều đó khi anh ấy viết 'java-classpath myapp.jar'.
rzwitserloot

47

Giải pháp của tôi trên Ubuntu 10.04 sử dụng java-sun 1.6.0_24 có tất cả các tệp trong thư mục "lib":

java -cp .: lib / * my.main.Class

Nếu điều này không thành công, lệnh sau sẽ hoạt động (in ra tất cả * .jars trong thư mục lib cho tham số classpath)

java -cp $ (đối với i trong lib / *. jar; do echo -n $ i :; xong). my.main.Class

4
một ghi chú vui java -cp lib / * my.main. con đường. Hãy dành một chút thời gian để lưu ý rằng
albfan 22/03/2016

1
Điều này không hoạt động; linux sẽ mở rộng . bạn có thể thử: java -cp '.: lib / ' và nó hoạt động tốt (lưu ý các dấu ngoặc đơn! Nó sẽ không hoạt động với dấu ngoặc kép!). Trên thực tế,.: Lib / * có thể hoạt động nếu đó không phải là một thế giới hợp pháp do dấu hai chấm, nhưng nó cảm thấy một chút iffy. Tôi muốn thêm các trích dẫn. Các trích dẫn duy nhất cho bash không chạm vào bất kỳ phần nào của nội dung.
rzwitserloot

Không thành vấn đề (trong ngữ cảnh này) nếu bạn sử dụng dấu ngoặc đơn hoặc dấu ngoặc kép. Bạn muốn ngăn vỏ mở rộng (toàn cầu) *, thế thôi. Và chuyển văn bản "lib / *" một cách rác rưởi cho JVM, vì vậy VM nhận ra đây là "mẫu đặc biệt" và tự tìm kiếm các tệp jar.
Thiên thần O'Sphere

36

Câu trả lời ngắn: java -classpath lib/*:. my.package.Program

Oracle cung cấp tài liệu về việc sử dụng các ký tự đại diện trong các đường dẫn lớp ở đây cho Java 6ở đây cho Java 7 , dưới phần tiêu đề Tìm hiểu các ký tự đại diện đường dẫn lớp . (Khi tôi viết bài này, hai trang chứa cùng một thông tin.) Đây là tóm tắt về những điểm nổi bật:

  • Nói chung, để bao gồm tất cả các JAR trong một thư mục nhất định, bạn có thể sử dụng ký tự đại diện *( không *.jar ).

  • Ký tự đại diện chỉ khớp với các tệp JAR, không phải các tệp lớp; để có được tất cả các lớp trong một thư mục, chỉ cần kết thúc mục classpath tại tên thư mục.

  • Hai tùy chọn trên có thể được kết hợp để bao gồm tất cả các tệp JAR và lớp trong một thư mục và áp dụng quy tắc ưu tiên đường dẫn thông thường. Ví dụ-cp /classes;/jars/*

  • Ký tự đại diện sẽ không tìm kiếm JAR trong các thư mục con.

  • Các gạch đầu dòng ở trên là đúng nếu bạn sử dụng thuộc tính CLASSPATHhệ thống hoặc các cờ dòng lệnh -cphoặc -classpath. Tuy nhiên, nếu bạn sử dụng Class-Pathtiêu đề tệp kê khai JAR (như bạn có thể làm với tệp kiến ​​tạo), ký tự đại diện sẽ không được vinh danh.

Có, liên kết đầu tiên của tôi là cùng một liên kết được cung cấp trong câu trả lời đạt điểm cao nhất (mà tôi không có hy vọng vượt qua), nhưng câu trả lời đó không cung cấp nhiều lời giải thích ngoài liên kết. Vì loại hành vi đó không được khuyến khích trên Stack Overflow những ngày này , tôi nghĩ rằng tôi sẽ mở rộng nó.


vấn đề của tôi là với lib / *. jar chứ không phải lib / *. Cảm ơn rất nhiều điều này đã sửa nó. Tôi nhận thấy rằng có một sự khác biệt giữa: và; nhưng đó có thể là loại thử nghiệm nhiều thay đổi cùng một lúc của tôi.
Eyad Ebrahim

Cảm ơn vì đã nhấn mạnh sự khác biệt giữa * và * .jar
burakhan alkan

36

Windows :

 java -cp file.jar;dir/* my.app.ClassName

Linux :

 java -cp file.jar:dir/* my.app.ClassName

Nhắc nhở:
- Dấu tách đường dẫn Windows;
- Dấu tách đường dẫn Linux:
- Trong Windows nếu đối số cp không chứa khoảng trắng, "dấu ngoặc kép" là tùy chọn


ví dụ về windows không hoạt động cho java 8 trở về trước: xem bug.openjdk.java.net/browse/JDK-8131329
philwalk 18/07/18

Có lẽ không hoạt động cho JDK mở, tôi sẽ kiểm tra điều này và tôi sẽ nói về vấn đề này
Wender 18/07/18

Xin lỗi, tôi đã thử nghiệm với HotSpot và tôi đã nghĩ rằng nó hoạt động với openjdk.
Wender

Oracle java dưới các cửa sổ yêu cầu dấu gạch chéo ngược trước dấu hoa thị thay vì dấu gạch chéo về phía trước, mặc dù tôi chưa kiểm tra lại các phiên bản java mới nhất hoặc thay thế.
philwalk

không hoạt động trên macos
Greyshack


29

Bạn có thể thử java -Djava.ext.dirs=jarDirectory http://docs.oracle.com/javase/6/docs/technotes/guides/extensions/spec.html

Thư mục cho các lọ bên ngoài khi chạy java


3
Điều này hoạt động, nhưng xem ra, vượt qua -Djava.ext.dirs=TRƯỚC-jar
Giovanni Funchal

5
java.ext.dirs sẽ hoạt động rất khác so với một jar bình thường trong classpath. Nó có mức độ ưu tiên và quyền cao hơn, bằng cách nào đó có thể ghi đè các lớp trong bootstamp (rt.jar)
Dennis C

Cảm ơn. Trên 'phiên bản java "1.8.0_221" Môi trường thời gian chạy Java (TM) SE (bản dựng 1.8.0_221-b27) Máy chủ Java 64 bit Bit (8), chế độ hỗn hợp)', chỉ phiên bản -D này vượt qua trong classpath làm việc. Các hình thức truyền thống đã không.
Matt Campbell

23

Đúng :

java -classpath "lib/*:." my.package.Program

Sai:

java -classpath "lib/a*.jar:." my.package.Program
java -classpath "lib/a*:."     my.package.Program
java -classpath "lib/*.jar:."  my.package.Program
java -classpath  lib/*:.       my.package.Program

9

Nếu bạn thực sự cần chỉ định tất cả các tệp .jar một cách linh hoạt, bạn có thể sử dụng các tập lệnh shell hoặc Apache Ant . Có một dự án commons được gọi là Commons Launcher , về cơ bản cho phép bạn chỉ định tập lệnh khởi động của mình dưới dạng tệp kiến ​​tạo (nếu bạn hiểu ý tôi).

Sau đó, bạn có thể chỉ định một cái gì đó như:

<path id="base.class.path">
    <pathelement path="${resources.dir}"/>
    <fileset dir="${extensions.dir}" includes="*.jar" />
    <fileset dir="${lib.dir}" includes="*.jar"/>
</path>

Trong tệp xây dựng khởi chạy của bạn, tệp này sẽ khởi chạy ứng dụng của bạn với đường dẫn chính xác.


9

Nếu bạn đang sử dụng Java 6, thì bạn có thể sử dụng các ký tự đại diện trong đường dẫn lớp.

Bây giờ có thể sử dụng các ký tự đại diện trong định nghĩa đường dẫn:

javac -cp libs/* -verbose -encoding UTF-8 src/mypackage/*.java  -d build/classes

Tham chiếu: http://www.rekk.de/bloggy/2008/add-all-jars-in-a-directory-to- classpath-with-java-se-6-USEwcardscards /


8

Xin lưu ý rằng việc mở rộng ký tự đại diện bị hỏng cho Java 7 trên Windows.

Kiểm tra vấn đề StackOverflow này để biết thêm thông tin.

Cách giải quyết là đặt dấu chấm phẩy ngay sau ký tự đại diện. java -cp "somewhere/*;"


6

Mà nó có thể quan tâm,

Tôi tìm thấy hành vi kỳ lạ này trên Windows dưới vỏ MSYS / MinGW.

Làm:

$ javac -cp '.;c:\Programs\COMSOL44\plugins\*' Reclaim.java

Không hoạt động:

$ javac -cp 'c:\Programs\COMSOL44\plugins\*' Reclaim.java
javac: invalid flag: c:\Programs\COMSOL44\plugins\com.comsol.aco_1.0.0.jar
Usage: javac <options> <source files>
use -help for a list of possible options

Tôi khá chắc chắn rằng ký tự đại diện không được mở rộng bởi trình bao, bởi vì, vd

$ echo './*'
./*

(Đã thử nó với một chương trình khác, thay vì tích hợp sẵn echo, với cùng kết quả.)

Tôi tin rằng javacđó là cố gắng mở rộng nó và nó hành xử khác nhau cho dù có một dấu chấm phẩy trong tranh luận hay không. Đầu tiên, nó có thể đang cố gắng mở rộng tất cả các đối số trông giống như các đường dẫn. Và chỉ sau đó nó sẽ phân tích chúng, với -cpviệc chỉ lấy mã thông báo sau. (Lưu ý rằng đó com.comsol.aco_1.0.0.jarlà JAR thứ hai trong thư mục đó.) Đó chỉ là dự đoán.

Đây là

$ javac -version
javac 1.7.0

5

Tất cả các giải pháp trên đều hoạt động tốt nếu bạn phát triển và chạy ứng dụng Java bên ngoài bất kỳ IDE nào như Eclipse hoặc Netbeans.

Nếu bạn đang dùng Windows 7 và đã sử dụng IDE IDE để phát triển trong Java, bạn có thể gặp sự cố nếu sử dụng Command Prompt để chạy các tệp lớp được xây dựng bên trong Eclipse.

Ví dụ: Mã nguồn của bạn trong Eclipse đang có hệ thống phân cấp gói sau: edu.sjsu.myapp.Main.java

Bạn có json.jar làm phụ thuộc bên ngoài cho Main.java

Khi bạn thử chạy Main.java từ bên trong Eclipse, nó sẽ chạy mà không gặp vấn đề gì.

Nhưng khi bạn thử chạy nó bằng Command Prompt sau khi biên dịch Main.java trong Eclipse, nó sẽ gây ra một số lỗi kỳ lạ có nội dung "ClassNotDef Error blah blah".

Tôi giả sử bạn đang ở trong thư mục làm việc của mã nguồn của bạn !!

Sử dụng cú pháp sau để chạy nó từ dấu nhắc lệnh:

  1. javac -cp ".; json.jar" Main.java

  2. java -cp ".; json.jar" edu.sjsu.myapp.Main

    [Đừng bỏ lỡ. ở trên]

Điều này là do bạn đã đặt Main.java bên trong gói edu.sjsu.myapp và java.exe sẽ tìm mẫu chính xác.

Hy vọng nó giúp !!


4

Đối với cửa sổ báo giá là bắt buộc và; nên được sử dụng như dấu phân cách. ví dụ:

java -cp "target\\*;target\\dependency\\*" my.package.Main

4

Biểu mẫu ngắn: Nếu chính của bạn nằm trong một tệp jar, có thể bạn sẽ cần một đường dẫn '-jar thêm To / yourJar / YourJarsName.jar' được khai báo rõ ràng để làm cho nó hoạt động (ngay cả khi 'YourJarsName.jar' nằm trên đường dẫn lớp) (hoặc , bày tỏ để trả lời câu hỏi ban đầu đã được hỏi 5 năm trước: bạn không cần phải phân phối lại từng bình một cách rõ ràng, nhưng dường như, ngay cả với java6, bạn cần phải xác định lại bình của mình ...)


Hình thức dài: (Tôi đã nói rõ điều này đến mức tôi hy vọng ngay cả những người xen kẽ vào java cũng có thể sử dụng điều này)

Giống như nhiều người ở đây, tôi đang sử dụng nhật thực để xuất các tệp: (Tệp-> Xuất -> 'Tệp JAR có thể chạy'). Có ba tùy chọn về ưu đãi 'Xử lý thư viện' (Juno):

opt1: "Extract required libraries into generated JAR"
opt2: "Package required libraries into generated JAR"
opt3: "Copy required libraries into a sub-folder next to the generated JAR"

Thông thường, tôi sử dụng opt2 (và opt1 chắc chắn đã phá vỡ), tuy nhiên mã gốc trong một trong các lọ tôi đang sử dụng Tôi đã phát hiện ra các ngắt với thủ thuật "jarinjar" tiện dụng mà nhật thực tận dụng khi bạn chọn tùy chọn đó. Ngay cả sau khi nhận ra tôi cần opt3, và sau đó tìm mục nhập StackOverflow này, tôi vẫn phải mất một thời gian để tìm ra cách khởi chạy chính của mình bên ngoài nhật thực, vì vậy đây là cách hữu ích cho tôi, vì nó hữu ích cho người khác ...


Nếu bạn đặt tên jar của mình: "fooBarTheJarFile.jar" và tất cả được đặt thành xuất thành thư mục: "/ theFully / QualPath / toYourChosenDir".

(có nghĩa là trường 'Xuất đích' sẽ đọc: '/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar')

Sau khi bạn nhấn xong, bạn sẽ thấy nhật thực, sau đó đặt tất cả các thư viện vào một thư mục có tên 'fooBarTheJarFile_lib' trong thư mục xuất đó, cung cấp cho bạn một cái gì đó như:

/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar01.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar02.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar03.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar04.jar

Sau đó, bạn có thể khởi chạy từ mọi nơi trên hệ thống của mình với:

java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*" -jar  /theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar   package.path_to.the_class_with.your_main.TheClassWithYourMain

. .} 'mà bạn muốn chạy từ bên ngoài java)


Cạm bẫy cần chú ý: là việc có 'fooBarTheJarFile.jar' trong danh sách các lọ trên đường dẫn lớp được khai báo của bạn là không đủ. Bạn cần khai báo rõ ràng '-jar' và xác định lại vị trí của bình đó.

ví dụ: điều này phá vỡ:

 java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar;/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*"  somepackages.inside.yourJar.leadingToTheMain.TheClassWithYourMain

trình bày lại với các đường dẫn tương đối:

cd /theFully/qualifiedPath/toYourChosenDir/;
BREAKS:  java -cp "fooBarTheJarFile_lib/*"                                package.path_to.the_class_with.your_main.TheClassWithYourMain    
BREAKS:  java -cp ".;fooBarTheJarFile_lib/*"                              package.path_to.the_class_with.your_main.TheClassWithYourMain   
BREAKS:  java -cp ".;fooBarTheJarFile_lib/*"   -jar                       package.path_to.the_class_with.your_main.TheClassWithYourMain   
WORKS:   java -cp ".;fooBarTheJarFile_lib/*"   -jar  fooBarTheJarFile.jar package.path_to.the_class_with.your_main.TheClassWithYourMain   

(sử dụng phiên bản java "1.6.0_27"; thông qua OpenJDK 64-Bit Server VM trên ubfox 12.04)


3

Cách duy nhất tôi biết là làm thế nào để làm điều đó riêng lẻ, ví dụ:

setenv CLASSPATH /User/username/newfolder/jarfile.jar:jarfile2.jar:jarfile3.jar:.

Mong rằng sẽ giúp!


Đây có thể là cách duy nhất trở lại vào năm '8, nhưng không còn nữa.
simo.3792

Đây không phải là điều tồi tệ nhất. Đó là một bản hack, nhưng tôi có bộ này trong bashrc của mìnhfor jar in $(ls $HOME/bin/*.jar); do export CLASSPATH=$jar:$CLASSPATH; done
Devon Peticolas

3

lớp từ wepapp:

  > mvn clean install

  > java -cp "webapp/target/webapp-1.17.0-SNAPSHOT/WEB-INF/lib/tool-jar-1.17.0-SNAPSHOT.jar;webapp/target/webapp-1.17.0-SNAPSHOT/WEB-INF/lib/*" com.xx.xx.util.EncryptorUtils param1 param2

2

Bạn cần thêm tất cả chúng một cách riêng biệt. Ngoài ra, nếu bạn thực sự cần chỉ định một thư mục, bạn có thể hủy mọi thứ thành một thư mục và thêm nó vào đường dẫn lớp của bạn. Tôi không khuyên bạn nên tiếp cận phương pháp này tuy nhiên vì bạn có nguy cơ gặp phải những vấn đề kỳ lạ trong phiên bản classpath và không thể quản lý được.


3
Đây có thể là cách duy nhất trở lại vào năm '8, nhưng không còn nữa.
simo.3792

2

Không phải là giải pháp trực tiếp để có thể đặt / * thành -cp nhưng tôi hy vọng bạn có thể sử dụng tập lệnh sau để giảm bớt tình huống một chút cho các đường dẫn lớp và thư mục lib động.

 libDir2Scan4jars="../test";cp=""; for j in `ls ${libDir2Scan4jars}/*.jar`; do if [ "$j" != "" ]; then cp=$cp:$j; fi; done; echo $cp| cut -c2-${#cp} > .tmpCP.tmp; export tmpCLASSPATH=`cat .tmpCP.tmp`; if [ "$tmpCLASSPATH" != "" ]; then echo .; echo "classpath set, you can now use  ~>         java -cp \$tmpCLASSPATH"; echo .; else echo .; echo "Error please check libDir2Scan4jars path"; echo .; fi; 

Kịch bản cho Linux, cũng có thể có một cái tương tự cho các cửa sổ. Nếu thư mục thích hợp được cung cấp làm đầu vào cho "libDir2Scan4jars"; đoạn script sẽ quét tất cả các tệp và tạo một chuỗi classpath và xuất nó thành một biến env "tmpCLASSPATH".


2

macOS, thư mục hiện tại

Dành cho Java 13 trên macOS Mojave ...

Nếu tất cả các .jartệp của bạn nằm trong cùng một thư mục, hãy sử dụng cdđể tạo thư mục làm việc hiện tại của bạn . Xác minh vớipwd .

Đối với -classpathbạn trước tiên phải liệt kê tệp JAR cho ứng dụng của bạn. Sử dụng ký tự dấu hai chấm :làm dấu phân cách, nối dấu hoa thị *để nhận tất cả các tệp JAR khác trong cùng một thư mục. Cuối cùng, truyền tên gói đầy đủ của lớp bằng mainphương thức của bạn .

Ví dụ: đối với một ứng dụng trong tệp JAR được đặt tên my_app.jarbằng một mainphương thức trong một lớp có tên Apptrong gói có tên com.example, cùng với một số lọ cần thiết trong cùng một thư mục:

java -classpath my_app.jar:* com.example.App

không hoạt động cho java 8
Greyshack

1

Hãy nghĩ về một tệp jar là gốc của cấu trúc thư mục. Có, bạn cần thêm tất cả chúng một cách riêng biệt.


1

Đặt đường dẫn lớp theo cách phù hợp với nhiều tệp và tệp lớp của thư mục hiện tại.

CLASSPATH=${ORACLE_HOME}/jdbc/lib/ojdbc6.jar:${ORACLE_HOME}/jdbc/lib/ojdbc14.jar:${ORACLE_HOME}/jdbc/lib/nls_charset12.jar; 
CLASSPATH=$CLASSPATH:/export/home/gs806e/tops/jconn2.jar:.;
export CLASSPATH

0

Tôi có nhiều lọ trong một thư mục. Lệnh dưới đây làm việc cho tôi trongJDK1.8 để bao gồm tất cả các lọ có trong thư mục. Xin lưu ý rằng để bao gồm trong dấu ngoặc kép nếu bạn có một khoảng trắng trong đường dẫn lớp

các cửa sổ

Biên dịch: javac -classpath "C:\My Jars\sdk\lib\*" c:\programs\MyProgram.java

Đang chạy: java -classpath "C:\My Jars\sdk\lib\*;c:\programs" MyProgram

Linux

Biên dịch: javac -classpath "/home/guestuser/My Jars/sdk/lib/*" MyProgram.java

Đang chạy: java -classpath "/home/guestuser/My Jars/sdk/lib/*:/home/guestuser/programs" MyProgram


-1

Tôi đang cố gắng chạy tệp Java dưới dạng jar hoặc là các lớp trong Ubuntu. Tôi đã thất bại trong cả hai lựa chọn. Ngoại lệ sau đây là đầu ra của nó.

Download link: https://upload.cat/f694139f88c663b1

java org.statmetrics.Statmetric

hoặc là

java -cp /home/elias/statmetrics/statmetrics.jar :. org.statmetrics.Statmetrics

hoặc là

java-classpath "/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/*" -jar /home/elias/statmeics/statmetrics.jar org.statmetrics.Statmetrics

Exception in thread "Thread-0" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/adapters/XmlAdapter
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
    at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:802)
    at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:700)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:623)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at org.statmetrics.c.a(Unknown Source)
    at org.statmetrics.dw.a(Unknown Source)
    at org.statmetrics.dx.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.adapters.XmlAdapter
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 12 more

Tôi tìm thấy câu trả lời:

Sự ngu ngốc của tôi.

Bước đầu tiên: Bạn phải đặt Java tương ứng: Tôi đã có Java 11 nhưng tôi đặt đường dẫn lib của Java là phiên bản thứ 8! - Bạn có thể thiết lập phiên bản Java từ đây:

  sudo update-alternatives --config java

Bước 2: Sau đó chạy lệnh sau, bằng cách thay đổi tên đường dẫn và tên tệp thành đường dẫn và tệp tương ứng của bạn:

  java -classpath "/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/*" -jar /home/elias/statmetrics/statmetrics.jar org.statmetrics.Statmetrics

Nó đã được chạy thành công!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.