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
Antwort
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.
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.
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.
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
... Linux erstaunt mich immer wieder. Ok, Korrektur dann: echte Betriebssysteme sollten dir keine Probleme bereiten. :-) (Ich habe oben die erforderlichen Änderungen vorgenommen, danke QuantumMechanic) –
- 1. in Linux
- 2. Pfadnamensuche in Linux?
- 3. Linux - Linebreak in IPython
- 4. Fließkomma in Assembly Linux
- 5. CreateRemoteThread in Linux
- 6. Teil Verzeichnisliste in Linux
- 7. Druckausgabe in Zitaten linux
- 8. asynchrones memcpy in Linux?
- 9. Curl-Befehl in Linux
- 10. fehlgeschlagen bazel in Linux
- 11. stabile Art in Linux
- 12. Capicom Entschlüsselung in Linux
- 13. serielle Kommunikationsanomalie in Linux?
- 14. Maillog Datei in Linux
- 15. Anruf sed in Linux
- 16. Rekursive Massenbearbeitung in Linux
- 17. Interprozesskommunikation in Linux-Design
- 18. Speicherzuweisung in Linux
- 19. Assembly in Linux
- 20. _splitpath in Linux
- 21. das System in Linux
- 22. iPhone sdk in Linux
- 23. Verzeichnis JAVA_HOME in Linux
- 24. Gleichzeitige Systemaufrufe in Linux
- 25. /tmp Verwendung in Linux
- 26. Serverstandort in Linux-Maschine?
- 27. atomic_t in Linux
- 28. C# in Linux-Umgebung
- 29. Mysql ++ in Linux einrichten
- 30. libcrypto ++ in Linux
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? –
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). –
@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. –