可以在Java命令行上指定多少个Classpath?

时间:2017-01-20 00:58:08

标签: java java-8 jvm classpath

我必须运行一个java任务,其中包含大量的classpath(1000,如果连接,总共150k个字符)。

问题是当我尝试执行这个类时java返回错误:

/jdk/JAVA8/bin/java: Argument list too long 

错误代码为7

我尝试使用" 导出CLASSPATH = CLASSPATH:..... "所以我不应该通过-cp java参数指定它们,但是它返回了相同的错误。

我很确定问题围绕类路径的限制,因为如果我删除了一些类路径,错误就会消失(但是我会在执行中遇到逻辑错误,因为我需要所有类路径)

3 个答案:

答案 0 :(得分:1)

  • 您可以使用classpath wildcards。特别是如果你的许多罐子/类文件在同一目录中,这将有很大帮助。

  • 它可能是环境变量大小限制或命令行大小限制,而不是javac类路径arg限制。

  • javac也从文件输入中获取参数。您可以将所有参数添加到此文件,并将此文件参数传递给command。有关详情,请参阅this

答案 1 :(得分:1)

您没有遇到特定于Java的限制,而是系统相关限制。最好的说明是,设置CLASSPATH变量的尝试也失败了,但是在shell中通过export name=value设置环境变量与Java无关。

正如其他人所说的那样,你可以尝试在同一目录中使用通配符作为jar文件,但是你必须关心Java是否进行扩展而不是shell,因为在后一种情况下,它会再次产生太长的时间命令行。因此,您必须转义*字符以确保它不会被shell处理。

javac支持从@filename指定的外部文件中读取命令行参数,但不幸的是,java启动程序不支持此选项。

另一种方法是创建指向jar文件的符号链接,具有较短的路径并指定它们。您甚至可以通过创建一个充满符号链接的目录并将that/directory/*指定为类路径来组合这些方法。

但是要求中似乎存在逻辑错误。在评论中,您提到“代码分析”,分析工具不应要求在自己的应用程序类路径中分析代码。如果要读取和解析它们,可以通过普通I / O访问类文件。如果你想加载它们,例如要使用内置的Reflection,您可以创建指向位置的新ClassLoader实例。因此,该工具不依赖于应用程序类路径,并且可以从配置文件中读取位置,例如。

使用不同的类加载器还有一个额外的好处,就是当你完成后可以close them

答案 2 :(得分:1)

JVM不限制类路径长度。但是,命令行长度和环境变量大小存在硬操作系统限制。

在Linux上检查getconf ARG_MAX以查看限制 在较旧的内核版本上,它只有 128KB 。在较新的内核上,它大约是 2MB

如果你想设置很长的类路径,你可能需要一个JAR-Manifest技巧。有关详细信息,请参阅this question