【问题标题】:How many Classpath can be specified on Java command line?在 Java 命令行上可以指定多少个 Classpath?
【发布时间】:2017-01-20 00:58:08
【问题描述】:

我必须运行一个带有大量类路径的 java 任务(1000 个,如果连接起来总共有 150k 个字符)。

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

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

错误码是7

我尝试使用“export CLASSPATH=CLASSPATH:.....”放置类路径,因此我不应该通过 -cp java 参数指定它们,但它返回了同样的错误。

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

【问题讨论】:

  • 为什么?为什么不运行一个 JAR 文件,在其 Manifest Class-path 条目中将它们全部列出?
  • 这将是一个用于进行一些预构建代码分析的类,因此它需要所有的类路径,并且它本身不需要是一个 jar。我可以生成jar,它会解决问题吗?

标签: java java-8 jvm classpath


【解决方案1】:
  • 您可以使用classpath wildcards。特别是如果您的许多 jars/class 文件位于同一目录中,这将很有帮助。

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

  • javac 也从文件输入中获取参数。您可以将所有参数添加到此文件并将此文件参数传递给命令。请参阅this 了解更多信息。

【讨论】:

  • 不幸的是,它们都在不同的目录中(使用内部缓存库的构建系统),并且不需要使用 javac,因为我只需要执行一个作为预构建任务一部分的类。
【解决方案2】:

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

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

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

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

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

使用不同的类加载器还有一个额外的优势,您可以在完成后close them

【讨论】:

    【解决方案3】:

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

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

    如果你想设置很长的类路径,你可能需要一个 JAR-Manifest 技巧。详情请见this question

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-11
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      相关资源
      最近更新 更多