2012-06-28 3 views
5

Wir führen ein eigenständiges Java-Programm aus Shell-Skript aus, mit einem Comman-Skript, um Klassenpfad, Pfad usw. zu erwähnen. In diesem allgemeinen Skript haben wir jetzt mehrere Klassenpfade hinzugefügt und die Anzahl der Zeichen beträgt mehr als 9000. Es funktioniert gut in der Testumgebung. Wird es in der Produktion zu Problemen kommen? Gibt es eine Einschränkung in Linux, um Klassenpfad zu setzen? Was ist das maximale Zeichen für die Kommandozeileneingänge?Klassenpfadbeschränkung in Linux

+1

Err, der Test env ist da, um zu bestätigen, dass alles in Ordnung ist, bevor man dasselbe in der Produktion macht. Wenn Sie Ihrer Testumgebung nicht vertrauen, warum haben Sie eine? –

+2

Es gibt eine Begrenzung für die Dauer von Umgebungsvariablen, und es gibt eine Begrenzung für die Länge der Befehlszeile. Du * könntest * beide mit dieser Länge erreichen (kenne die konkreten Zahlen für kein OS auswendig). Möglicherweise möchten Sie [Klassenpfad-Platzhalter] verwenden (http://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html). –

+1

@JB: In der Theorie sollten die Test- und Produktionsumgebungen die gleichen sein und in der Theorie, wenn der Test funktioniert, wird es in der Produktion funktionieren. Der Unterschied zwischen Theorie und Praxis besteht jedoch darin, dass theoretisch kein Unterschied zwischen Theorie und Praxis besteht. –

Antwort

0

Siehe this stackoverflow answer über die maximale Länge der Linux-Befehlszeilen.

Die maximale Länge der Befehlszeile beträgt ungefähr zwischen 128 KB und 2 MB.

Die maximale Größe eines Arguments ist jedoch erheblich kleiner und 9000 Zeichen könnten problematisch sein.

0

Wenn Sie in Ihrem Java Programm verwenden einige Klassen aus einer jar-Datei, die in der classpath Variable angegeben wird, die JVM lädt nicht die Klasse, bis die laufende Programm wird ausdrücklich diese Klasse müssen (oder wenn Sie Laden Sie diese Klasse explizit aus Ihrem Code - die gleiche Idee). Das einzige Problem, das auftreten kann, wenn Sie eine sehr lange classpath haben, ist die Zeit classpath Überprüfung vor der JVM finden Sie die richtige jar Datei. Aber das sollte kein Problem sein. Wenn sich Ihr Programm in Tests gut verhält, sollten Sie sich darüber keine Sorgen machen.

4

Nein, es gibt keine Beschränkung. In Windows gibt es (8191 Zeichen), aber nicht unter Linux. Wir arbeiten mit dem Konzept der Klassenpfad-Dateien. Diese Datei listet alle Abhängigkeiten für die Anwendung, zB:

... 
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 
... 

und dann wandeln wir diese in nutzbare Classpath und die Anwendung ausführen wie folgt:

#!/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] 

Wir haben nie auf Probleme stoßen und diese Classpath Einträge werden ziemlich groß.

EDIT: Als eine Randnotiz können Sie das Maven-Abhängigkeits-Plugin verwenden, um eine Liste von Abhängigkeiten zu generieren.

+3

Ich stimme nicht zu, es gibt keine Grenze in Linux. Mit einem älteren (2.6.5) Kernel haben wir absolut eine harte Grenze von 128 KB für die Befehlszeilenlänge erreicht. – QuantumMechanic

+0

... Linux erstaunt mich immer wieder. Ok, Korrektur dann: echte Betriebssysteme sollten dir keine Probleme bereiten. :-) (Ich habe oben die erforderlichen Änderungen vorgenommen, danke QuantumMechanic) –