Errore nell'esecuzione di un file compilato

di il
7 risposte

Errore nell'esecuzione di un file compilato

Buongiorno,

sto muovendo i primi passi nella programmazione con java e incontro già il primo rompicapo
Nel mio sistema Windows ho installato Java 8, che credo sia la versione più recente scaricabile gratis, che mi fornisce il jre e mi crea la cartella "oracle\java\javapath".
Il jdk che invece ho scaricato è l'ultima versione, la 14.

Sto seguendo il libro di Claudio De Sio, consigliatomi da voi per iniziare a programmare e tratta di Java 5. Il primo approccio viene dato attraverso la creazione di un file con blocco note salvato in java, compilato dal cmd con javac nomefile.java e successivamente viene eseguito il bytecode generato con java nomefile.

Come da guida ho impostato il path verso "java\jdk-14.0.1\bin" ma quando vado ad eseguire non trova il percorso per l'eseguibile di java.
Dal PATH quindi ho settato anche "oracle\java\javapath" e adesso come errore nel cmd mi da il seguente:
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: HelloWorld has been compiled by a more recent version of the Java Runtime (class file version 58.0), this version of the Java Runtime only recognizes class file versions up to 52.0
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

E' possibile lavorare con una versione del jdk più recente, ovvero la 14, su un'installazione di java più vecchia ovvero la 8? Oppure le versioni più recenti sono a pagamento ed essendo quella gratuita la 8 nel mio caso dovrei scaricare il jdk per la 8 update 251?

Infine una curiosità, se avessi usato un IDE, in cui la compilazione e l'esecuzione avviene in maniera "più automatica", avrei lo stesso problema?

Grazie,
Simone

P.S: il codice sorgente che sto provando a compilare ed eseguire, è un helloworld di prova trovato su internet (in caso può essere utile, ma credo il problema sia al di fuori del codice perchè è compilato correttamente il file nomefile.class viene generato)

public class HelloWorld {

   public static void main(String[] args) {

      System.out.println("Hello, World!");

   }
}

