java - 如何从 jar 文件动态运行 java 类

标签 java jar classloader

我正在开发一个 java 项目,该项目需要一个作为服务器运行的第三方 java 程序才能工作。

通常情况下,我会这样做:

java -cp jarfile1.jar:jarfile2.jar className arg1 arg2

然后我会运行我的 java 代码。这样就可以了。

我想知道是否有任何方法(包括我的项目所需的两个 .jar)直接从我的代码运行该类,而不必手动启动它。

我尝试使用 URLClassLoader 正如我在一些示例中看到的那样,但要么我做错了,要么没有一个涵盖这个特定的用例。

URLClassLoader classLoader = URLClassLoader.newInstance(new URL[]{new URL("file:///tmp/jarfile1.jar"),new URL("file:///tmp/jarfile2.jar")});
Class<?> cls = classLoader.loadClass("className");
Method method = cls.getDeclaredMethod ("main");
Object instance = cls.newInstance();
Object result = method.invoke (instance);

产量

Exception in thread "main" java.lang.NoClassDefFoundError: alice/tuprolog/lib/InvalidObjectIdException
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2615)
at java.lang.Class.getDeclaredMethod(Class.java:2007)
at pkg1.MainClass.main(MainClass.java:54)
Caused by: java.lang.ClassNotFoundException: alice.tuprolog.lib.InvalidObjectIdException
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    ... 4 more

请注意,我将 .jar 复制到/tmp 以隔离失败原因。文件存在并且可以访问。

如何使其在 java 代码中运行上面指定的类?

谢谢!

最佳答案

如果该类存在于不同的ClassLoader中,则需要使用反射来获取它:

ClassLoader classLoader = new URLClassLoader(
    new URL[] { firstJarURL, secondJarURL });

String[] args = { arg1, arg2 };

try {
    Class<?> mainClass = classLoader.loadClass("com.somepackage.ClassName");
    mainClass.getMethod("main", String[].class).invoke(null, args);
} catch (ReflectiveOperationException e) {
    throw new RuntimeException(e);
}

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

相关文章:

java - 如何将字符串添加到字符串池中

scala - SBT 如何在插件任务执行中使用 Build.sbt 中的类

java - 如何向 JTable 添加 Action 监听器?

java - 如何为我的java应用程序+ mysql创建可安装的(从maven构建spring boot创建的jar)

java - JAR 文件签名 block 格式

java - 同一 jar 文件中的两个相同的类

java - JAX-RS 和 java.time.LocalDate 作为输入参数

java - 带有 JWS 的 xsd 注释

java - 如何在 Java 中将 zip 文件转换为字节

java - .jar冲突导致java.lang.RuntimeException : Error starting org. neo4j.kernel.EmbeddedGraphDatabase异常