2013-03-05 13 views
9

Diciamo che ho un progetto Java codificato con Java 1.5 e sto usando una versione successiva di Java ma ho impostato il target su 1.5.Utilizzando l'ultima versione di JRE anziché una versione precedente di Java, sono sicuro che funzionerà?

Se il codice compila e verifica OK con Java successivo, sono sicuro che funzionerà lo stesso su un runtime Java 1.5 effettivo?

O dovrò installare una versione di tutti i JRE da cui dipendo per essere sicuro?

Cosa succede ai bug nel JRE? Se c'è un bug in 1.5, questo è corretto in 1.6. Se utilizzo Java 1.6 con target impostato su 1.5, quell'errore mi riguarderà?

In uno scenario realistico, è una preoccupazione che devo assolutamente avere?

+0

Ho riscontrato il seguente problema: java7 ha aggiunto nuovi metodi a un'interfaccia già esistente. Anche dopo averlo impostato su java6 compliance, il compilatore mi ha detto che dovevo implementare i metodi mancanti (annotandolo con '@ Override'). Dopo averlo fatto, java6 mi ha detto che non conosceva i nuovi metodi sovrascritti. Ma forse era solo un problema di eclissi ... – moeTi

risposta

9

si Supponendo obiettivo fissato e la fonte-1,5, è necessario solo per essere preoccupati in tre casi principali mi viene in mente:

  • Stai usando interni com.sun classi, che possono essere mutate o scomparsi (o fare affidamento su qualche altro comportamento interno in qualche modo.)
  • Si sta facendo affidamento su un comportamento errato che è stato risolto in una versione successiva.
  • Si esegue in un cambiamento all'indietro incompatibili (raro, ma è stato conosciuto per accadere.)

    Cosa succede con errori nel JRE? Se c'è un bug in 1.5, questo è corretto in 1.6. Se utilizzo Java 1.6 con target impostato su 1.5, quell'errore mi riguarderà?

Se il bug è nelle librerie, allora no, non interesserà voi. Solo Target stabilisce realmente la versione del bytecode da compilare, continuerai a utilizzare le librerie aggiornate. Come detto in precedenza, si noti tuttavia che questo potrebbe potenzialmente causare problemi se si basa su questo comportamento bacato.

Se c'è una modifica intenzionale all'indietro incompatibile, quindi tutti i casi che ho visto di questo si presentano come errori di tempo di compilazione piuttosto che errori di runtime, quindi saranno banali da individuare (e di solito abbastanza facili da risolvere pure .)

Vorrei ancora sostenere i test sulla nuova versione della JVM prima del rilascio, ma in pratica non è di solito un problema, nella mia esperienza comunque.

5

Tutte le nuove implementazioni JRE sono realizzate in modo da mantenere la compatibilità, quindi la risposta è . Tuttavia, ti suggerisco di effettuare il test nella tua app in quanto potrebbero esserci problemi molto specifici per il tuo progetto.

2

Per riassumere la tua domanda: JRE è compatibile con le versioni precedenti ed è compatibile con JDK?

La risposta breve è .

Spiegazione: I JDK non sono retrocompatibili. codice JDK5 non può essere eseguito su JVM4 o JDK6 su JVM5.

Tuttavia JRE è reso compatibile, perché spesso le organizzazioni write once, eseguire molte volte

Perché: Come del JRE diventano sempre più sofisticati, con una gestione Mucchio più intelligenti, raccolta dei rifiuti, gestione dei thread, ecc., i clienti sono tentati di passare alla versione più recente di JVM.

Bugs
bug presente reale in JVM si smettere di comportarsi in questo modo, se si utilizza in seguito JVM versione con il precedente 'target'. Questo perché target=prev_version in realtà non invoca del tutto la JVM precedente.
Raccoglie solo delta e tratta il codice in modo diverso. Tuttavia se si trattasse di una funzionalità introdotta intenzionalmente nella nuova JVM (diciamo 6), passando a target = 1.5 verrà effettivamente eseguito il backup su beahvior per 1.5

Speranza che chiarisca il tuo dubbio in una certa misura.

Problemi correlati