Jak korzystać z klas z plików .jar?

134

Czytałem samouczki Java w Sun dla plików JAR, ale nadal nie mogę znaleźć rozwiązania mojego problemu. Muszę użyć klasy z pliku jar o nazwie jtwitter.jar, pobrałem plik i próbowałem go uruchomić (wczoraj dowiedziałem się, że pliki .jar można uruchomić, klikając je dwukrotnie), a Vista wyświetliła mi komunikat o błędzie „ Nie udało się załadować atrybutu manifestu klasy głównej z [ścieżka] /jtwitter.jar ”.

Facet, który zakodował plik .jar, chce, żebym go zaimportował, ale gdzie mam przechowywać plik .jar, aby zaimportować go do mojego kodu? Próbowałem umieścić zarówno plik .jar, jak i mój plik .java w tym samym katalogu, ale nie zadziałało.

Plik, dla którego próbuję pracować, znajduje się tutaj: http://www.winterwell.com/software/jtwitter.php

Używam JCreator LE.

Gaurav Dadhania
źródło
13
Dlaczego jest głos przeciw? Moim zdaniem to dobre pytanie, aw odpowiedziach są ciekawe informacje! (+1)
guerda

Odpowiedzi:

34

Nie każdy plik jar jest wykonywalny.

Teraz musisz zaimportować klasy, które znajdują się pod jar, do pliku java. Na przykład,

import org.xml.sax.SAXException;

Jeśli pracujesz na IDE, powinieneś zapoznać się z jego dokumentacją. Lub przynajmniej określ, którego z nich używasz tutaj w tym wątku. To z pewnością umożliwiłoby nam dalszą pomoc.

A jeśli nie używasz żadnego IDE, spójrz na opcję javac -cp . Jednak znacznie lepszym pomysłem jest spakowanie programu w jarpliku i uwzględnienie w nim wszystkich wymaganych plików jar. Następnie, aby wykonać swoje jarulubione

java -jar my_program.jar

powinieneś mieć META-INF/MANIFEST.MFplik w swoim jar. Zobacz tutaj , aby uzyskać instrukcje.

Adeel Ansari
źródło
stare, wiem, ale tak naprawdę nic nie jest potrzebne import- po prostu unika się konieczności wpisywania w pełni kwalifikowanej nazwy klasy, niezależnie od tego, kto kiedykolwiek ta klasa jest używana, pozwalając tylko na prostą nazwę klasy ( SAXException) - coś w rodzaju importu przestrzeni nazw
user85421
173

Powiedzmy, że musimy użyć klasy Classnamezawartej w pliku jarorg.example.jar

A twoje źródło znajduje się w pliku mysource.javatakim jak ten:

import org.example.Classname;

public class mysource {
    public static void main(String[] argv) {
    ......
   }
}

Najpierw, jak widzisz, w swoim kodzie musisz zaimportować klasy. Aby to zrobić, potrzebujeszimport org.example.Classname;

Po drugie, kiedy kompilujesz źródło, musisz odwołać się do pliku jar.

Zwróć uwagę na różnicę w używaniu :i ;podczas kompilacji

  • Jeśli jesteś w systemie operacyjnym typu unix:

    javac -cp '.:org.example.jar' mysource.java
  • Jeśli jesteś pod oknami:

    javac -cp .;org.example.jar mysource.java

Następnie otrzymasz plik kodu bajtowego mysource.class

Teraz możesz uruchomić to:

  • Jeśli jesteś w systemie operacyjnym typu unix:

    java -cp '.:org.example.jar' mysource
  • Jeśli jesteś pod oknami:

    java -cp .;org.example.jar mysource
GabrieleV
źródło
4
Czy mógłbyś trochę dokładniej wyjaśnić ten zapis? To rozwiązało mój problem, ale niestety NIE mam ŻADNEGO POMYSŁU, co oznacza średnik / dwukropek w tym konkretnym przypadku.
cemulować
2
Ta historia ze średnikiem / dwukropkiem kosztowała mnie tylko cały dzień. Przynajmniej znalazłem to teraz, dzięki!
Maxim Zubarev
1
@ChaseMeadors Średnik / dwukropek zasadniczo oznacza „i” tutaj. Oddziela się .od org.example.jar.
duozmo
Jeśli przeglądasz, zwróć uwagę na różnicę w stosunku do większości *PATHzmiennych: pliki .jar muszą mieć indywidualne nazwy .
duozmo
15

Musisz dodać plik jar w ścieżce klas. Aby skompilować klasę java:

javac -cp .;jwitter.jar MyClass.java

Aby uruchomić kod (pod warunkiem, że MyClass zawiera główną metodę):

java -cp .;jwitter.jar MyClass

Możesz mieć plik jar w dowolnym miejscu. Powyższe działa, jeśli plik jar znajduje się w tym samym katalogu, co plik java.

kgiannakakis
źródło
7

Musisz umieścić plik .jar w swojej ścieżce klas podczas kompilowania / uruchamiania kodu. Następnie wystarczy użyć standardowego importu klas z pliku .jar.

workmad3
źródło
6

Jak mówi workmad3, plik jar musi znajdować się w ścieżce klas. Jeśli kompilujesz z wiersza poleceń, będzie to oznaczać użycie flagi -classpath. (Unikaj zmiennej środowiskowej CLASSPATH; IMO to uciążliwe).

Jeśli używasz IDE, daj nam znać, które z nich, a pomożemy Ci w wykonaniu czynności specyficznych dla tego IDE.

Jon Skeet
źródło
Classpath zmienna env jest przydatna, jeśli używasz skryptów lub czegoś takiego jak firedaemon do uruchamiania aplikacji. To tylko ból, gdy używasz go globalnie :)
workmad3
Nadal lubię to wyraźnie widzieć.
Jon Skeet
Zgadzam się, lubię to wyraźnie widzieć.
J3r3myK