【问题标题】:Load jar dynamically动态加载jar
【发布时间】:2012-11-10 08:17:00
【问题描述】:

在我的 java 应用程序中,我将一个 jar 文件(使用 Maven shade 插件打包)读入一个字节流。在jar 中有一个入口点类定义在POM.xml

<build>
  ...
  <plugins>
    ...
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <configuration>
        <archive>
          <manifest>
            <mainClass>com.mycompany.TheEntryPoint</mainClass>
          </manifest>
        </archive>
      </configuration>
    </plugin>
  </plugins>
</build>

如何将此类动态加载到我的 java 应用程序中?

更新:

  • jar 作为字节流加载,不驻留在文件系统或 URL 中

【问题讨论】:

  • 能否请你澄清一下你最后一句话,我相信你不小心一个字。
  • @JesusRamos “不小心说了一句话”?讽刺。
  • @millimoose 这就是重点:)
  • @JesusRamos Yah,抱歉,已经修复了语法

标签: java jar classloader urlclassloader


【解决方案1】:

执行此操作的最简单方法是使用URLClassLoader,而不是尝试从字节流中从头开始执行此操作。您始终可以将 .jar 写入临时文件并为其创建 URL。

代码如下所示:

URLClassLoader loader = new URLClassLoader(
    new URL[] {new URL("file://...")},
    Thread.currentThread().getContextClassLoader());

loader.loadClass("com.mycompany.TheEntryPoint");

您还可以使用JarURLConnection 自动检测主类名(或调用它)。 (Oracle 也有a tutorial on using this class。)

【讨论】:

  • 您的 JarURLConnection 链接到 java.lang.Thread。您可能需要考虑将其链接到 docs.oracle.com/javase/7/docs/api/java/net/…
  • @RyanAmos 哎呀,剪贴板内容混乱。感谢您接受它。
  • @millimoose 我真的别无选择,只能从字节流中读取,jar 不在文件目录或 URL 中
  • @xybrek 正如我所说,您可以将字节流写入一个临时文件,然后使用该 URL。除非出于某种原因不允许您使用临时文件,但这似乎不太可能。
  • @xybrek 好吧,要绕过这个相当愚蠢的限制,您可能必须“从头开始”做一些事情。子类ClassLoader,覆盖findClass()(请参阅the docs for ClassLoader),并咨询the source for URLClassLoader以了解它如何读取JAR文件-您应该能够重用或复制其中的一些。
猜你喜欢
  • 2016-05-04
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 2012-08-14
  • 2014-12-24
  • 2015-09-11
相关资源
最近更新 更多