java - 如何从单独的 jar 文件运行 jar 文件?

标签 java

<分区>

Possible Duplicate:
Execute another jar in a java program

基本上我想从我现在正在处理的那个运行一个外部 .jar。

即我想从 bar.jar 运行 foo.jar

我试过使用 RuntimeProcess 来执行“java -jar foo.jar”,但它打开 foo.jar 然后立即关闭。有什么建议吗?

最佳答案

最简单的解决方案 ( as Thorn pointed out ) 是将 jar 作为构建时依赖项并从您的代码中静态调用它:

ExternalJarMainClass.main(new String[]{"arguments", "to", "main"});

但如果这不可能,您可以使用 URLClassLoader 动态加载 jar。如果 jar 确实可运行,那么您可以从 META-INF/MANIFEST.MF 读取主类并通过反射调用 main

这是一种不同于创建单独进程的方法,因为外部代码将在与您的应用程序相同的进程中运行。也许这是可取的,也许不是——这取决于具体情况。

下面是一个(仓促编写且有缺陷的)示例助手类,它就是这样做的。

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class JarRunner {

    private final Method entryPoint;

    public JarRunner(File jarFile) throws
            ClassNotFoundException,
            IOException,
            NoSuchMethodException {
        URL jarUrl = jarFile.toURI().toURL();
        URLClassLoader loader = URLClassLoader.newInstance(
                new URL[]{jarUrl});
        URL manifestUrl = loader.findResource("META-INF/MANIFEST.MF");
        String manifest = resourceToString(manifestUrl);
        Class<?> clazz = loader.loadClass(findMainClassName(manifest));
        entryPoint = clazz.getMethod("main", String[].class);
    }

    public void run(String[] argsToMain) throws
            IllegalAccessException,
            IllegalArgumentException,
            InvocationTargetException {
        entryPoint.invoke(null, (Object) argsToMain);
    }

    private static String resourceToString(URL url) throws IOException {
        InputStream contentStream = url.openStream();
        try {
            BufferedReader r = new BufferedReader(
                    new InputStreamReader(contentStream));
            StringBuilder sb = new StringBuilder();
            String line = null;
            do {
                line = r.readLine();
                if (line != null) {
                    sb.append(line).append('\n');
                }
            } while (line != null);
            return sb.toString();
        } finally {
            contentStream.close();
        }
    }

    private static String findMainClassName(String manifest) {
        Matcher m = MAIN_CLASS_PATTERN.matcher(manifest);
        if (m.find()) {
            return m.group(1);
        }
        return null;
    }

    private static final Pattern MAIN_CLASS_PATTERN = 
            Pattern.compile("Main-Class: (.+)");
}

示例用法:

JarRunner jr = new JarRunner(new File("path/to/MyJar.jar"));
jr.run(new String[]{"arg1", "arg2"});

关于java - 如何从单独的 jar 文件运行 jar 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9545300/

相关文章:

java - 使用数组 io java 结果错误

Java Amazon S3 Post 表单

java - 使用正则表达式区分字符串中的斜杠

java - 存储应用程序的 HashMap [代号一]

java - 如何在android中使用retrofit获取Json响应中的数组数据?

java - IntelliJ 在 JavaFX JAR 文件中包含外部 JARS

java - 无限循环阻止文本字段接受输入

java - 在java中压缩和解压缩7z文件

java - 如何从可执行 jar 引用 Maven 依赖项 jar?

java - 如何在 `java2wsdl` 的类上使用 `implements` ?