2012-06-28 10 views
5

Stiamo eseguendo il programma Java autonomo dallo script di shell, con uno script comman per menzionare classpath, path, ecc. In questo script comune, sono stati aggiunti diversi classpath e il numero di caratteri è più di 9000. Sta funzionando bene nel test env. Causerà qualche problema in produzione? C'è qualche limite in Linux per impostare classpath? Qual è il max char per gli input da riga di comando ...Limitazione del percorso di classe in Linux

+1

Err, il test env è lì per verificare che tutto funzioni correttamente prima di fare la stessa cosa in produzione. Se non ti fidi del tuo ambiente di test, perché ne hai uno? –

+2

C'è una limitazione sulla durata delle variabili di ambiente e c'è una limitazione sulla durata della riga di comando. Potresti * raggiungere entrambi quelli con quel tipo di lunghezza (non conosci i numeri concreti per ogni sistema operativo per focolare). Si potrebbe voler iniziare a utilizzare [caratteri jolly classpath] (http://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html). –

+1

@JB: In teoria, gli ambienti di test e di produzione dovrebbero essere gli stessi e, in teoria, se uno funziona in prova, funzionerà in produzione. Tuttavia, la differenza tra teoria e pratica è che in teoria non c'è differenza tra teoria e pratica. –

risposta

0

Vedere this stackoverflow answer sulla lunghezza massima della riga di comando di Linux.

La lunghezza massima della riga di comando sarà all'incirca tra 128 KB e 2 MB.

La dimensione massima di qualsiasi argomento è considerevolmente più piccola, tuttavia, e 9000 caratteri potrebbero essere problematici.

0

Quando si utilizza nel programma Java alcune classi da un file jar che è specificato nella variabile classpath, il JVM sarà non caricare ramo fino a quando il vostro programma in esecuzione avrà esplicitamente bisogno di quella classe (o se si carica quella classe esplicitamente dal tuo codice - la stessa idea). L'unico problema che può apparire quando hai un tempo molto lungo classpath, è il tempo necessario per il controllo classpath prima che lo JVM trovi il file giusto jar. Ma questo non dovrebbe essere un problema. Se il tuo programma si comporta bene nei test, non dovresti preoccuparti di questo.

4

No, non ci sono limiti. In Windows c'è (8191 caratteri), ma non sotto Linux. Lavoriamo con il concetto di file classpath. Questi elenchi di file tutte le dipendenze per l'applicazione, ad esempio:

... 
libs/org/easymock/easymock/2.2/easymock-2.2.jar 
libs/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar 
libs/org/hibernate/hibernate-envers/4.1.0.Final/hibernate-envers-4.1.0.Final.jar 
libs/com/google/inject/guice/3.0/guice-3.0.jar 
... 

e poi convertirlo in classpath utilizzabile ed eseguire l'applicazione come segue:

#!/bin/bash 

CLASSPATH_FILE=`ls -r1 ${APP-HOME}/classpaths/myapp*.classpath | head -n1` 
CLASSPATH=$(cat $CLASSPATH_FILE | sed 's_^libs_ ${APP-HOME}/libs_' | tr -d '\n' | tr -d '\r' | sed 's_.jar/libs/_.jar:/libs/_g' | sed 's_.pom/libs/_.pom:/libs/_g') 

java -d64 -cp $CLASSPATH com.blah.main.Main [email protected] 

Non abbiamo mai incorrere in problemi e questi classpath le voci diventano piuttosto enormi.

MODIFICA: come nota a margine, è possibile utilizzare il plug-in Maven dependency per generare un elenco di dipendenze.

+3

Non sono d'accordo che non ci siano limiti in Linux. Con un kernel precedente (2.6.5) abbiamo assolutamente raggiunto un limite rigido di 128 KB per la lunghezza della riga di comando. – QuantumMechanic

+0

... Linux non smette mai di stupirmi. OK, la correzione allora: i sistemi operativi reali non dovrebbero darti alcun problema. :-) (Ho apportato le modifiche richieste sopra, grazie a QuantumMechanic) –

Problemi correlati