javac ma dwa switche:
-source release
Specifies the version of source code accepted. The following values for release are allowed(...)
oraz
-target version
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. Valid targets are 1.1, 1.2, 1.3, 1.4, 1.5 (also 5), 1.6 (also 6), and 1.7 (also 7).
The default for -target depends on the value of -source(...)
W ten sposob ustawiasz sobie wersje kod zrodlowy (np. jesli ustawisz 1.6 to kompilator wypluje bledy gdy uzyjesz nowosci z Java 7, np. try z zasobami czy inne) oraz wersje bytecodu ktory ma byc generowany - dla 1.6 / 6 wygeneruje taki ktory zadziala na starszych JVM (oczywiscie tylko 6, ale mozna zejsc jeszcze nizej).
Ciekawi mnie ze blad ktory dostawales to ten ktory mowi o braku klasy a nie cos w stylu: 'class level 51, expected 50' czy costam w tym stylu. No ale wazne ze dziala.
Jeszcze taka ciekawostka - da sie napisac progem w wyzszej wersji Java, skompilowac do bytecodu dla nizszej JVM, ale i tak moze nie dzialac - jesli korzystasz z jakichs method / klas ktore sa dostepne od 7. Wtedy dostaniesz ClassNotFoundException albo NoSuchMethodError czy podobne.
Z doswiadczenia wiem ze sa to bledy dosc trudne do zrozumienia jak sie o nich nie wie - np. ja przed paroma laty miale taki projekt, ktory mial chodzic na WebSphere 6 (tam byla java od IBM w wersji 1.4 pakowana), a program rozwijalismy pod JDK 5 plus tomcat (websphere nie nadawal sie do ciaglego redeploymentu, i to wolne swinstwo bylo). Mimo ustawienia poziomu kodu na 1.5 i targetu na 1.4, program sie sypal. Okazalo sie ze problemem byla metoda java.lang.Boolean.parseBoolean, ktorej w 1.4 jeszcze nie bylo ;d