jaka jest różnica między kompatybilnością-source i-target?

Używając kompilatora Java (javac), możemy określić dwa rodzaje kompatybilności. Jeden używa -source, a drugi -target. Jaka jest różnica między tymi dwoma?

Na przykład, -source 1.5 i -target 1.6?

Czy Jest jakiś przypadek, w którym używamy innego poziomu zgodności źródła i celu?

Author: Nayuki, 2012-05-19

3 answers

From the javac docs :

-source określa akceptowaną wersję kodu źródłowego.

-target generuje pliki klas, które są kierowane do określonej wersji maszyny wirtualnej. Pliki klas będą uruchamiane na określonym obiekcie docelowym i w późniejszych wersjach, ale nie na wcześniejszych wersjach maszyny wirtualnej.

W twoim przykładzie:

-source 1.5 and -target 1.6

ByĹ 'oby to uĺźyte do upewnienia siÄ™, Ĺźe kod ĹşrĂłdĹ' owy jest zgodny z JDK 1.5, ale powinien generowaÄ ‡ pliki klas do uĹźycia na JDK 1.6 i Później.

Całkiem dlaczego to już inna sprawa.

 37
Author: skaffman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

-source wskazuje, jaki poziom zgodności ma Twój kod źródłowy: czy używasz adnotacji? Wtedy będziesz potrzebował co najmniej 1.5; Czy używasz {[2] } na implementacjach interfejsu, potrzebujesz 1.6 itp

-target określa, na jakiej wersji Javy chcesz uruchomić swoje klasy. Możesz użyć kompilatora Java SE 7 i skompilować do uruchomienia na Java SE 1.5.

 11
Author: raphaëλ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-03 16:42:06

Jest to głównie przydatne do wytworzenia pliku jar pracującego ze starszą wersją Javy. Wierzę, że do tej pory wszystkie JDK są w stanie wykonać starszą wersję, więc nie ma prawdziwego powodu, aby mieć cel większy niż source.

Sensowne jest jednak ustawienie target Na np. 1.6 przy użyciu 1.7 JDK.

Nie jestem pewien, ale wierzę, że w niektórych sytuacjach może zadziałać skompilowanie kodu Javy 1.7 przy użyciu kompilatora 1.7 do jar 1.6, na przykład wyrażenia takie jak

ArrayList<Integer> foo = new ArrayList<>();

Że są ważne tylko w wersji źródłowej 1.7 + powinny skompilować się do kodu bajtowego zgodnego z 1.6. Ale nie zweryfikowałem, czy kompilator rzeczywiście to zrobi. niestety, wydaje się, że nie jest to zaimplementowane w praktyce.

 7
Author: Has QUIT--Anony-Mousse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-09 17:03:05