从另一个罐子里运行一个罐子

时间:2017-07-31 14:34:23

标签: java maven jar

我有一个包含另一个jar的jar,我的目标是运行这个"在jar"来自全球的jar。

我有这个方法可以检索jar中包含的jar的完整路径

private static String getRealPathFromResourceName(String fileName) throws IOException {
    ClassLoader cl = Main.class.getClassLoader();
    URL resource = cl.getResource(fileName);
    String path = resource.getPath();
    return path;
}

然后我运行:

public static boolean exportFullPeriod(CheckConfiguration checkConfig) throws IOException {
    final String cmdLine = buildExportCommandLine(checkConfig);
    try {
        Process process = Runtime.getRuntime().exec(cmdLine);
        ....
    } catch (
        ...
}

其中build exportCommandLine使用前面的方法构建完整的命令行,完整输出为:

java -jar file:/C:/Users/xxx/target/module-backup-1.0.jar!/export-1.1.jar -dbUrl jdbc:mysql://localhost:3306/test -dbPassword test -dbUser test

我得到的错误是以下

Error: Unable to access jarfile file:/C:/Users/xxx/target/module-backup-1.0.jar!/export-1.1.jar

如何引用jar中的jar来调用它?

1 个答案:

答案 0 :(得分:2)

java进程不知道如何从jar中提取jar并在内部jar中运行类。您需要将其解压缩到运行外部jar的目录(动态变量)。然后根据它创建命令行,最后运行它。

所以如果你有/u/myapps/app.jar有一个条目“someDir / anotherApp.jar” 首先将其提取到目录,例如“/u/myapps/tmp/someDir/anotherApp.jar”,然后从此处运行。

请参阅java.util.zip包,了解如何从java打开jar(或zip)文件。

如果你没有“/ u / myapps / tmp /”的写权限,那么尝试使用System.getProperties()中的tmp条目