我必须运行一个java任务,其中包含大量的classpath(1000,如果连接,总共150k个字符)。
问题是当我尝试执行这个类时java返回错误:
/jdk/JAVA8/bin/java: Argument list too long
错误代码为7
我尝试使用" 导出CLASSPATH = CLASSPATH:..... "所以我不应该通过-cp java参数指定它们,但是它返回了相同的错误。
我很确定问题围绕类路径的限制,因为如果我删除了一些类路径,错误就会消失(但是我会在执行中遇到逻辑错误,因为我需要所有类路径)
答案 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。