2012-05-19 11 views
27

Podczas korzystania z kompilatora Java (javac) możemy określić dwa rodzaje zgodności. Jeden używa -source, a drugi używa -target. Jaka jest różnica między tymi dwoma?jaka jest różnica między zgodnością -source i -target?

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

Czy istnieje również przypadek, w którym używamy innego źródła i docelowego poziomu zgodności?

Odpowiedz

21

Z javac docs:

-source Specifies the version of source code accepted.

-target Generate class files that target a specified version of the VM. Class files will run on the specified target and on later versions, but not on earlier versions of the VM.

W przykładzie:

-source 1.5 and -target 1.6 

To byłoby użyte, aby upewnić się, że kod źródłowy jest kompatybilny z JDK 1.5, ale powinien generować pliki klas do użytku w JDK 1.6 i nowszych.

Dość dlaczego zrobiłbyś to jest inna sprawa.

+2

Zauważ, że znalazłem, że 'javac' nie obsługuje wszystkich kombinacji. Również faktycznie mam przypadek użycia. W Javie 6 JAX-WS jest wbudowany, więc chciałem mieć rozwiązanie działające na zwykłej Javie 6 bez dodatkowych bibliotek. To rozwiązanie wymagało wówczas, aby kilku klientów mogło być wykonywanych na JVM Java 5 (i JAX-WS wprowadzonym z boku), a składnia '@ Override 'została zmieniona, więc nie była natychmiastowo kompilowana przez Java 5 javac. (To był wcześniejszy, może być łatwiej zrobić dzisiaj). –

+0

Zobacz także '-bootclasspath', jak opisano dalej w [tej odpowiedzi] (http://stackoverflow.com/a/10663478/418556). –

+1

@skaffman - * "Dość, dlaczego to zrobiłeś to inna sprawa ..." * - Java próbuje interpretować komentarze. Jeśli języki nie są ustawione poprawnie, kompilacja może się nie powieść z powodu niedozwolonego znaku w komentarzach !!! Czasami łatwiej jest powiedzieć kompilatorowi, aby przestał interpretować komentarze, a następnie, powiedzmy, naprawić informację o prawach autorskich w setkach plików. – jww

10

Numer -source określa poziom zgodności kodu źródłowego: czy używasz Adnotacji? Wtedy potrzebujesz co najmniej 1.5; czy używasz @override w implementacjach interfejsu, potrzebujesz 1.6 itd.

Specyfika wersji Java, na której chcesz prowadzić swoje zajęcia. Można użyć kompilatora Java SE 7 i skompilować go do pracy w środowisku Java SE 1.5.

7

Jest to przydatne głównie przy tworzeniu pliku JAR współpracującego ze starszą wersją Java. Uważam, że do tej pory wszystkie JDK są w stanie wykonać starszą wersję, więc nie ma prawdziwego powodu, aby cel był większy niż źródło.

Warto jednak ustawić na przykład target 1.6 podczas korzystania z 1.7 JDK.

Nie jestem pewien, ale wierzę, że to może działać w niektórych sytuacjach do kompilacji kodu java przy użyciu 1,7 1,7 1,6 kompilator do słoika, na przykład wyrażenia takie jak

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

że są ważne tylko w wersji 1.7+ należy skompilować do kompatybilnego kodu bajtowego 1.6. Ale nie sprawdziłem, czy kompilator faktycznie to zrobi. Niestety, nie wydaje się, aby to zostało wdrożone w praktyce.

+2

Chociaż jest to dobra teoria, nie będzie to faktycznie robić w praktyce. Jeśli spróbujesz źródła 1.7 i docelowej wersji 1.6, otrzymasz ten błąd: "wydanie źródłowe 1.7 wymaga wersji docelowej 1.7" – Tomas

+4

Znalazłem to, co @ tom mówi, że jest prawdziwe. Co jest irytujące, skoro wydaje się, że jest to najbardziej przydatne połączenie? Zapobiega pisaniu bibliotek na poziomie źródła 1.7, które można połączyć w 1.6 projektach. Czy jest w ogóle jakieś rozwiązanie? – Matthias

+0

@Matthias Nie ma problemu z łączeniem bibliotek z różnych wersji plików klas. Jedynym powodem użycia '-target 1.6' jest to, czy JVM z kodem wynosi 1.6. – Nayuki