2009-02-18 3 views
27

Mi sono sempre chiesto perché devo impostare manualmente la variabile di ambiente JAVA_HOME dopo aver installato Java SDK.Perché il programma di installazione dell'SDK Java non ha impostato JAVA_HOME?

JAVA_HOME = C: \ Program Files \ Java \ jdk1.6.0_12

Visual Studio almeno fornisce un file batch per impostare questo tipo di variabili d'ambiente:

chiamata " c: \ Programmi \ Microsoft Visual Studio 9.0 \ VC \ vcvarsall.bat"

fa Java hanno qualcosa di simile? Sto cercando di creare uno script di compilazione che dovrebbe funzionare semplicemente dopo aver installato l'SDK Java. Non voglio che la gente faccia casino con le variabili di ambiente sul proprio PC.

+1

Perché Java non ne ha bisogno. – EJP

risposta

33

È possibile installare tutte le versioni di Java che si desiderano.

sarebbe pericoloso per l'installazione per modificare una variabile locale ambiente come JAVA_HOME, poiché potrebbe riferimento un'installazione Java esistente.

Questo non ha nulla a che fare con un presunto "problema dipendente dalla piattaforma". ;)

Poiché gli script potrebbero dipendere dal JAVA_HOME per avviarsi, di nuovo, questo sarebbe disastroso per una nuova installazione Java da modificare JAVA_HOME: tutti quegli script dovrebbero essere lanciati all'improvviso con una nuova JVM potenzialmente incompatibile.

Inoltre, impostando $JAVA_HOME/bin o %JAVA_HOME%/bin nel vostro percorso, è possibile modificare dinamicamente JAVA_HOME a qualsiasi versione di Java che si desidera utilizzare, senza dover molto con la variabile PATH.


Michael Borgwardt ha fatto nei commenti alla domanda del follow interessante

Eppure, questo non spiega il motivo per cui il programma di installazione non imposta JAVA_HOME quando non è impostata in precedenza a tutti.

La risposta è semplice:

La configurazione non può sapere se uno script dipende già in JAVA_HOME o no.

Significato: alcuni script potrebbero verificare il valore JAVA_HOME e, se non impostato, fare riferimento a un'altra JVM installata altrove (e non dimenticare che con "installa", si può solo fare riferimento a "copiata": un JDK/JRE è non sempre installato da una configurazione)

Se si imposta JAVA_HOME, ciò può interrompere il comportamento predefinito di alcuni dei propri script.

Non volendo disturbare script ipotetici che dipendono da un ENV var non essere impostato suono inutilmente paranoici a me - Se uno script fa questo, allora chiaramente vuole utilizzare una JVM diversa quando si è installato - alcun motivo per evitarlo

Mmm ... Dolce. Per la gestione di enormi problemi di distribuzione su base giornaliera (per applicazioni interne nel mio negozio), posso assicurarvi: è molto "paranoico" ragionevole da trattare con lo trattamento.
Quando si distribuisce a un (molto) grande insieme di utenti, non si vuole fare qualsiasi ipotesi circa la loro piattaforma e le configurazioni. "chiaramente WANTS" è un'ipotesi che non oserei fare (o reindirizzare il mio telefono al tuo;) e gestirai le chiamate furibonde).

