执行内存中的 jar

Posted

技术标签:

【中文标题】执行内存中的 jar【英文标题】:Executing an in memory jar 【发布时间】:2012-09-04 08:58:47 【问题描述】:

假设我有一个 java 进程,它以字节 [] 的形式从受信任的进程接收可运行的 jar 文件,有没有一种方法可以调用它而无需将 jar 文件写入磁盘然后调用它(启动一个正在运行 jar 的新进程)?

【问题讨论】:

任何执行都从类加载器开始,该类加载器从URL 加载类文件并进一步处理它。首先,您希望完成的事情似乎是不可能的,但不确定是否有任何类加载器黑客可以解决问题。 【参考方案1】:

这里有一种方法可以实现:

    从收到的byte [] 创建一个ByteArrayInputStream

    现在使用JarInputStream 创建 jar 文件的内存表示。

    ByteArrayInputStream bis = new ByteArrayInputStream(byteArray); JarInputStream jis = new JarInputStream(bis);

    这样,您就可以将 jar 加载到内存中。

    现在您可以使用自定义类加载器来进一步处理它。这里是one example,你可以参考。

【讨论】:

【参考方案2】:

最简单的方法是将其写入 ramdisk 并完全避免内存中的想法。

【讨论】:

+1 您可以使用自定义类加载器来执行此操作,但这比写入文件要困难 100 倍。 你不能在 Java 中做到这一点,除非你有大量的安全权限来做一些事情,比如编辑系统挂载点。在 linux 中,您可以通过执行外部脚本来做到这一点,但理想情况下,您可以通过服务器的引导脚本来设置它。我在 ubuntu 中使用此链接 kevingunn.org/?p=210 执行此操作。

以上是关于执行内存中的 jar的主要内容,如果未能解决你的问题,请参考以下文章

Dubbo-使用Maven构建Dubbo服务的可执行jar包

java -jar my.jar 调大虚拟内存

java jar执行一段时间慢慢卡死

day8

java 执行 jar 包中的 main 方法

导出的 (Eclipse) 可执行 jar 文件中的 UnsatisfiedLinkError