【问题标题】:Classpath limitation in LinuxLinux 中的类路径限制
【发布时间】:2012-06-29 21:38:51
【问题描述】:

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

【问题讨论】:

  • 呃,测试环境是用来验证在生产中做同样的事情之前一切正常。如果您不信任您的测试环境,为什么还要拥有一个?
  • 环境变量的长度有限制,命令行的长度也有限制。你可以达到那种长度(不知道任何操作系统的具体数字)。您可能想开始使用classpath wildcards
  • @JB:理论上测试和生产环境应该是相同的,理论上如果一个在测试中工作,它将在生产中工作。但是,理论与实践的区别在于,理论上,理论与实践没有区别。
  • 而不是在命令行中使用 9000 个字符的类路径,只需使用标准 java6 wildcard ("*") notation 来指示 jar 目录,例如 /path/to/foo.jar:/path/to/many/*:/path/to/classes(并引用该值以防止其被扩展由外壳)

标签: java linux


【解决方案1】:

不,没有限制。在 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 依赖插件生成依赖列表。

【讨论】:

  • 我不同意 Linux 没有限制。对于较旧的 (2.6.5) 内核,我们绝对已经达到了 128KB 的命令行长度硬性限制。
  • ...Linux 从未停止让我惊叹。好的,那么更正一下:真正的操作系统不应该给你任何问题。 :-)(我在上面做了必要的更改,感谢 QuantumMechanic)
【解决方案2】:

请参阅this stackoverflow answer 了解最大 linux 命令行长度。

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

不过,任何一个参数的最大大小要小得多,而且 9000 个字符可能会有问题。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-02
      • 2010-10-09
      • 2015-04-06
      • 1970-01-01
      • 2014-12-28
      • 2016-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多