Czy istnieje sposób na włączenie wszystkich plików jar do katalogu w ścieżce klasy?
Próbuję java -classpath lib/*.jar:. my.package.Program
i nie mogę znaleźć plików klas, które z pewnością są w tych słoikach. Czy muszę osobno dodawać każdy plik jar do ścieżki klasy?
java
command-line
classpath
Chris Serra
źródło
źródło
.jar
część, (2) musi mieć co najmniej 2 części, oddzielone znakiem a;
w systemie Windows (który zwykle jest:
gdzie indziej). Na przykład:java -classpath ".;lib/*" Program
Odpowiedzi:
W wersji Java 6 lub nowszej opcja classpath obsługuje symbole wieloznaczne. Uwaga:
"
)*
, nie*.jar
Windows
Unix
Jest to podobne do systemu Windows, ale używa
:
zamiast niego;
. Jeśli nie możesz używać symboli wieloznacznych,bash
zezwól na następującą składnię (gdzielib
jest katalog zawierający wszystkie pliki archiwów Java):(Zauważ, że użycie ścieżki klasy jest niezgodne z tą
-jar
opcją. Zobacz także: Uruchom plik jar z wieloma bibliotekami ścieżki klasy z wiersza polecenia )Zrozumienie symboli wieloznacznych
Z dokumentu Classpath :
Uwaga: z powodu znanego błędu w Javie 8 przykłady Windows muszą używać ukośnika poprzedzającego wpisy z końcową gwiazdką: https://bugs.openjdk.java.net/browse/JDK-8131329
źródło
tr
działa!java -classpath /jars/*:/anotherJarsDir/* com.test.MyClass
bez cudzysłowów i działa dobrze. Zastanawiam się, dlaczego shell nie rozwija go i nie popełnia błędów?~
w -cpW systemie Windows działa to:
i to nie działa:
zwróć uwagę na * .jar, więc * należy używać tylko symbolu wieloznacznego .
W systemie Linux następujące funkcje:
Separatory to dwukropki zamiast średników.
źródło
*.jar
ale tylko z*
.:
platformami;
. :) Kompiluję z Javą z wiersza poleceń mniej więcej raz w roku, po prostu nie pamiętam, jak często wystarczająco denerwujące.Rozwiązujemy ten problem, wdrażając główny plik jar,
myapp.jar
który zawiera plik manifest (Manifest.mf
) określający ścieżkę klasy z innymi wymaganymi słojami, które są następnie wdrażane obok niego. W takim przypadku wystarczy zadeklarowaćjava -jar myapp.jar
podczas uruchamiania kodu.Jeśli więc
jar
umieścisz main w jakimś katalogu, a następnie umieścisz zależne słoiki wlib
folderze poniżej, manifest wygląda następująco:Uwaga: jest to niezależne od platformy - możemy używać tych samych słoików do uruchamiania na serwerze UNIX lub na komputerze z systemem Windows.
źródło
Moje rozwiązanie na Ubuntu 10.04 przy użyciu java-sun 1.6.0_24 z wszystkimi słojami w katalogu „lib”:
Jeśli to się nie powiedzie, następujące polecenie powinno działać (drukuje wszystkie * .jars w katalogu lib do parametru classpath)
źródło
Krótka odpowiedź:
java -classpath lib/*:. my.package.Program
Oracle udostępnia dokumentację dotyczącą używania symboli wieloznacznych w ścieżkach klas tutaj dla Java 6 i tutaj dla Java 7 , w sekcji zatytułowanej Zrozumienie symboli wieloznacznych ścieżki klasy . (Gdy to piszę, dwie strony zawierają te same informacje.) Oto podsumowanie najważniejszych wydarzeń:
Zasadniczo, aby uwzględnić wszystkie pliki JAR w danym katalogu, można użyć symbolu wieloznacznego
*
( nie*.jar
).Symbol wieloznaczny pasuje tylko do plików JAR, a nie do plików klas; aby wszystkie klasy znalazły się w katalogu, wystarczy zakończyć wpis klasy w nazwie katalogu.
Powyższe dwie opcje można połączyć, aby uwzględnić wszystkie pliki JAR i klasy w katalogu, i zastosowanie mają zwykłe reguły pierwszeństwa ścieżki klas. Na przykład
-cp /classes;/jars/*
Symbol wieloznaczny nie będzie wyszukiwał plików JAR w podkatalogach.
Powyższe wypunktowania są prawdziwe w przypadku korzystania z
CLASSPATH
własności systemu lub z-cp
lub-classpath
polecenia flagi linii. Jeśli jednak użyjeszClass-Path
manifestu JAR (tak jak w przypadku pliku kompilacji mrówki), symbole wieloznaczne nie będą honorowane.Tak, mój pierwszy link jest taki sam, jak ten podany w odpowiedzi o najwyższym wyniku (której nie mam nadziei na wyprzedzenie), ale ta odpowiedź nie zawiera wielu wyjaśnień poza linkiem. Ponieważ tego rodzaju zachowanie jest zniechęcony na przepełnienie stosu te dni , myślałem, że rozszerzenie na nim.
źródło
Windows :
Linux :
Przypomnij:
- Separator ścieżek systemu Windows to
;
- Separator ścieżek systemu Linux to
:
- W systemie Windows, jeśli argument cp nie zawiera spacji, „cudzysłowy” są opcjonalne
źródło
Dla mnie to działa w systemie Windows.
Dla systemu Linux
Używam Java 6
źródło
Możesz wypróbować java
-Djava.ext.dirs=jarDirectory
http://docs.oracle.com/javase/6/docs/technotes/guides/extensions/spec.htmlKatalog zewnętrznych słoików podczas uruchamiania Java
źródło
-Djava.ext.dirs=
BEFORE-jar
Poprawne :
Błędny:
źródło
Jeśli naprawdę potrzebujesz dynamicznie określać wszystkie pliki .jar, możesz użyć skryptów powłoki lub Apache Ant . Istnieje wspólny projekt o nazwie Commons Launcher, który w zasadzie pozwala określić skrypt startowy jako plik kompilacji mrówki (jeśli rozumiesz, co mam na myśli).
Następnie możesz określić coś takiego:
W pliku kompilacji uruchamiania, który uruchomi aplikację z poprawną ścieżką klasy.
źródło
Jeśli używasz Java 6, możesz używać symboli wieloznacznych w ścieżce klasy.
Teraz można używać symboli wieloznacznych w definicji ścieżki klas:
Patrz: http://www.rekk.de/bloggy/2008/add-all-jars-in-a-directory-to-classpath-with-java-se-6-using-wildcards/
źródło
Pamiętaj, że rozszerzenie symboli wieloznacznych nie działa w Javie 7 w systemie Windows.
Sprawdź ten problem StackOverflow, aby uzyskać więcej informacji.
Obejściem tego problemu jest umieszczenie średnika bezpośrednio za znakiem wieloznacznym.
java -cp "somewhere/*;"
źródło
Do tych których może to dotyczyć,
Znalazłem to dziwne zachowanie w systemie Windows pod powłoką MSYS / MinGW.
Pracuje:
Nie działa:
Jestem całkiem pewien, że symbol nie jest rozszerzany przez powłokę, ponieważ np
(Wypróbowałem to również z innym programem, a nie z wbudowanym
echo
, z tym samym rezultatem).Wierzę, że to
javac
właśnie próbuje ją rozwinąć i zachowuje się inaczej, niezależnie od tego, czy w argumencie jest średnik, czy nie. Po pierwsze, może próbować rozwinąć wszystkie argumenty, które wyglądają jak ścieżki. I dopiero wtedy je przeanalizuje,-cp
biorąc tylko następujący token. (Zauważ, żecom.comsol.aco_1.0.0.jar
jest to drugi plik JAR w tym katalogu).To jest
źródło
Wszystkie powyższe rozwiązania działają świetnie, jeśli tworzysz i uruchamiasz aplikację Java poza dowolnym środowiskiem IDE, takim jak Eclipse lub Netbeans.
Jeśli korzystasz z systemu Windows 7 i używasz Eclipse IDE do programowania w Javie, możesz napotkać problemy, jeśli użyjesz wiersza polecenia do uruchomienia plików klas wbudowanych w Eclipse.
Np. Twój kod źródłowy w Eclipse ma następującą hierarchię pakietów: edu.sjsu.myapp.Main.java
Json.jar jest zewnętrzną zależnością dla Main.java
Gdy spróbujesz uruchomić Main.java z poziomu Eclipse, uruchomi się bez żadnych problemów.
Ale kiedy spróbujesz uruchomić to za pomocą wiersza polecenia po skompilowaniu Main.java w Eclipse, wyskoczy kilka dziwnych błędów, mówiąc: „Błąd ClassNotDef bla bla”.
Zakładam, że jesteś w katalogu roboczym swojego kodu źródłowego !!
Użyj następującej składni, aby uruchomić go z wiersza polecenia:
[Nie przegap. powyżej]
Wynika to z faktu, że umieściłeś Main.java w pakiecie edu.sjsu.myapp, a java.exe wyszuka dokładny wzór.
Mam nadzieję, że to pomoże !!
źródło
W przypadku systemu Windows wymagane są cytaty i; powinien być używany jako separator. na przykład:
źródło
Skrócony formularz: Jeśli główny plik znajduje się w słoiku, prawdopodobnie będziesz potrzebować dodatkowego „-jar pathTo / yourJar / YourJarsName.jar” jawnie zadeklarowanego, aby działał (nawet jeśli „YourJarsName.jar” znajdował się w ścieżce klas) (lub , wyrażony w celu udzielenia odpowiedzi na pierwotne pytanie, które zostało zadane 5 lat temu: nie musisz ponownie jawnie ponownie określać każdego słoika, ale wydaje się, że nawet w java6 musisz ponownie sformułować własny słoik ...)
Długa forma: (Wyjaśniłem to do tego stopnia, że mam nadzieję, że nawet intruzi do java mogą z tego skorzystać)
Jak wielu tutaj używam Eclipse do eksportowania słoików: (Plik-> Eksportuj -> 'Plik Run Jble'). Istnieją trzy opcje dotyczące zaćmienia „Obsługa bibliotek” (Juno):
Zwykle używałbym opt2 (a opt1 zdecydowanie się zepsuł), jednak natywny kod w jednym ze słoików, z których korzystam, odkryłem przerwy w przydatnej sztuczce „jarinjar”, która wykorzystuje zaćmienie, gdy wybierzesz tę opcję. Nawet po uświadomieniu sobie, że potrzebuję opt3, a następnie znalezieniu tego wpisu StackOverflow, zajęło mi trochę czasu, aby wymyślić, jak uruchomić moją główną poza zaćmieniem, więc oto, co działało dla mnie, ponieważ jest przydatne dla innych ...
Jeśli nazwałeś swój jar: „fooBarTheJarFile.jar”, a wszystko jest ustawione na eksport do katalogu: „/ theFully / Qualified Path / toYourChosenDir”.
(co oznacza, że pole „Eksportuj miejsce docelowe” będzie brzmiało: „/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar”)
Po ukończeniu znajdziesz zaćmienie, a następnie umieści wszystkie biblioteki w folderze o nazwie „fooBarTheJarFile_lib” w tym katalogu eksportu, dając ci coś takiego:
Następnie możesz uruchomić z dowolnego miejsca w systemie za pomocą:
(Dla Java Newbies: „pakiet.path_to.the_class_with.your_main” to zadeklarowana ścieżka pakietu, która znajduje się u góry pliku „TheClassWithYourMain.java”, który zawiera „main (String [] argumenty) {.. .} ”, który chcesz uruchomić spoza Java)
Pułapką, którą należy zauważyć: jest to, że posiadanie pliku „fooBarTheJarFile.jar” na liście słoików w zadeklarowanej ścieżce klasy nie wystarczy. Musisz jawnie zadeklarować „-jar” i ponownie określić lokalizację tego słoika.
np. to łamie:
przekształcony ze ścieżkami względnymi:
(przy użyciu wersji Java „1.6.0_27”; za pośrednictwem 64-bitowej maszyny wirtualnej serwera OpenJDK w systemie Ubuntu 12.04)
źródło
Jedyny sposób, w jaki wiem, jak to zrobić indywidualnie, na przykład:
Mam nadzieję, że to pomaga!
źródło
for jar in $(ls $HOME/bin/*.jar); do export CLASSPATH=$jar:$CLASSPATH; done
klasa z wepapp:
źródło
Musisz dodać je wszystkie osobno. Alternatywnie, jeśli naprawdę potrzebujesz tylko określić katalog, możesz rozłączyć wszystko w jednym katalogu i dodać to do ścieżki klasy. Nie polecam jednak tego podejścia, ponieważ ryzykujesz dziwne problemy w wersjonowaniu ścieżek klas i braku możliwości zarządzania.
źródło
Nie jest to bezpośrednie rozwiązanie dla możliwości ustawienia / * na -cp, ale mam nadzieję, że możesz użyć następującego skryptu, aby nieco złagodzić sytuację w przypadku dynamicznych ścieżek klas i katalogów lib.
Skrypty dla systemu Linux mogą mieć podobny do systemu Windows. Jeśli podany zostanie właściwy katalog jako dane wejściowe do pliku „libDir2Scan4jars”; skrypt przeskanuje wszystkie słoiki i utworzy ciąg ścieżki klasy i wyeksportuje go do zmiennej env „tmpCLASSPATH”.
źródło
macOS, bieżący folder
Dla Java 13 na macOS Mojave …
Jeśli wszystkie
.jar
pliki znajdują się w tym samym folderze, użyj,cd
aby ustawić bieżący katalog roboczy . Zweryfikuj za pomocąpwd
.W tym celu
-classpath
musisz najpierw wymienić plik JAR dla swojej aplikacji. Używając znaku dwukropka:
jako ogranicznika, dodaj gwiazdkę,*
aby uzyskać wszystkie inne pliki JAR w tym samym folderze. Na koniec podaj pełną nazwę pakietu klasy za pomocąmain
metody .Na przykład dla aplikacji w pliku JAR o nazwie
my_app.jar
zmain
metodą w klasie o nazwieApp
w nazwie pakietucom.example
wraz z kilkoma potrzebnymi słojami w tym samym folderze:źródło
Pomyśl o pliku jar jako katalogu głównego struktury katalogów. Tak, musisz dodać je wszystkie osobno.
źródło
Ustaw ścieżkę klasy w sposób odpowiedni dla wielu słoików i plików klas bieżącego katalogu.
źródło
Mam wiele słoików w folderze. Poniższe polecenie działało dla mnie w
JDK1.8
aby uwzględnić wszystkie słoiki obecne w folderze. Pamiętaj, aby uwzględnić w cudzysłowie, jeśli masz spację w ścieżce klasyWindows
Kompilacja:
javac -classpath "C:\My Jars\sdk\lib\*" c:\programs\MyProgram.java
Bieganie:
java -classpath "C:\My Jars\sdk\lib\*;c:\programs" MyProgram
Linux
Kompilacja:
javac -classpath "/home/guestuser/My Jars/sdk/lib/*" MyProgram.java
Bieganie:
java -classpath "/home/guestuser/My Jars/sdk/lib/*:/home/guestuser/programs" MyProgram
źródło
Próbuję uruchomić plik Java jako słoik lub jako klasę w Ubuntu. Nie udało mi się w obu opcjach. Następujący wyjątek to jego dane wyjściowe.
lub
lub
Znalazłem odpowiedź:
Moja głupota.
Pierwszy krok: musisz ustawić odpowiednią Javę: miałem Java 11, ale jako ścieżkę lib Java ustawiłem 8 wersję! - Możesz tutaj ustawić wersję Java:
Drugi krok: następnie uruchom następujące polecenie, zmieniając ścieżki i nazwy plików na odpowiednie ścieżki i pliki:
Udało się to uruchomić!
źródło