Ad esempio, abbiamo molti script che vengono lanciati con una JVM 1.4.2 da sun (JAVA_HOME non impostato su piattaforma di sviluppo, percorso predefinito impostato direttamente nello script) o con 1.4.2 da JRockit (JAVA_HOME set, come è l'obiettivo previsto per le piattaforme di integrazione, pre-produzione e produzione).

Ma installiamo regolarmente il nuovo JDK1.6.x poiché lo usiamo per lanciare eclipse.

Supponiamo che quegli script vogliano il loro set JAVA_HOME ... e che non funzioni più.

... Al che Robert Grant rende questo critico on-the-spot:

che stai descrivendo script che richiedono una versione specifica, ma ancora guardano JAVA_HOME globale. Questo è solo uno script mal concepito.

Mentre che può o non può essere vero, che illustra anche proprio il mio punto:
"non si vuole fare alcuna assunzione": nessuna ipotesi sulla loro piattaforma/impostazioni, e nessuna ipotesi sulla loro "migliori pratiche".
Il primo può sembrare paranoico, il secondo è semplice buonsenso: pensare che il tuo prodotto (qui una configurazione JDK) non romperà nulla sull'ambiente dell'utente perché l'utente ha "correttamente" pensato i suoi script ... sarebbe folle.


GvS suggerisce:

o potrebbe semplicemente avere l'opzione di farlo, disabilitato per default

Ciò significherebbe un'altra opzione per includere nelle schermate di configurazione, l'opzione che dovrebbe essere attentamente rivisto dall'utente e che può avere conseguenze indesiderate, anche quando l'utente lo seleziona pensando di sapere cosa sta facendo ...

Semplicemente non ne vale la pena.

+1

Tuttavia, questo non spiega perché il programma di installazione non imposta JAVA_HOME quando non è stato precedentemente impostato. –

+0

Oppure potrebbe semplicemente avere l'opzione per farlo, disabilitato di default. – GvS

+0

Non voler disturbare gli script ipotetici che dipendono da un env var che non viene impostato mi sembra inutilmente paranoico. Se uno script lo fa, è chiaro che WANTS deve usare una JVM diversa quando ne viene installato uno - nessun motivo per evitarlo. –

-1

Immagino che java non voglia fare nulla che dipende dalla piattaforma. In Windows, i percorsi di classe sono impostati in modo diverso da LINUX/UNIX.

+2

Bene su Windows che offre di installare di default in "C: \ Porgram Files". Sono abbastanza sicuro che non lo faccia in * nix. Il punto è che è già dipendente dalla piattaforma. –

0

Non sono sicuro del perché questo è, perché gli installatori risolvono chiaramente i problemi dipendenti dalla piattaforma (che è naturalmente l'intero punto di una JVM). Sei sicuro di non mescolare JRE con JSDK?

Forse c'è un modo per il tuo programma di cercare dove è installato java (che sarebbe uno script credo), quindi impostare JAVA_HOME ed eventualmente aggiungerlo al percorso.

IBM sembra stia facendo questo trucco già: http://www-01.ibm.com/support/docview.wss?rs=180&uid=swg21199220

Altri post interessante suggerendo la differenza tra JRE e installazioni JSDK: http://confluence.atlassian.com/display/CONF26/Set+JAVA_HOME+variable+in+Windows

Spero che questo aiuti.

+0

Il collegamento IBM è morto – Antimony

10

Non penso che JAVA_HOME sia una convenzione inventata o supportata da Sun.

Probabilmente ricordano il fiasco che era la variabile d'ambiente CLASSPATH ** fin troppo bene e preferiscono stare alla larga dalle variabili di ambiente.

** Questo è stato consigliato come metodo principale per impostare il percorso di classe JVM nei precedenti SDK e letteratura Java e ha comportato l'utente e varie applicazioni che hanno interferito con la variabile di ambiente, sovrascrivendo le modifiche reciproche e in base a contenuti contraddittori.

+2

Buon riferimento storico. +1 – VonC

3

Il meccanismo vcvarsall.bat è un modo conveniente per Visual C++ di fornire una console con le variabili corrette senza interferire con le variabili di ambiente dell'utente/sistema. Tuttavia, presuppone che Installshield sia l'unico modo per ottenere il codice sul sistema. Il JDK dovrebbe tollerare di essere tagliato e arrostito da una posizione all'altra.

Se siete alla ricerca di java.exe, il programma di installazione Installshield dovrebbe metterlo in % windir% \ system32, quindi è disponibile sul sentiero.

è possibile ottenere alcune indicazioni circa la posizione di app installate interrogando il Registro di sistema:

C:>REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\1.6" /v JavaHome 

! REG.EXE VERSION 3.0 

HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\1.6 
    JavaHome REG_SZ C:\dev\Java\jdk1.6.0_05 

Tuttavia, non si può contare su questo assolutamente perché questo rende alcune ipotesi circa fornitore, la versione e il meccanismo di installazione.

0

Questo può aiutare qualcun altro che finisce qui come me. Voglio solo usare Java come strumento, non adottarlo come uno stile di vita, quindi ho solo bisogno di sapere come JAVA_HOME è stato impostato e perché non era corretto. La risposta è stata che l'installazione WinAnt imposta JAVA_HOME (insieme a ANT_HOME), ma solo in base al Java attualmente installato. Quindi, se è necessario modificare la versione di Java e si utilizza Ant, il modo corretto per farlo è disinstallare WinAnt, disinstallare Java, installare il nuovo Java e quindi reinstallare WinAnt.

Problemi correlati