2011-11-29 8 views
8

Dziś rano napisałem kilka programów ćwiczeniowych do mojej certyfikacji java i zauważyłem, że źle wpisałem nazwę pakietu, więc nie pasowało to do podkatalogu, w którym znajdował się plik java. Skompilowałem kod spodziewając się błędu, ale wszystko skompilowałem plik - nawet ostrzeżenie.Czy pakiety nie muszą być zgodne z podkatalogami, w których znajduje się plik java?

I googled trochę, a większość stron czytałem powiedział, że nazwa pakietu musi odpowiadać podkatalogu. Moje doświadczenie pokazuje, że tak nie jest.

Kiedy próbowałem uruchomić program, nie działało, ponieważ plik .class znajdował się w niewłaściwym katalogu. Przeniosłem go do odpowiedniego katalogu i dostał ten błąd:

Exception in thread "main" java.lang.NoClassDefFoundError: com/sample/directory 
/doesnt/even/exist/OtherPackageMemberModifiers (wrong name: com/sample/chap01/O 
therPackageMemberModifiers) 

Więc co myślę, widzę, że jest kod Java skompilować jeśli pakiet i podkatalogu nie zgadzają się, ale nie nie wydaje się być sposobem na uruchomienie kodu, jeśli to zrobisz. Czy to jest poprawne?

+3

zjawisko, że ścieżka pakiet i ścieżka katalogu są zbędny pokazuje swoją paskudną głowę. Kompilator miałby prawo do wydania błędu. Jednak nie będzie to 100%: package src.main.java.com.sample ... lub package com.sample. ... nadal nie wzbudzą żadnego błędu. Javac musiałby być oparty na katalogach (-d) i bazuje na plikach. –

Odpowiedz

14

Nazwa pakietu musi być zgodna z nazwą katalogu, aby plik klasy został znaleziony poprawnie. Nie ma ona wartości , aby dopasować nazwę katalogu w czasie kompilacji dla niektórych kompilatorów (na przykład javac), chociaż inne (takie jak Eclipse) będą co najmniej ostrzegać.

"Sposób na uruchomienie kodu, jeśli to zrobisz" jest utworzenie struktury katalogów i umieszczenie go tam ręcznie - sam plik klasy jest całkowicie poprawny.

Należy pamiętać, że jeśli użyjesz flagi -d, javac zbuduje dla ciebie odpowiednią hierarchię katalogów, niezależnie od lokalizacji źródłowej. Na przykład:

javac -d bin ClassInPackage.java 

stworzy wszelkich wymaganych katalogów pod bin dopasować pakiet zadeklarowanej w ClassInPackage.java.

Mimo wszystko Thise, bym nadal zachęcamy wykonywanie katalogi źródłowe pasujące paczek, chociaż można uciec bez niego :)

Powiązane problemy