0

我正在尝试围绕可运行的 .jar 文件创建一个包装器,以便为 JVM 传递参数。我的包装器的相关代码是:

public static void main(String[] args) throws IOException
      String[] cmdArray = {"java",
        System.getProperty("os.arch").contains("64") ? "-d64" : "",
        "-XX:+AggressiveHeap",       
        "-jar",
        "/lib/A.jar"  //replace with jar name 
            };
      Runtime.getRuntime().exec(cmdArray);
}

A.jar 文件是我的 Wrapper 项目中的一个引用库(在构建路径和类路径中添加)。例子:

 Wrap
   >src
       >org
           >Wrapper.java
   >lib
       >A.jar

当我从 Wrapper 项目(我们称之为 B.jar)创建第二个 jar 文件时,它的内容是

lib
   >A.jar
org
   >eclipse
          >jdt
             >... (i.e., all the files for the jarinjarloader)
   >Wrapper.class
META-INF
       >MANIFEST.MF

我来自第二个 jar 的清单文件如下所示:

Manifest-Version: 1.0
Rsrc-Class-Path: lib/A.jar
Class-Path: .
Rsrc-Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
Main-Class: org.Wrapper

当我启动 B.jar 文件时,它显示进程已启动,但未调用/启动 A.jar 文件。没有错误,没有例外。该过程开始和终止。尝试通过命令行启动它并双击。

如果我将 MANIFEST.MF 文件修改为

Rsrc-Class-Path: A.jar

以及 Wrapper.java 的 main 方法中的 cmdArray 中的元素

"/lib/A.jar" to "A.jar"

我在我的包装 jar 所在的文件夹(例如,B.jar)中制作了 A.jar 的副本,它完美启动,调用了第二个 jar。我究竟做错了什么?我想如何将类路径传递给内部 jar 文件?任何帮助,将不胜感激。

4

1 回答 1

0

虽然严格来说这不是对您问题的回答,但我想我可以为您提出一种更好的方法来解决您的原始问题(即向 jvm 添加 args)。

本文讨论如何重新启动保留 jvm、命令行和其他启动选项的 java 应用程序。

为什么这对您来说可能很有趣?好吧,稍微调整一下,你可以做的是摆脱在你的主 jar 周围添加包装器,并在你的 main 中做这样的事情:

  1. 检查是否存在一些命令行参数,该参数告诉应用程序使用调整后的 vm 选项运行,并且:
  2. 如果存在 - 让应用程序完成它的工作
  3. 在不 - 重新启动应用程序中,调整 jvm 选项以及传递步骤 1 中提到的命令行参数

我在过去的一个项目中做过类似的事情,与包装的 jar 方法相比,它有助于简化构建/打包和调试。

希望这会有所帮助。

于 2013-05-23T12:43:20.833 回答