0

I developed an API and a plugin with the dependency of the API. So I am using classes of the API. The problem is, I have to put the two jar-files in different folders and I am getting a ClassNotFoundException while starting the plugin. I asked a friend how to fix this and he anserwed, I should use maven-shade-plugin. But I do not know how to use this for my problem. This is the pom.xml of the project:

<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>

This is the pom.xml of my plugin-module:

<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>

and this is the pom.xml of the api-module:

<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>

and this is the console output:

[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
IltisAuge
  • 13
  • 4
  • Post the API and Plugin pom please. I use spigot and multi-module maven aggregation/inheritance so i'm fairly certain I can help. – Jason Apr 14 '20 at 15:08
  • 1
    Does this answer your question? [How can I create an executable JAR with dependencies using Maven?](https://stackoverflow.com/questions/574594/how-can-i-create-an-executable-jar-with-dependencies-using-maven) – J Fabian Meier Apr 14 '20 at 15:08
  • @Jason I added it. – IltisAuge Apr 14 '20 at 15:19

1 Answers1

0

Have the child module depend on the api. It is worth noting that the api's dependencies should be of scope provided so that when you shade your api with your module the dependencies don't overlap (just found this out).

<dependencies>
    <dependency>
        <groupId>de.iltisauge</groupId>
        <artifactId>API-Plugin-Test</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>
Jason
  • 5,154
  • 2
  • 12
  • 22