7 Risposte

  • Re: Errore nell'esecuzione di un file compilato

    simop95 ha scritto:


    Nel mio sistema Windows ho installato Java 8, che credo sia la versione più recente scaricabile gratis, che mi fornisce il jre e mi crea la cartella "oracle\java\javapath".
    Il jdk che invece ho scaricato è l'ultima versione, la 14.
    Sinceramente non vedo perché devi fare questo "mix", cioè avere un JDK 14 e un JRE 8, che rischia solo di dare problemi. Tecnicamente NON è un problema averli entrambi ma la cosa va gestita oculatamente

    simop95 ha scritto:


    Error: A JNI error has occurred, please check your installation and try again
    Exception in thread "main" java.lang.UnsupportedClassVersionError: HelloWorld has been compiled by a more recent version of the Java Runtime (class file version 58.0), this version of the Java Runtime only recognizes class file versions up to 52.0
    E infatti .... sei proprio caduto in "quel" problema appena detto prima.
    Ovvero, nel tuo caso hai compilato con il JDK 14 che ha generato il .class con "target" Java 14 ma poi hai cercato di eseguire con il JRE 8. E ovviamente così non funziona.

    simop95 ha scritto:


    E' possibile lavorare con una versione del jdk più recente, ovvero la 14, su un'installazione di java più vecchia ovvero la 8?
    Certo ma devi compilare specificando come "target" Java 8 (e ovviamente non puoi usare nulla di feature "nuove" disponibili dopo Java 8 ).

    simop95 ha scritto:


    Oppure le versioni più recenti sono a pagamento ed essendo quella gratuita la 8 nel mio caso dovrei scaricare il jdk per la 8 update 251?
    No, non c'entra nulla. (e non c'è nulla di JRE/JDK "a pagamento").

    simop95 ha scritto:


    Infine una curiosità, se avessi usato un IDE, in cui la compilazione e l'esecuzione avviene in maniera "più automatica", avrei lo stesso problema?
    In linea di massima no. Ma bisogna vedere come è impostato l'IDE (nel senso, di quanti/quali runtime Java è a conoscenza).
  • Re: Errore nell'esecuzione di un file compilato

    Quindi mi sembra di capire che se volessi lavorare senza un IDE, dovrei usare il JDK per la versione 8, sennò avrei problemi di compatibilità?

    Ho letto cercando su google infatti che oracle non ha reso disponibile JRE oltre l'8. Mi sembra di capire che se si vuole usare la versione più recente del JDK bisogna usare per forza un IDE che supporti il runtime per quella versione


    Grazie per tutte le risposte andbin
  • Re: Errore nell'esecuzione di un file compilato

    simop95 ha scritto:


    Quindi mi sembra di capire che se volessi lavorare senza un IDE, dovrei usare il JDK per la versione 8, sennò avrei problemi di compatibilità?
    Bisogna anche chiarire quale IDE. Eclipse ad esempio NON ha bisogno di un JDK, né per avviarsi lui, né per compilare perché ha già un suo compilatore Java.

    simop95 ha scritto:


    Ho letto cercando su google infatti che oracle non ha reso disponibile JRE oltre l'8.
    No, non è vero. Oracle ha fornito il JRE fino a Java SE 10. Poi da Java SE 11 ha fornito soltanto il JDK.

    Java SE 10 Archive (qui vedi anche i JRE)
    Java SE 11 Archive (qui NON vedi più JRE)

    Invece c'è un'altra questione (anche rilevante): fino a Java SE 8 Oracle forniva anche le build a 32 bit. Da Java SE 9 ci sono soltanto le build a 64 bit, quindi per sviluppare serve una macchina/sistema a 64 bit.

    simop95 ha scritto:


    Mi sembra di capire che se si vuole usare la versione più recente del JDK bisogna usare per forza un IDE che supporti il runtime per quella versione
    No, non è proprio così, o comunque bisogna vedere quale IDE.
  • Re: Errore nell'esecuzione di un file compilato

    andbin ha scritto:


    No, non è vero. Oracle ha fornito il JRE fino a Java SE 10. Poi da Java SE 11 ha fornito soltanto il JDK.

    Java SE 10 Archive (qui vedi anche i JRE)
    Java SE 11 Archive (qui NON vedi più JRE)
    Ciò significa che mentre prima forniva JRE e JDK a parte, adesso da il jre è incluso nel JDK in automatico?
    Mi sono reso conto di aver fatto molta confusione. Ho scaricato e installato questa versione https://www.java.com/it/download e il JDK 14.
    Pensando che quella su quel sito fosse l'ultima versione.

    Infatti disinstallando la versione 8 e tenendo solo il JDK 14, compilando ed eseguendo il codice da dos non mi da più errori di versione.

    Grazie mille per le delucidazioni
  • Re: Errore nell'esecuzione di un file compilato

    simop95 ha scritto:


    Ciò significa che mentre prima forniva JRE e JDK a parte, adesso da il jre è incluso nel JDK in automatico? Il JDK è sempre stato ed è tuttora sostanzialmente un JRE+strumenti di sviluppo.

    Semplicemente fino al Java SE 10 era anche disponibile separatamente il JRE cioè il solo runtime per chi NON deve sviluppare (quindi es. utenti finali, ecc...)

    simop95 ha scritto:


    Mi chiedevo anche se, fatte queste considerazioni sulla compatibilità tra JDK e JRE, se scrivo un software usando il JDK versione 14, se la apre uno con una versione di java precedente installata avrà problemi ad eseguirla.
    Il problema, lo ripeto, non è tanto la versione del JDK. Ma il class version. All'interno di un file .class c'è sostanzialmente "marchiata" la versione, come dire es. "io sono stato fatto con Java 10". Questa classe è riconosciuta e "gira" su runtime superiori ma NON inferiori.

    simop95 ha scritto:


    Solitamente chi produce software include un'installazione del JRE aggiornata alla versione utilizzata?
    Dipende ... sì e no. Certi software possono anche avere due pacchettizzazioni differenti: con JRE incorporato e senza JRE incorporato (ovvero, uno si deve arrangiare e sistemare eventuali problematiche)
  • Re: Errore nell'esecuzione di un file compilato

    Grazie mille, avevo modificato il messaggio ma sei stato molto celere a rispondere Adesso è molto più chiaro. Attualmente "obbligano" anche chi non deve sviluppare a scaricare tutto il pacchetto.

    Ma curiosità la questione del file bytecode che funziona dalla versione utilizzata in poi, non risulta un problema per l'utilizzatore? Certo, sono fatti suoi aggiornare il proprio sistema all'ultima versione, ma diventerebbe un problema per chi ha versioni più vecchie. Forse per questo si utilizzano molto le web app
  • Re: Errore nell'esecuzione di un file compilato

    simop95 ha scritto:


    Grazie mille, avevo modificato il messaggio
    Ok, solo una cosa: il sito java.com è più che altro per gli utenti "finali" (non sviluppatori). Per gli sviluppatori infatti c'è la sezione specifica sul sito Oracle: https://www.oracle.com/java/technologies

    simop95 ha scritto:


    Attualmente "obbligano" anche chi non deve sviluppare a scaricare tutto il pacchetto.
    Sì beh, ad un utente "finale" cambia poco/nulla. Gli strumenti di sviluppo del JDK sono pochi, a linea di comando e in termini di spazio disco occupato sono una piccolezza rispetto a tutto il runtime. Uno al massimo gli strumenti di sviluppo non li usa ..

    simop95 ha scritto:


    Ma curiosità la questione del file bytecode che funziona dalla versione utilizzata in poi, non risulta un problema per l'utilizzatore? Certo, sono fatti suoi aggiornare il proprio sistema all'ultima versione, ma diventerebbe un problema per chi ha versioni più vecchie. Forse per questo si utilizzano molto le web app
    No le webapp non c'entrano su questo aspetto.
    Chiariamo comunque una cosa: se uno ha una applicazione per Java 8 e un JRE 8 non è che per forza deve mettere un JRE/JDK superiore. Anzi, con le recenti versioni (diciamo da Java SE 9 in avanti), bisogna prestare molta più attenzione e NON è detto che con un runtime superiore la applicazione continui a funzionare.
    In particolare da Java SE 9 in poi hanno iniziato a fare "pulizie" varie per togliere API/strumenti che evidentemente sono stati ritenuti inutili/obsoleti o magari pure controproducenti per la evoluzione di Java.

    Tanto per dirne una (visto di recente con un utente del forum). L'installer del NetBeans 11.3 non funziona con un JDK 14 perché gli serve il pack200 (un vecchio sistema per comprimere furbescamente di più i jar) che nel JDK 14 è stato rimosso.
Devi accedere o registrarti per scrivere nel forum
7 risposte