在jar中执行一个包装的jar文件

时间:2013-05-23 12:16:10

标签: java jvm wrapper executable-jar

我正在尝试围绕可运行的.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

当我创建第二个jar文件时,从Wrapper项目(我们称之为B.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主方法中的cmdArray元素
"/lib/A.jar" to "A.jar"

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

1 个答案:

答案 0 :(得分:0)

虽然严格来说这不是你问题的答案,但我认为我可以为你提出一个更好的方法来解决你的原始问题(即将args添加到jvm)。

This article讨论了如何重启java app以保留jvm,命令行和其他启动选项。

为什么这对你有意思?好吧,稍微调整一下,你可以做的就是摆脱在你的主罐子周围添加包装并在你的主要做这样的事情:

  1. 检查是否存在某些命令行参数,该参数告知应用程序是使用调整的vm选项运行的,并且:
  2. 如果存在 - 让应用程序执行此操作
  3. in not - restart application,调整jvm选项以及传递步骤1中引用的命令行参数
  4. 我在过去的一个项目中做过类似的事情,与包装jar方法相比,它有助于简化构建/打包和调试。

    希望这会有所帮助。

相关问题