Jaki jest związek / różnica między sourceCompatibility
i targetCompatibility
? Co się dzieje, gdy mają różne wartości?
Według dokumentacji Gradle :
sourceCompatibility
to „Zgodność wersji Java do użycia podczas kompilowania źródła Java”.
targetCompatibility
to „Wersja Java do generowania klas”.
Rozumiem, że targetCompatibility
wygeneruje kod bajtowy Java zgodny z określoną wersją języka Java. Czy jest to podzbiór funkcji sourceCompatibility
?
Zachowaj ostrożność, kiedy ich używasz; zostaliśmy ugryzieni przez ludzi, którzy robili przypuszczenia.
To, że używasz sourceCompability (lub targetCompatibility) w wersji 1.5, nie oznacza, że zawsze możesz skompilować swój kod za pomocą JDK 1.6 i oczekiwać, że będzie działał pod JDK 1.5. Problemem są dostępne biblioteki.
Jeśli zdarzy się, że Twój kod wywoła jakąś metodę, która jest dostępna tylko w JDK 1.6, nadal będzie kompilować się z różnymi opcjami zgodności dla docelowej maszyny wirtualnej. Ale kiedy go uruchomisz, zakończy się niepowodzeniem, ponieważ nie ma metody powodującej naruszenie (otrzymasz MethodNotFoundException lub ClassNotFoundException).
Z tego powodu zawsze porównuję ustawienie zgodności z rzeczywistą wersją Java, w której tworzę. Jeśli nie pasują, zawiodę kompilację.
źródło
if(JavaVersion.current() != JavaVersion.VERSION_1_8) throw new GradleException("This project requires Java 8, but it's running on "+JavaVersion.current())
W ten sposób rozwiązuję ten problem na samym początku pliku build.gradle.javac
opcja--release
mająca na celu rozwiązanie tego problemu, zezwalając jedynie na korzystanie z API dostępnego w określonej wersji Java. Więcej na ten temat można znaleźć na stronie stackoverflow.com/a/43103038/4653517sourceCompatibility = określa, która wersja języka programowania Java będzie używana do kompilowania plików .java . np. sourceCompatibility 1.6 = określa, że do kompilacji ma być używana wersja 1.6 języka programowania Java plików .java .
Domyślnie sourceCompatibility = "wersja aktualnie używanej maszyny JVM" i targetCompatibility = sourceCompatibility
targetCompatibility = Ta opcja zapewnia, że wygenerowane pliki klas będą zgodne z maszynami wirtualnymi określonymi przez targetCompatibility. Zauważ, że w większości przypadków wartością opcji -target jest wartość opcji -source; w takim przypadku możesz pominąć opcję -target.
Pliki klas będą działać w miejscu docelowym określonym przez targetCompatibility i na nowszych wersjach, ale nie we wcześniejszych wersjach maszyny wirtualnej
źródło
Moim zdaniem „sourceCompatibility” oznacza, jakiej funkcji można użyć w kodzie źródłowym. Na przykład, jeśli ustawisz sourceCompatibility na 1.7, nie możesz użyć wyrażenia lambda, które jest nową funkcją w java 8, nawet jeśli wersja jdk to 1.8.
Jeśli chodzi o „targetCompatibility”, oznacza to, na której wersji jre można uruchomić wygenerowany plik klasy. Jeśli ustawisz ją na 1.8, może nie działać poprawnie na jdk 1.7, ale zwykle może działać na wyższej wersji jdk.
źródło
To są flagi polecenia javac.
Innymi słowy: piszesz kod w
source
wersji i kompilujesz swoje klasy dotarget
wersji VM. Aby go uruchomić np. Na innej stacji roboczej ze starszą wersją java.Według: https://docs.oracle.com/en/java/javase/11/tools/javac.html
źródło