Java Linux中的类路径限制

Java Linux中的类路径限制,java,linux,Java,Linux,我们正在从shell脚本执行独立的java程序,有一个comman脚本提到类路径、路径等。在这个通用脚本中,我们现在添加了几个类路径,字符数超过9000。 它在测试环境中运行良好。它会在生产中引起任何问题吗?在linux中设置类路径有什么限制吗?命令行输入的最大字符数是多少…请参阅关于最大linux命令行长度 最大命令行长度大约在128KB和2MB之间 但是,任何一个参数的最大大小都要小得多,9000个字符可能会有问题。当您在Java程序中使用jar文件中的一些类时,这些类是在classpath

我们正在从shell脚本执行独立的java程序,有一个comman脚本提到类路径、路径等。在这个通用脚本中,我们现在添加了几个类路径,字符数超过9000。 它在测试环境中运行良好。它会在生产中引起任何问题吗?在linux中设置类路径有什么限制吗?命令行输入的最大字符数是多少…

请参阅关于最大linux命令行长度

最大命令行长度大约在128KB和2MB之间


但是,任何一个参数的最大大小都要小得多,9000个字符可能会有问题。

当您在Java程序中使用
jar
文件中的一些类时,这些类是在
classpath
变量中指定的,JVM不会加载该类,直到您运行的程序明确需要该类(或者,如果您从代码中显式加载该类,则与此想法相同)。当您有一个很长的
类路径时,唯一可能出现的问题是JVM在找到正确的
jar
文件之前检查
类路径所需的时间。但这应该不是问题。如果您的程序在测试中表现良好,您不必担心这一点。

不,没有限制。在Windows中有(8191个字符),但不是在Linux下。我们使用类路径文件的概念。这些文件列出了应用程序的所有依赖项,例如:

...
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
...
然后我们将其转换为可用的类路径,并按如下方式运行应用程序:

#!/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 $@
我们从未遇到过问题,这些类路径条目变得非常庞大


编辑:作为旁注,您可以使用maven dependency插件生成依赖项列表。

Err,在生产中执行相同操作之前,测试环境用于验证所有操作是否正常。如果您不信任您的测试环境,为什么您会有一个?环境变量的长度有限制,并且没有限制命令行的长度限制。您可以同时访问这两种长度的命令行(不知道任何操作系统的具体数字)。您可能想开始使用。@JB:理论上,测试环境和生产环境应该是相同的,理论上,如果在测试环境中工作,它将在生产环境中工作。但是,理论和实践的区别在于,理论和实践没有区别。而不是命令-l上的9000字符类路径例如,只需使用标准java6来表示jar的目录,例如,
/path/to/foo.jar:/path/to/many/*:/path/to/classes
(并引用该值以保护它不被shell扩展)我不同意Linux中没有限制内核我们的命令行长度绝对达到了128KB的严格限制……Linux从未停止让我惊讶。好吧,那么更正一下:真正的操作系统应该不会给你带来任何问题。:-(我做了上面所要求的更改,感谢QuantumMechanical)