Загрузка jar-файла с помощью maven-shade-plugin - PullRequest
0 голосов
/ 14 апреля 2020

Я разработал API и плагин с зависимостью от API. Поэтому я использую классы API. Проблема в том, что мне нужно поместить два jar-файла в разные папки, и я получаю ClassNotFoundException при запуске плагина. Я спросил друга, как это исправить, и он ответил, что я должен использовать maven-shade-plugin. Но я не знаю, как использовать это для моей проблемы. Это пом. xml проекта:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>de.iltisauge</groupId>
  <artifactId>API-Plugin-Test</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
  <modules>
    <module>Test-API</module>
    <module>Test-Plugin</module>
  </modules>          
</project>

Это пом. xml моего плагина-модуля:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>de.iltisauge</groupId>
    <artifactId>API-Plugin-Test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>Test-Plugin</artifactId>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.2.2</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <createDependencyReducedPom>false</createDependencyReducedPom>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
      <groupId>org.spigotmc</groupId>
      <artifactId>spigot-api</artifactId>
      <version>1.8.8-R0.1-SNAPSHOT</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>de.iltisauge</groupId>
      <artifactId>Test-API</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
</project>

и это пом. xml API-модуля:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>de.iltisauge</groupId>
    <artifactId>API-Plugin-Test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>Test-API</artifactId>
</project>

и это вывод консоли:

[17:01:24 ERROR]: Could not load 'plugins\Test-Plugin-0.0.1-SNAPSHOT-shaded.jar' in folder 'plugins'
org.bukkit.plugin.InvalidPluginException: java.lang.NoClassDefFoundError: de/iltisauge/test/api/IHuman
        at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:135) ~[spigot1.8.8.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.SimplePluginManager.loadPlugin(SimplePluginManager.java:329) ~[spigot1.8.8.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.SimplePluginManager.loadPlugins(SimplePluginManager.java:251) [spigot1.8.8.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.craftbukkit.v1_8_R3.CraftServer.loadPlugins(CraftServer.java:292) [spigot1.8.8.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.DedicatedServer.init(DedicatedServer.java:198) [spigot1.8.8.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:525) [spigot1.8.8.jar:git-Spigot-db6de12-18fbb24]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_241]
Caused by: java.lang.NoClassDefFoundError: de/iltisauge/test/api/IHuman
        at java.lang.Class.forName0(Native Method) ~[?:1.8.0_241]
        at java.lang.Class.forName(Unknown Source) ~[?:1.8.0_241]
        at org.bukkit.plugin.java.PluginClassLoader.<init>(PluginClassLoader.java:64) ~[spigot1.8.8.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:131) ~[spigot1.8.8.jar:git-Spigot-db6de12-18fbb24]
        ... 6 more
Caused by: java.lang.ClassNotFoundException: de.iltisauge.test.api.IHuman
        at java.net.URLClassLoader.findClass(Unknown Source) ~[?:1.8.0_241]
        at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:101) ~[spigot1.8.8.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:86) ~[spigot1.8.8.jar:git-Spigot-db6de12-18fbb24]
        at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_241]
        at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_241]
        at java.lang.Class.forName0(Native Method) ~[?:1.8.0_241]
        at java.lang.Class.forName(Unknown Source) ~[?:1.8.0_241]
        at org.bukkit.plugin.java.PluginClassLoader.<init>(PluginClassLoader.java:64) ~[spigot1.8.8.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:131) ~[spigot1.8.8.jar:git-Spigot-db6de12-18fbb24]
        ... 6 more

1 Ответ

0 голосов
/ 14 апреля 2020

Дочерний модуль зависит от API. Стоит отметить, что зависимости API должны иметь область видимости, чтобы когда вы затеняли свой API с помощью модуля, зависимости не перекрывались (только что это выяснили).

<dependencies>
    <dependency>
        <groupId>de.iltisauge</groupId>
        <artifactId>API-Plugin-Test</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>
...