PDA

Visualizza versione completa : Problema compilazione Java da Geany (o da terminale attraverso geany)



Andy86
11-09-16, 15: 02
:bai

Premessa: Non sapevo se aprirla qui o nella sezione programmare, ho pensato che era più un problema di ambiente che di sorgente, quindi andava bene qui, spero di non aver sbagliato.

Da un po' di tempo ho eliminato eclipse perché per le mie quattro cavolate in Java era diventato troppo pieno di roba e di conseguenza sempre più lento ad ogni aggiornamento (senza contare i problemi di dipendenze e compatibilità gtk/qt).

Per ora sto usando Geany, consigliatomi in tempi non sospetti da Pierino89, e che già uso con successo sia per bash (anche se per quest'ultimo è meno preciso nel colorare la sintassi) e html/php.

Ma con Java ho un problema extra per quanto riguarda la compilazione... il pulsante per lanciare la compilazione di default non funziona, non so se sia buggato, obsoleto, o se sia un problema mio, in ogni caso succede che Geany di default lancia il comando all'interno del package in cui sta la classe, mentre javac vuole il percorso assoluto o comunque comprensivo del package, per cui ho dovuto sostituire il comando con questo:


Only registered members can view code.

Che in pratica salva il nome della dir corrente, fa il call dir all'indietro e lancia il comando con path "assoluto" rispetto al package.

Se il package di una classe è "nomeprogramma" in "qualchemiadir/nomeprogramma", il comando dev'essere per forza "javac nomeprogramma/Classe.java" altrimenti non compila.

Tuttavia ancora non basta. Il problema si ripresenta quando devo compilare classi all'interno di un sotto-package,
che a livello di directory è proprio una sotto-directory...

Per qualche motivo (geany o javac) non riesce a compilare le classi a catena, seppur vengono chiamate nel sorgente.
Sembra che compili in automatico solo quelle nello stesso package della classe su cui chiamo javac, quelle nei sottopackage vengono ignorate.

Solo che per lanciare il comando diretto sulla classe nel sottopackage, occore, come sopra, specificare il percorso completo del package, quindi composto delle due sottodirectory, altrimenti non compila.

Se il package di una classe è "nomeprogramma.alcunecose" in "qualchemiadir/nomeprogramma/alcunecose", il comando dev'essere per forza "javac nomeprogramma/alcunecose/Classe.java" altrimenti non compila.

Inutile dire che non posso barare sulla dichiarazione dei package nel sorgente, perché non servirebbe a nulla, se non, forse, a essere peggio della soluzione.

Siccome io ho il vizio di compilare a macchinetta per ogni minima modifica del sorgente mi scoccia parecchio se tutte le volte devo lanciare il comando sulla classe in modo separato.

Avevo pensato di provare a sostituire il comando con uno script che si occupi di chiamare la compilazione su tutte le classi che trova nella dir, dovrei comunque vedere l'output di eventuali errori in geany.

Però prima di impegnarmi per fare lo script vorrei vedere se qualcuno ha idee migliori.

:thx



Edit 12/09:

Toccando ferro pare che io abbia risolto con questo comando:


Only registered members can view code.

È comunque un mezzo script, ma in sostanza fa il find di tutte le classi appartenenti alla dir in cui viene eseguito e passa l'output con tanto di percorsi completi di package a javac, che in questo modo è forzato a processare tutte le classi.

ps: ho scoperto che il problema deriva dal fatto che javac confronta la data dei .class esistenti con i .java e ignora quelli che non risultano modificati, per cui se la classe modificata viene richiamata solo da una classe non modificata, la chiamata a tale classe non sarà processate e quindi la classe non sarà ricompilata.

L'unica cosa che non ho capito è se chiamando le classi letteralmente la compilazione viene forzata anche se non necessaria, ma se è l'unica soluzione non è certo il male peggiore.