2013-05-20 7 views
66

Jaki jest związek/różnica między sourceCompatibility i targetCompatibility? Co się dzieje, gdy są ustawione na różne wartości?Gradle, "sourceCompatibility" vs "targetCompatibility"?

Według Gradle documentation:

sourceCompatibility to "wersja Java kompatybilność użyć podczas kompilacji Java źródła." targetCompatibility to "Wersja Java do generowania klas dla".

Rozumiem, że targetCompatibility wygeneruje kod bajtowy java zgodny z określoną wersją Java, czy jest to podzestaw funkcji sourceCompatibility?

Odpowiedz

31

Zachowaj ostrożność podczas korzystania z nich; zostaliśmy ugryzieni przez ludzi, którzy przyjmują założenia.

Tylko dlatego, że korzystasz z funkcji sourceCompability (lub targetCompatibility) w wersji 1.5, nie oznacza to, że zawsze możesz skompilować kod za pomocą JDK 1.6 i oczekiwać, że będzie działał pod JDK 1.5. Problemem są dostępne biblioteki.

Jeśli twój kod zadzwoni do jakiejś metody, która jest dostępna tylko w JDK 1.6, nadal będzie kompilować się z różnymi opcjami Kompatybilności dla docelowej maszyny wirtualnej. Ale kiedy go uruchomisz, to się nie powiedzie, ponieważ nie ma metody obrażania (otrzymasz MethodNotFoundException lub ClassNotFoundException).

Z tego powodu I zawsze porównaj ustawienie zgodności z rzeczywistą wersją Java, którą buduję. Jeśli nie pasują, nie uda mi się skompilować.

+2

To jest subtelna, ale bardzo ważne spostrzeżenie. – Natix

+0

Jak je porównać? – zero01alpha

+0

Dlaczego nie można wykonać kompilacji? Opcja "bootstrap classpath" została podana tylko w celu złagodzenia tego problemu. Zawsze możesz użyć odpowiedniego bootstrapu i powinno działać dobrze. – Codebender

17

sourceCompatibility = określa, że ​​wersja języka programowania Java być wykorzystane do opracowania .java plików. np. SourceCompatibility 1.6 = określa, że ​​wersja 1.6 języka programowania Java będzie używana do kompilowania plików .java.

Domyślnie sourceCompatibility = „wersji obecnej JVM w użyciu” i targetCompatibility = sourceCompatibility

targetCompatibility = Opcja zapewnia, że ​​wygenerowane pliki klas będą kompatybilne z maszynami wirtualnymi określonym przez targetCompatibility. Zauważ, że w większości przypadków wartość opcji -target jest wartością opcji -source; w takim przypadku możesz pominąć opcję -target.

pliki klasa będzie działać na cel wskazany przez targetCompatibility i nowszych wersjach, ale nie na wcześniejszych wersjach VM

Powiązane problemy