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.


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.


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

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.


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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.