[Risolto] Verificare come sta venendo eseguito il programma

di il
12 risposte

[Risolto] Verificare come sta venendo eseguito il programma

Buongiorno a tutti,
Uso Java con NetBeans 7.3.1.
Vorrei poter verificare, da codice, se il programma sta venendo eseguito da Netbeans oppure da compilato.
Non riesco a trovare questa informazione sul web.
Qualcuno gentilmente sa dirmi se sia possibile verificare questa cosa e come?

12 Risposte

  • Re: [Risolto] Verificare come sta venendo eseguito il programma

    ZioCrick ha scritto:


    Vorrei poter verificare, da codice, se il programma sta venendo eseguito da Netbeans oppure da compilato.
    Scusa ma detto così .... non vuol dire niente.
    Chiarisci la necessità o dubbio ...
  • Re: [Risolto] Verificare come sta venendo eseguito il programma

    Ok,
    Usando Netbeans per sviluppare, quando pigio F6 mi manda in esecuzione il programma, e questa è la condizione A.
    Ad un certo punto pigio la combinazione di tasti , <SHIFT><F11> e Netbeans compila il programma e genera il file .jar.
    Ora posso eseguire il .jar per esempio dal menù di start di Windows o di Linux. Questa è la condizione B.

    Ora vorrei riuscire a capire, da codice, se il mio programma sta venendo eseguito nella condizione A o nella B.
    Spero di essermi spiegato meglio.
  • Re: [Risolto] Verificare come sta venendo eseguito il programma

    ZioCrick ha scritto:


    Usando Netbeans per sviluppare, quando pigio F6 mi manda in esecuzione il programma, e questa è la condizione A.
    Ad un certo punto pigio la combinazione di tasti , <SHIFT><F11> e Netbeans compila il programma e genera il file .jar.
    Ora posso eseguire il .jar per esempio dal menù di start di Windows o di Linux. Questa è la condizione B.
    Ok, ora è chiaro perlomeno cosa intendevi. Ma di per sé no, non c'è nulla di facile/immediato per capire questo.

    L'unica cosa che mi verrebbe in mente è di verificare chi ha lanciato la JVM, ovvero il java.exe su Windows. Insomma, chi è il processo "parente" della JVM. Da Java 9 c'è la nuova Process API (vedi in java.lang) quindi qualcosa forse si può fare. Ma bisogna anche vedere come fare a riconoscere il processo di NetBeans.

    Tuttavia c'è una cosa che ancora non capisco: PERCHÉ devi fare una cosa del genere. Chiarisci il dubbio. Cosa ti dovrebbe cambiare da condizione A a B ??
  • Re: [Risolto] Verificare come sta venendo eseguito il programma

    andbin ha scritto:


    Tuttavia c'è una cosa che ancora non capisco: PERCHÉ devi fare una cosa del genere. Chiarisci il dubbio. Cosa ti dovrebbe cambiare da condizione A a B ??
    Per esempio il fatto che tutti i messaggi di logging generati con:
    System.out.println(TestoDelMessaggio);
    nella condizione A vengono visualizzati nella finestra di output di NetBeans, mentre nella condizione B non li vedo da nessuna parte, quindi devo scriverli in uno o più file di log.
    Il tutto nasce dal fatto che dopo alcune modifiche dei sorgenti, un programma, in ambiente Netbeans gira tranquillamente, mentre eseguito da .jar non parte proprio, senza dare alcun messaggio di errore, quindi voglio poter scrivere tutto quello che succede, in uno o più file, ma in modo automatico.
    Tra l'altro sto sperimentando 3 modi diversi di scrivere nei file di log, differenziando anche i file a seconda del tipo di messaggi da scrivere ... ma questo è un altro discorso.

    Quindi vorrei avere un modo "automatico" per ridirigere i messaggi di log nel posto giusto, senza usare variabili logiche da impostare a mano nel codice, come sto facendo ora.
    Probabilmente la mia ignoranza su Java è tale che non so che magari c'è un modo diverso e più semplice per fare questa cosa ...
    In questo caso qualsiasi dritta sarebbe gradita.

    Però tieni conto che sto utilizzando Java 7 (sempre per le solite ragioni per cui devo usare WindowsXP e Kubuntu 14.04 ) quindi non posso avvalermi delle nuove funzionalità, come quella che citavi da Java 9 ...
  • Re: [Risolto] Verificare come sta venendo eseguito il programma

    ZioCrick ha scritto:


    Per esempio il fatto che tutti i messaggi di logging generati con:
    System.out.println(TestoDelMessaggio);
    nella condizione A vengono visualizzati nella finestra di output di NetBeans, mentre nella condizione B non li vedo da nessuna parte
    Ma questo è "normale". Perlomeno su Windows se avvii un jar facendoci doppio-click (supponendo che l'associazione di .jar sia appropriata) di norma viene lanciato javaw.exe che è il "launcher" della JVM senza console.

    Ma se lanci in questo modo è perché tipicamente l'applicazione è "grafica" (es. Swing) e l'output su console generalmente è relativamente poco/niente importante.

    ZioCrick ha scritto:


    Il tutto nasce dal fatto che dopo alcune modifiche dei sorgenti, un programma, in ambiente Netbeans gira tranquillamente, mentre eseguito da .jar non parte proprio, senza dare alcun messaggio di errore, quindi voglio poter scrivere tutto quello che succede, in uno o più file, ma in modo automatico.
    Tra l'altro sto sperimentando 3 modi diversi di scrivere nei file di log, differenziando anche i file a seconda del tipo di messaggi da scrivere ... ma questo è un altro discorso.

    Quindi vorrei avere un modo "automatico" per ridirigere i messaggi di log nel posto giusto, senza usare variabili logiche da impostare a mano nel codice, come sto facendo ora.
    Probabilmente la mia ignoranza su Java è tale che non so che magari c'è un modo diverso e più semplice per fare questa cosa ...
    In questo caso qualsiasi dritta sarebbe gradita.
    Si usa una apposita libreria di logging (es. la ben nota log4j) configurata ad esempio in modo da buttare i log su standard-output E su file (sì, si può fare).

    Accrocchi del tipo: vado a vedere chi ha lanciato la JVM non hanno praticamente senso se le questioni sono quelle che hai descritto.

    ZioCrick ha scritto:


    Però tieni conto che sto utilizzando Java 7 (sempre per le solite ragioni per cui devo usare WindowsXP e Kubuntu 14.04 ) quindi non posso avvalermi delle nuove funzionalità, come quella che citavi da Java 9 ...
    Ah beh .. ok.
  • Re: [Risolto] Verificare come sta venendo eseguito il programma

    andbin ha scritto:


    Ma questo è "normale". Perlomeno su Windows se avvii un jar facendoci doppio-click (supponendo che l'associazione di .jar sia appropriata) di norma viene lanciato javaw.exe che è il "launcher" della JVM senza console.
    Si, questo mi era chiaro. L'ho citato solo per descrivere meglio la situazione.

    andbin ha scritto:


    Ma se lanci in questo modo è perché tipicamente l'applicazione è "grafica" (es. Swing) e l'output su console generalmente è relativamente poco/niente importante.
    Questo invece non mi è chiaro.
    Nel senso che, è vero che la mia applicazione è grafica (Swing), ma perché mandare i messaggi di logging/degubbing su console non è importante, se devo capire che percorsi fa il programma e verificare i valori che attribuisce a certe variabili, etc. ?

    andbin ha scritto:


    Si usa una apposita libreria di logging (es. la ben nota log4j) configurata ad esempio in modo da buttare i log su standard-output E su file (sì, si può fare).
    Ecco ... lo supponevo
    Infatti avevo trovato articoli ed esempi che parlavano di quella libreria, ma io sono "de coccio" ... nel senso di molto tradizionalista, per cui preferisco utilizzare solo quello che un certo linguaggio mi mette a disposizione di default, a meno che il mio obbiettivo sia raggiungibile solo scrivendo qualche decina di migliaia di righe di codice, e in alternativa esista una libreria che risolve comodamente il tutto.

    andbin ha scritto:


    Accrocchi del tipo: vado a vedere chi ha lanciato la JVM non hanno praticamente senso se le questioni sono quelle che hai descritto.
    Eh eh, tu sei una brava persona e sicuramente hai ragione, ma queste idee "bislacche" (come forse avevo già detto da qualche parte) mi arrivano dall'antica esperienza con VB6 dove questa verifica si faceva con una sola riga di codice.
    Si lo so che VB6 girava solo su Windows e quindi si poteva avvalere di caratteristiche proprietarie del modo Windows.

    Quindi in definitiva, mi devo rassegnare a studiare una soluzione, "fai da te" ...
  • Re: [Risolto] Verificare come sta venendo eseguito il programma

    ZioCrick ha scritto:


    Questo invece non mi è chiaro.
    Nel senso che, è vero che la mia applicazione è grafica (Swing), ma perché mandare i messaggi di logging/degubbing su console non è importante, se devo capire che percorsi fa il programma e verificare i valori che attribuisce a certe variabili, etc. ?
    Perché una cosa del genere (cioè andare a vedere dei log, anche su console, per capire cosa succede) la fa uno sviluppatore di norma ... non un utente "finale".
    Ma se è uno sviluppatore, sa bene che può aprire lui una console e da lì avviare la applicazione (java -jar blabla.jar) e a quel punto lo standard-output su console .. lo vede!

    Ma di norma le applicazioni "desktop" (grafiche) non fanno aprire una console del sistema né di norma si avviano da una console (salvo casi particolari, ovviamente).

    ZioCrick ha scritto:


    Infatti avevo trovato articoli ed esempi che parlavano di quella libreria, ma io sono "de coccio" ... nel senso di molto tradizionalista, per cui preferisco utilizzare solo quello che un certo linguaggio mi mette a disposizione di default, a meno che il mio obbiettivo sia raggiungibile solo scrivendo qualche decina di migliaia di righe di codice, e in alternativa esista una libreria che risolve comodamente il tutto.

    Quindi in definitiva, mi devo rassegnare a studiare una soluzione, "fai da te" ...
    Ma quale è il problema nell'usare log4j? Non è poi così difficile (serve pochissimo!) e c'è tanta documentazione in rete.
  • Re: [Risolto] Verificare come sta venendo eseguito il programma

    Caro andbin, a questo punto permettimi di esprimerti la mia più sincera ammirazione per la tua comprovata pazienza nel cercare di aiutare un "testone" come me.

    andbin ha scritto:


    Perché una cosa del genere (cioè andare a vedere dei log, anche su console, per capire cosa succede) la fa uno sviluppatore di norma ... non un utente "finale".
    Si, anche se io sono l'utente finale di me stesso

    andbin ha scritto:


    Ma se è uno sviluppatore, sa bene che può aprire lui una console e da lì avviare la applicazione (java -jar blabla.jar) e a quel punto lo standard-output su console .. lo vede!
    Già, il problema è che da console mi da un errore incomprensibile, e (in questo momento sto provando sul terminale dei comandi di Windows), non mi fa vedere i messaggi di log.
    Boh? Evidentemente mi mancano ancora troppi MegaByte di conoscenza sul mondo Java...

    andbin ha scritto:


    Ma quale è il problema nell'usare log4j? Non è poi così difficile (serve pochissimo!) e c'è tanta documentazione in rete.
    Non è la difficoltà che mi spaventa, ma la "compatibilità"!
    Sono letteralmente terrorizzato dai problemi di compatibilità a cui posso andare incontro usando librerie esterne, che magari vanno bene da una certa versione di java, oppure di sistema operativo, in poi, mentre io ne ho una più vecchia ...
    Negli ultimi anni purtroppo sto continuando a litigare con problemi di compatibilità, non solo tra applicativi/driver e sistema operativo, ma anche tra differenti Sistemi operativi, per cui meno variabili introduco nel mio ambiente di sviluppo meglio è.
    Almeno, questa è la logica che sto cercando di seguire.
    A questo punto ti sarai fatto l'idea che sono irrimediabilmente "pazzo" e irrecuperabile ... e ti posso capire
  • Re: [Risolto] Verificare come sta venendo eseguito il programma

    ZioCrick ha scritto:


    Già, il problema è che da console mi da un errore incomprensibile
    Cioè? Quale sarebbe?

    ZioCrick ha scritto:


    Non è la difficoltà che mi spaventa, ma la "compatibilità"!
    Sono letteralmente terrorizzato dai problemi di compatibilità a cui posso andare incontro usando librerie esterne, che magari vanno bene da una certa versione di java, oppure di sistema operativo, in poi, mentre io ne ho una più vecchia ...
    Capisco ....
    Ma comunque, log4j esiste in due rami, la 1.x (e in modo specifico la 1.2.x) e la 2.x.
    La 2.x è molto più moderna e non è completamente compatibile con la 1.x (ma questo importa molto solo se si intende passare da 1.x alla 2.x) richiede almeno Java 7 ma dalla versione 2.13 hanno alzato i requisiti a Java 8 (quindi non la potresti usare).
    La 1.x e in modo specifico l'ultimissima di quel ramo che è la 1.2.17 è ormai in End-Of-Life da molti anni ma è ancora usatissima in giro in molte applicazioni. E richiede almeno Java 1.4 (!)

    In alternativa puoi vedere la libreria logback, un'altra libreria di logging che è stata pensata come il successore di log4j. logback richiede almeno Java 6.

    Ti consiglio di affrontare un po' queste librerie di logging, perché sono valide, pratiche e si usano spesso, specialmente nelle webapp.
  • Re: [Risolto] Verificare come sta venendo eseguito il programma

    andbin ha scritto:


    Cioè? Quale sarebbe?
    Eh, però se inizio a parlarne qui andiamo Off Topic, per cui diciamo che se non riesco a risolvere con le mie forze, aprirò una nuova discussione.

    andbin ha scritto:


    Ti consiglio di affrontare un po' queste librerie di logging, perché sono valide, pratiche e si usano spesso, specialmente nelle webapp.
    Grazie ancora per le tue preziose indicazioni.
    Prometto che se non riuscirò a districarmi con il "fai da te" vedrò di provare qualcuna delle librerie che mi suggerisci.
  • Re: [Risolto] Verificare come sta venendo eseguito il programma

    Aggiornamento:
    alla fine dopo un po di tribolazioni, ho deciso di farmi un sistema di logging "fai-da-te" senza nemmeno usare il sistema standard a corredo di Java, perché non riuscivo a fargli rispettare il livello minimo di gravità dei messaggi da tracciare.

    Col mio sistema invece, mi sono fatto la mia scala di livelli con una bella enum.
    Inoltre ho risolto la mia necessità di riconoscere se il programma era eseguito da Netbeans o dal file .jar, basandomi sul disco su cui sta venendo eseguito, perché il mio ambiente di sviluppo è sul disco dati, mentre le applicazioni installate e quindi i .jar stanno sul disco di sistema.

    Quindi questa discussione la posso considerare risolta, ma non sono riuscito a risolvere il fatto che il .jar non parte ... quindi devo aprire un'altra discussione.
  • Re: [Risolto] Verificare come sta venendo eseguito il programma

    ZioCrick ha scritto:


    alla fine dopo un po di tribolazioni, ho deciso di farmi un sistema di logging "fai-da-te" senza nemmeno usare il sistema standard a corredo di Java, perché non riuscivo a fargli rispettare il livello minimo di gravità dei messaggi da tracciare.
    Se intendi la JUL (java.util.logging), bastava che chiedevi ....

    ZioCrick ha scritto:


    Col mio sistema invece, mi sono fatto la mia scala di livelli con una bella enum.
    Certo ma... questa è solo una piccola questione (i livelli, intendo). Un sistema di logging "standard" come log4j o altri ha svariate altre caratteristiche che "difficilmente" riusciresti a replicare davvero "bene" e in poco tempo.
    Il fatto ad esempio che ci sono tanti logger organizzabili in una "gerarchia" e ogni logger è facilmente configurabile tramite apposita configurazione.

    ZioCrick ha scritto:


    Inoltre ho risolto la mia necessità di riconoscere se il programma era eseguito da Netbeans o dal file .jar, basandomi sul disco su cui sta venendo eseguito
    Non voglio neanche sentire come ...

    Comunque se hai risolto .... ok!
Devi accedere o registrarti per scrivere nel forum
12 risposte