2012-04-02 10 views
5

To jest naprawdę głupie pytanie, na które nie mogę precyzyjnie odpowiedzieć.jaka jest prawidłowa struktura wewnętrzna pliku JAR

Tło.

Używam Eclipse (z jedną z wtyczek ANT, na terminalu XP).

Właśnie zaczął grać z ANT, w [jar] Dyrektywa ja ustawiania położenia mojego gotowego pliku JAR i uzyskać następujące po I rozpakować 'Plik

META-INF/manifest. MF MyMainFile.class

, który jest zgodny z tym znalezionym na stronie internetowej Oracle dla wewnętrznej struktury. (tutaj http://docs.oracle.com/javase/tutorial/deployment/jar/view.html)

Ale kiedy próbuję uruchomić mój plik, otrzymuję błąd "nie znaleziono głównej klasy"?

Widziałem kilka innych stanowisk, gdzie ludzie 'rozpakowane' plik JAR i skończyło się ze strukturą następujących ...

META-INF/MANIFEST.MF dtvcontrol/DTVControlApp.class

(stąd http://www.coderanch.com/t/528312/java/java/standalone-application)

więc powinienem dostać strukturę gdzie moje pliki klasy są w katalogu, który odzwierciedla nazwę pakietu ... np

META-INF/MANIFEST.MF MyPackage/MyMainFile.class

A jeśli tak, dlaczego otrzymuję niepoprawną strukturę przy użyciu ANT lub dlaczego istnieją 2 różne "poprawne" struktury wewnętrzne? (jak określić główną klasę i ścieżkę klasy dla każdego/kontrolki, co otrzymuję)

Również w przypadku, gdy jesteś zainteresowany, w pliku MANIFEST stany (kompilacja przy użyciu ANT) [nazwa atrybutu = "Główna klasa" wartość = "MyPackage.MyMainFile" /]

również struktura katalogów pakietu w trakcie opracowywania jest następująca ...

/JavaDev/MyTestPackage/src (zawiera pliki źródłowe) // JavaDev/MyTestPackage/bin (zawiera pliki klas od zaćmienia lub z zadania ANT JAVAC, czy nazwałem je niepoprawnie? czy powinienem je nazwać kompilacją?)

Co więcej, kiedy tworzę słoik, nie nazywam go "MyTestPackage.jar", ale po prostu "test.jar" może to być przyczyną problemu? Zakładam, że nie tak, jakbym dobrze zrozumiał, o to chodzi w rzeczy samej [główna klasa].

nawiązaniu do tego wszystkiego ...

„MyTestPackage” jest właściwie mały błąd wizualny wiadomości biblioteki, który używam w innym miejscu, a ja mam drugi plik, który ma główną klasę używaną do testów. W związku z tym wskazuje na różne biblioteki (czy muszę skopiować wszystkie biblioteki SWT do określonego katalogu?)

Czytałem gdzieś, że jeśli załaduję biblioteki do mojej głównej klasy (co oczywiście zrobić, aby otworzyć okno), to próba uruchomienia programu zakończy się niepowodzeniem na "głównej klasy nie znaleziono", jeśli używam ich, sam jest także prawdziwe w przypadku dodawania jakichkolwiek "statycznych elementów końcowych" (których używam do logowania błędów).

Problem z "statycznym finałem" ... Próbowałem dostosować ścieżkę klas w ANT, i otrzymałem mnóstwo innych błędów dla połączenia z Log4J i moim "opakowaniem", którego używam (aby zrobić to z nieprawidłowy import), ale biblioteki istnieją tam, gdzie powinny być ustawione w ścieżce klas).

ja czuję się prawie tam .... ale nie całkiem ...

Robię to dla małych projektów „biblioteka”, które tworzę z zamiarem wykorzystania MAVAN na główną zewnętrzny pakiet, który połączy je wszystkie razem ... na razie jednak chciałbym to zrobić tak, jak to działa.

Mogę dostarczyć pełne źródło lub inne wymagane informacje.

góry dzięki ...

David

+0

vikiiii Zamierzałem wprowadzić chytry komentarz pytając ile "oczu" masz ... ale zdecydowałeś się nie (zauważ 3 "." Nie jeden, nie dwa). ;) – DaveM

Odpowiedz

8

To proste, gdy wiesz, gdzie szukać. Załóżmy, że Twoja META-INF/MANIFEST.MF zawiera linię:

Main-Class: mypackage.MyMainFile 

następnie struktura słoiku musi być

META-INF/MANIFEST.MF 
mypackage/MyMainFile.class 

gdzie MyMainFile musi być w odpowiednim opakowaniu:

package mypackage; 
public class MyMainFile { 
    public static void main(String[] args) { 
... 

Twój komunikat o błędzie jest spowodowany przez plik MyMainFile znajdujący się w niewłaściwym miejscu.

Edit: minęło już trochę czasu od ostatniego czasu zrobiłem to z ant, ale myślę, że trzeba coś takiego: strukturę pliku źródłowego, który odzwierciedla struture pakiet, powiedzmy

src/main/java/mypackage/MyMainFile.java 

i katalog umieścić skompilowany plik klasy do, powiedzmy

target 

(używam tutaj konwencje Maven, mrówka nie obchodzi i można użyć (kliknij prawym przyciskiem myszy) -> Ustawienia-> Jawa Budowanie Path-> Karta Źródła w Zaćmieć, aby ustawić źródło di r do src/main/java i target do target/classes). Następnie w mrówka, mają cel kompilacji, który kompiluje od źródła do celu:

<target name="compile"> 
    <mkdir dir="target/classes"/> 
    <javac srcdir="src/main/java" destdir="target/classes"/> 
</target> 

tak, że po ant compile powinien pojawić się plik klasy w celu

target/classes/mypackage/MyMainFile.class 

następnie mają ant zadania JAR pakiety to:

<target name="jar" depends="compile"> 
    <jar destfile="target/MyJarFile.jar" basedir="target/classes"> 
     <manifest> 
      <attribute name="Main-Class" value="mypackage.MyMainFile"/> 
     </manifest> 
    </jar> 
</target> 

Po mówiąc ant compile jar trzeba mieć MyJarFile pliku.słoik wewnątrz celu i

java -jar MyJarFile.jar 

powinien uruchomić główną metodę.

+0

OK, więc w jaki sposób uzyskać ANT, aby dać tego typu struktury w pliku JAR? Czy mogę uruchomić ANt z niewłaściwej lokalizacji? (pamiętaj, że uruchamiam zadanie ANT z poziomu Eclipse, a nie CLI). I dlaczego ANT tworzy inny typ struktury katalogów (co jest poprawne i jak określić jedno lub drugie, których nie znalazłem w dokumentach ANT ... jeszcze! ​​ – DaveM

+0

wallenborn obecnie w mojej "kompilacji" wskazuję do aa destfile = "$ {class}" i class = "build", więc to jest, gdzie jest mój problem? Zamierzam to zmienić i zobaczyć, co się stanie ... – DaveM

+0

W zadaniu kompilacji, destfile jest prawdopodobnie zbyt Zasadniczo tylko chcesz powiedzieć zadanie kompilacji: weź wszystko w tym katalogu src, rekurencyjnie, skompiluj i zapisz otrzymane klasy do tego katalogu docelowego, zachowując podkatalogi – wallenborn

Powiązane problemy