Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Javac a volte non sovrascrive le classi?

    Salve,
    volevo capire questa cosa: mi capita di correggere dei codici per errori segnalati in fase di compilazione
    codice:
    > javac nomeClasse.java
    Talvolta modifico il codice sorgente di una classe facente parte di un programma già compilato in precedenza, e il suddetto comando non ricompila, nel senso che eseguendo il programma, si comporta secondo i file .class precedenti.
    Compilo ed eseguo da prompt, ma anche chiudendo e riaprendo l'applicazione, finché non cancello dalla cartella i file .class, non riesco a sovrascriverli.
    Questo è abbastanza antipatico dato che temo di aver scritto istruzioni non corrette, quando invece sto eseguendo un codice oramai superato...
    C'è una spiegazione?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,228
    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    codice:
    > javac nomeClasse.java
    Talvolta modifico il codice sorgente di una classe facente parte di un programma già compilato in precedenza, e il suddetto comando non ricompila
    Il javac (ri)compila solo i sorgenti che tu elenchi sulla linea di comando, più tutti i sorgenti delle classi che ciascuna classe referenzia in qualche modo.

    Esiste una opzione non-standard -Xprefer che per default vale newer ovvero: Reads the newer of the source or class files for a type. Cioè: se trova anche un .class, tra il .java e il .class viene usato quello più "recente" (dalla data di modifica). Questo generalmente va quasi sempre bene.

    Se A.java "usa" B.java e modifichi B, allora javac A.java ricompila entrambi. Ma se B usa A (e NON il contrario) e tu modifichi B ma poi fai solo javac A.java, il B NON viene ricompilato.


    E comunque, usare javac "a mano" va bene solo per chi inizia (molto istruttivo) o per cose piccole/veloci da fare. In qualunque altro scenario sarebbe meglio usare un IDE e/o Ant/Maven/Gradle/ecc...
    Ultima modifica di andbin; 19-09-2022 a 15:07
    Andrea • andbin.dev
    Senior Java developerSCJP 5 (91%) – SCWCD 5 (94%)

  3. #3
    Io compilo la classe con il main(), e mi ritrovo a lanciare poi i file .class vecchi.

    Per lavoro sto usando Visual Studio Code che, valido per codici front-end e virtualizzazione di server localhost, sta presentando bug imbarazzanti per Java (segnala errori nei commenti, impone il close() su istanze di Scanner anche se poi Scanner serve nel caller di quel metodo...), oltre a spedire i file .class in una cartella di sistema quanto meno nascosta...

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,246
    Oltre a quanto già detto da andbin, gli unici altri casi in cui mi sono trovato ad aver a che fare con compilazioni che non sembrano produrre i file .class sono queste:

    1) File sorgenti modificati MA NON SALVATI (quando, come nel tuo caso, ci si affida ad un IDE per la stesura del sorgente e poi alla riga di comando per la compilazione, può capitare di "dimenticarsi" di salvare il file nel passaggio dall'uno all'altra)

    2) Modifiche a file sorgenti residenti altrove (si è convinti di star modificando un determinato file, ma invece se ne st modificando una copia posta da un altra parte: generalmente questo accade quando nemmeno ci si affida ad un IDE, ma si fa tutto a mano)

    3) Modifiche al sorgente di un file che fa parte di un progetto che non è "attivo" (questo mi accade quando, usando NetBeans, sono convinto di aver reso "attivo" un determinato progetto, ma così non è... ricompilo, ma l'IDE lancia la compilazione di un altro progetto, che è attivo).

    Per il resto, javac compila sempre.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Oltre a quanto già detto da andbin, gli unici altri casi in cui mi sono trovato ad aver a che fare con compilazioni che non sembrano produrre i file .class sono queste:

    1) File sorgenti modificati MA NON SALVATI (quando, come nel tuo caso, ci si affida ad un IDE per la stesura del sorgente e poi alla riga di comando per la compilazione, può capitare di "dimenticarsi" di salvare il file nel passaggio dall'uno all'altra)

    2) Modifiche a file sorgenti residenti altrove (si è convinti di star modificando un determinato file, ma invece se ne st modificando una copia posta da un altra parte: generalmente questo accade quando nemmeno ci si affida ad un IDE, ma si fa tutto a mano)

    3) Modifiche al sorgente di un file che fa parte di un progetto che non è "attivo" (questo mi accade quando, usando NetBeans, sono convinto di aver reso "attivo" un determinato progetto, ma così non è... ricompilo, ma l'IDE lancia la compilazione di un altro progetto, che è attivo).

    Per il resto, javac compila sempre.
    1) Per "vizio" salvo sempre prima di chiudere a icona l'editor.
    2) Questo mi è successo solo per qualche pagina web, che modifico in locale ma sul browser c'è la pagina sul server. Con Java non ho di questi problemi perché apro il prompt dall'editor nella cartella dove si trovano i file Java.
    3) Successo con IntelliJ...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2022 vBulletin Solutions, Inc. All rights reserved.