A opção
-source serve para indicar ao compilador a versão da linguagem com a qual o código a ser compilado é compatível. Assertions, por exemplo, só existe em java a partir da versão 1.4. Sendo assim, para compilar um código com assertions, podemos usar:
javac -source 1.4 arquivo.javaou
javac -source 1.5 arquivo.javamas não
javac -source 1.3 arquivo.javaNesse último caso, a compilação falha. Se, por outro lado, assert é usado como um identificador e compilado com a opção
-source 1.3, então a compilação é bem sucedida, mas com alertas. Se compilado com a opção
-source 1.4 ou 1.5 e assert é um identificador, a compilação falha. Generics só passou a fazer parte da linguagem a partir da versão 1.5. Por default, o compilador pressupõe que o código é compatível com a versão 1.5.
A opção
-target serve para indicar ao compilador com qual versão da JVM os bytecodes devem ser compatíveis. Se você deseja que o seu programa rode em JVMs antigas como a 1.2, então compile o seu código com o seguinte comando:
javac -target 1.2 arquivo.java