[Risolto] User.dir sbagliata in programma Java lanciato da un'altro

di il
5 risposte

[Risolto] User.dir sbagliata in programma Java lanciato da un'altro

Buongiorno a tutti,

mi ritrovo in una situazione che non riesco a capire e quindi a risolvere.

Contesto: Windows 8.1 con Java 8

Situazione:
Programma C:\Prog\A\a.jar che manda in esecuzione C:\Prog\B\b.jar
nel modo seguente:

String mioExec = "java -jar C:\Prog\B\b.jar"
String[] fullPath = mioExec.split(" ");
Runtime.getRuntime().exec(fullPath)
Risultato:
Siccome nel programma b ho bisogno di accedere a delle sottocartelle di \B
uso la:

System.getProperty("user.dir")
per ottenere il percorso C:\Prog\B\
Invece succede che mi restituisce la cartella C:\Prog\A\ del programma a che lancia il b.

Qualche anima pia riesce a darmi qualche dritta su come ovviare a questo inconveniente?

5 Risposte

  • Re: [Risolto] User.dir sbagliata in programma Java lanciato da un'altro

    ZioCrick ha scritto:


    Programma C:\Prog\A\a.jar che manda in esecuzione C:\Prog\B\b.jar
    nel modo seguente:

    Invece succede che mi restituisce la cartella C:\Prog\A\ del programma a che lancia il b.
    La system property "user.dir" indica la current working directory, ovvero la directory che è "corrente" (in quel momento) quando avvii una applicazione Java.

    Se hai fatto:

    cd C:\Prog\A
    poi
    java -jar a.jar

    Beh .. la directory corrente è proprio C:\Prog\A !!
    E quando con Runtime avvii un altro processo, di norma esso EREDITA la stessa directory corrente.
    É così che funziona ... non c'è nulla di strano o anormale.

    Se vuoi che al lancio di B la directory corrente sia differente .... allora GUARDA bene i metodi exec di Runtime. Ci sono alcune versioni che ricevono un File dir



    P.S. esiste anche ProcessBuilder (Java 5+) che è pure più flessibile rispetto agli exec() di Runtime.
  • Re: [Risolto] User.dir sbagliata in programma Java lanciato da un'altro

    andbin ha scritto:


    Se vuoi che al lancio di B la directory corrente sia differente .... allora GUARDA bene i metodi exec di Runtime. Ci sono alcune versioni che ricevono un File dir
    Carissimo andbin, anche sta volta sei stato il mio angelo custode!
    Ho usato una versione di exec con il parametro File dir e funziona alla grande!

    andbin ha scritto:


    P.S. esiste anche ProcessBuilder (Java 5+) che è pure più flessibile rispetto agli exec() di Runtime.
    Grazie mille anche per questa indicazione.
    Approfondirò sicuramente.
  • Re: [Risolto] User.dir sbagliata in programma Java lanciato da un'altro

    Scusate se riprendo questo post ...
    ma è solo per ringraziare ancora una volta il mitico @andbin per questa indicazione:

    andbin ha scritto:


    P.S. esiste anche ProcessBuilder (Java 5+) che è pure più flessibile rispetto agli exec() di Runtime.
    L'ho sperimentato e va alla grande, anche perché mi permette di lanciare da programma, lo shutdown e il restart del computer, cosa che con non riuscivo a fare con Runtime.getRuntime().exec
    Da quel che ho letto sul web, mi sembra di aver capito che dipenda dal fatto che il ProcessBuilder crea sempre un processo con i privilegi da amministratore.
  • Re: [Risolto] User.dir sbagliata in programma Java lanciato da un'altro

    ZioCrick" post_id="8658223" time="1597860269 ha scritto:


    Da quel che ho letto sul web, mi sembra di aver capito che dipenda dal fatto che il ProcessBuilder crea sempre un processo con i privilegi da amministratore.
    No, non dà alcun privilegio amministrativo o comunque maggiore.

    Semmai c'è una cosa che ProcessBuilder può fare (che non si può fare con gli exec): ha il inheritIO() che permette al processo lanciato di "ereditare" gli stream standard e quindi ad esempio usare la stessa console del processo parente.


    P.S. cosa avevi provato con exec per lo shutdown?
  • Re: [Risolto] User.dir sbagliata in programma Java lanciato da un'altro

    andbin ha scritto:


    No, non dà alcun privilegio amministrativo o comunque maggiore.
    Allora siccome nel frattempo stavo provando a lanciare il Task manager di windows e non ci riuscivo (Errore 740), ho appena scoperto che basta usare il comando
    cmd.exe /C "C:\Windows\System32\taskmgr.exe"

    andbin ha scritto:


    Semmai c'è una cosa che ProcessBuilder può fare (che non si può fare con gli exec): ha il inheritIO() che permette al processo lanciato di "ereditare" gli stream standard e quindi ad esempio usare la stessa console del processo parente.
    Questo per me è ancora ... turco...

    andbin ha scritto:


    P.S. cosa avevi provato con exec per lo shutdown?
    In realtà avevo provato il reboot con shutdown /r
    Lo shutdown non mi funzionava perché ho scoperto dopo che serviva il /s.
    Comunque, mi sa che ho preso un abbaglio, perché ho appena provato anche con la exec e funziona.
    Probabilmente usavo il comando shutdown /r senza passargli il path C:\Windows\System32\ cosa che con il ProcessBuilder non serve.
    Sempre che non stia facendo un po di confusione.
Devi accedere o registrarti per scrivere nel forum
5 risposte