Загрузите банку динамически

В моем java-приложении я прочитал jar-файл (упакованный с плагином Maven Shade) в поток байтов. В банке есть класс точки входа, определенный в 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

1 ответ

Решение

Самый простой способ сделать это - использовать URLClassLoader вместо того, чтобы пытаться сделать это с нуля из потока байтов. Вы всегда можете записать.jar во временный файл и создать URL для этого.

Код будет выглядеть примерно так:

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

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

Вы также можете автоматически определить имя основного класса (или вызвать его), используя JarURLConnection, (Oracle также имеет руководство по использованию этого класса.)

Другие вопросы по тегам