在创建可执行 jar 时指定 JVM 参数(而不是在执行 jar 时)

Specify JVM parameters whilst creating an executable jar (not when executing the jar)

我正在构建(未执行!)一个包含 81K 类的可执行 jar。构建这么大的 jar 文件在构建过程中逐渐变慢,直到抛出 java.lang.OutofMemoryException

那么 - 那么如何指定 -Xmx1024m 来为构建 jar 时使用的 jvm 提供一些额外的内存空间?

注意

jar

命令不接受任何 -D 命令行参数。

现在我尝试设置

export JVM_OPTS=-Xmx1024m

可能 有所帮助 - 因为 jar 命令确实有效。但我没有明确的方法知道它是否真的得到应用。

在启动 JVM 时,内存量必须由进程确定:

java -Xmx1024m ... -jar my.jar ...

参见:

你不能。

构建阶段不同于 运行 阶段。在构建时,您编译 java 源代码,并将它们与一些资源一起 assemble 在一个 jar 中。这里不涉及 JVM 选项。

然后在运行时,您可以通过java命令将选项传递给JVM。您不能在构建时包含 JVM 选项,因为 :

  • 你不知道 jar 将在哪个 JVM 上执行而不是在什么系统上
  • 您不知道 JVM 是否接受特殊选项(特别是 -X 选项)
  • 您无法知道可用资源

出于这些原因,在构建时指定 运行 时间选项毫无意义,这就是不可能的原因。

设置 JVM_OPTS 是否解决了这个问题

export JVM_OPTS="-Xmx2048m"
jar -cvfm myjar.jar /tmp/manifest.txt classdir/

其他答案 - 以及结束投票 - 得出结论,该 OP 是关于 通过 java -jar myjar.jar 执行 jar 文件。

问题是 - 如 OP 中所述 - 有数以万计的 类 要包含 - 并且它压倒了默认的 JVM 设置 - 导致了 OOME。我可以看到 jar 命令在它放弃之前在接近尾声时变慢。添加 JVM_OPTS 后,构建 jar 不再有问题。