2012-06-28 39 views
5

我们正在执行shell脚本的独立Java程序,它有一个提供类路径,路径等的comman脚本。在这个通用脚本中,我们现在添加了几个类路径,字符数大于9000。 它在测试环境中工作正常。它会在生产中引起任何问题吗?任何限制是在linux中设置类路径?什么是命令行输入的最大字符数...Linux中的类路径限制

+1

错误,测试环境在那里验证一切工作正常,然后在生产中做同样的事情。如果你不相信你的测试环境,为什么你会有一个? –

+2

环境变量的可用时间有限制,并且命令行可以有多长时间有限制。你*可以*达到那种长度的那两种(不知道炉旁任何操作系统的具体数字)。您可能想要开始使用[classpath wildcards](http://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html)。 –

+1

@JB:理论上,测试和生产环境应该是相同的,并且在理论上如果测试工作在测试中,它将在生产中工作。然而,理论与实践的区别在理论上,理论与实践并无区别。 –

回答

0

请参阅this stackoverflow answer关于最大linux命令行长度。

最大命令行长度大致在128KB到2MB之间。

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

0

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

4

不,没有限制。在Windows中有(8191个字符),但不在Linux下。我们使用classpath-files的概念。这些文件列出了所有的依赖关系的应用,例如:

... 
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 [email protected] 

我们从来没有遇到的问题和这些类路径条目变得非常巨大。

编辑:作为一个方面说明,你可以使用maven依赖插件来生成依赖关系列表。

+3

我不同意Linux没有限制。对于较老的(2.6.5)内核,我们绝对已经达到了命令行长度的128KB的硬限制。 – QuantumMechanic

+0

... Linux永远不会让我惊叹。好,然后修正:真正的操作系统不应该给你任何问题。 :-)(我在上面做了必要的修改,感谢QuantumMechanic) –