2017-01-04 1 views
0

J'essaie d'utiliser un fichier .JAR que j'ai créé en tant qu'API pour mon projet actuel. This est la page GitHub pour l'API, et this est le code pour le plugin sur lequel je travaille.ClassNotFoundException Lorsque vous utilisez un autre fichier jar dans le chemin de compilation eclipse (minecraft plugin)

Je reçois ces erreurs:

04.01 17:32:03 [Server] INFO Caused by: java.lang.NoClassDefFoundError: me/Andrew/XenforoAPI/SiteAPI 
04.01 17:32:03 [Server] INFO at me.Andrew.BreezeSiteLink.APICaller.postApplication(APICaller.java:16) ~[?:?] 
04.01 17:32:03 [Server] INFO at me.Andrew.BreezeSiteLink.Main.onCommand(Main.java:84) ~[?:?] 
04.01 17:32:03 [Server] INFO at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[spigot.jar:git-Spigot-5391d73-0ebb9c7] 
04.01 17:32:03 [Server] INFO ... 15 more 
04.01 17:32:03 [Server] INFO Caused by: java.lang.ClassNotFoundException: me.Andrew.XenforoAPI.SiteAPI 
04.01 17:32:03 [Server] INFO at java.net.URLClassLoader$1.run(URLClassLoader.java:359) ~[?:1.7.0_121] 
04.01 17:32:03 [Server] INFO at java.net.URLClassLoader$1.run(URLClassLoader.java:348) ~[?:1.7.0_121] 
04.01 17:32:03 [Server] INFO at java.security.AccessController.doPrivileged(Native Method) ~[?:1.7.0_121] 
04.01 17:32:03 [Server] INFO at java.net.URLClassLoader.findClass(URLClassLoader.java:347) ~[?:1.7.0_121] 
04.01 17:32:03 [Server] INFO at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:101) ~[spigot.jar:git-Spigot-5391d73-0ebb9c7] 

Dans Eclipse, "Exporter sous forme de fichier JAR" est cochée (mais pas "fichier JAR Runnable").

Comment puis-je résoudre cela et obtenir l'API à compiler avec le plugin?

+1

Il s'agit d'une erreur d'exécution et non d'une erreur de compilation. –

+0

@ElliottFrisch savez-vous comment je peux résoudre ce problème? –

+0

Modifiez votre chemin de classe d'exécution. –

Répondre

0

Rightclick votre Projct -> Chemin de génération Java -> Libaries -> Ajouter des fichiers JAR externes

Vous pouvez ensuite sélectionner le pot/api que vous souhaitez utiliser avec votre projet, mais il ne pas oublier d'ajouter à la dépendances dans le plugin.yml aussi:

depend: [Plugin1, Plugin2...] 
+0

La bibliothèque externe n'est pas liée à un plug-in, c'est une bibliothèque Java et elle n'a pas la fonctionnalité JavaPlugin pour Bukkit. Cette réponse ne va pas aider – Kerooker

+1

Bien sûr, cela s'applique, car au moins la façon d'ajouter un pot externe est la même pour tous les jars/librairies. – AscendedKitten

+0

Une bibliothèque externe est une chose en Java, mais l'ajouter de cette façon n'est pas une chose pour Bukkit, donc la réponse ne va pas aider car la situation concerne bukkit – Kerooker

0

Comme nous l'avons vu, l'erreur est le résultat de votre plugin ne pas trouver votre bibliothèque API. Dans la plupart des cas, je vous recommande d'inclure cette dépendance dans le fichier JAR de votre plugin.

Cependant, si cette API, qui n'est pas elle-même un plugin, est utilisée par plusieurs plugins, créez un répertoire lib à la racine du serveur et placez-y votre JAR API. Tous les fichiers JAR situés dans ce répertoire seront chargés par Bukkit/Spigot et disponibles pour tous les plugins.

Edit:

Comme je l'ai mentionné dans mon commentaire, je l'ai utilisé cette technique depuis si longtemps, je suppose qu'il soit une caractéristique de Bukkit. Hélas, ce n'est pas le cas.

Ajout Classpath dans MANIFEST.MF

Ajout de la configuration maven-jar-plugin suivante à votre POM, assure que toutes les dépendances ayant une portée de compile sera ajouté au classpath de votre plugin. Le chemin de classe est relatif à l'emplacement de votre plugin (le répertoire plugin), donc ../lib/ est le répertoire lib dans la racine du serveur.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.6</version> 
    <configuration> 
     <archive> 
      <manifestEntries> 
       <Built-By>You</Built-By> 
      </manifestEntries> 
      <manifest> 
       <addClasspath>true</addClasspath> 
       <classpathPrefix>../lib/</classpathPrefix> 
      </manifest> 
     </archive> 
    /configuration> 
</plugin> 

Essentiellement, cela crée une entrée dans META-INF/MANIFEST.MF de votre plugin le référencement de votre bibliothèque API similaire à ce qui suit:

Manifest-Version: 1.0 
Archiver-Version: Plexus Archiver 
Built-By: You 
Class-Path: ../lib/my-api.jar 
Created-By: Apache Maven 3.3.9 
Build-Jdk: 1.8.0_73 

Créer un Uber-JAR

La solution ci-dessus a travaillé bien pour nous, fournissant un emplacement unique pour la maintenance des bibliothèques utilisées par plusieurs de nos plugins internes. Là encore, nous gérons notre propre serveur.

Si vos plans à long terme sont de publier votre plugin pour d'autres à utiliser, cette solution n'est pas idéale. Bien que cela fonctionne, cela nécessite un travail supplémentaire de la part des opérateurs de serveur, sauf si l'installation de votre bibliothèque d'API est automatisée. Là encore, l'installation de fichiers autres que ceux attendus par les opérateurs de serveurs n'est peut-être pas une bonne idée non plus.

Une meilleure solution consiste à créer un fichier UBER-JAR qui inclut votre code et toutes les dépendances uniques, telles que votre API. Cela élimine le besoin d'installer votre JAR API comme dans l'exemple ci-dessus. Plus important encore, il évite les incompatibilités potentielles des versions à mesure que de nouvelles versions de votre plugin sont publiées. En ajoutant la configuration maven-shade-plugin suivante à votre POM, vous créerez un uber-JAR qui inclut vos classes de plug-in et d'API et les interfaces dans un seul fichier JAR. L'exemple suppose que la votre API a Maven coordonnées me.andy:myapi:1.0

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>2.1</version> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals> 
      <configuration> 
       <minimizeJar>true</minimizeJar> 
       <filters> 
        <filter> 
         <artifact>me.andy:myapi:1.0</artifact> 
         <includes> 
          <include>**</include> 
         </includes> 
        </filter> 
       </filters> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

Après avoir exécuté mvn install, vous trouverez trois fichiers JAR dans le répertoire target (les noms de fichiers sont évidemment différentes):

  • original-myplugin-1.0.jar - l'original JAR comme il aurait été créé normalement.
  • myplugin-1.0-shaded.jar - le JAR combiné
  • myplugin-1.0.jar - le fichier JAR combiné avec des dépendances réduites. C'est le dernier plugin JAR.

Vous pouvez vérifier ce qui était inclus avec n'importe quel outil ZIP populaire.

+0

Existe-t-il une documentation pour le prouver? –

+0

Au début, j'ai été déconcerté par votre question, mais je me suis rendu compte que j'avais utilisé cette technique pendant les 6 dernières années, je pensais que c'était une fonctionnalité standard de Bukkit. Évidemment, ce n'est pas le cas. Je vais modifier mon message pour fournir plus de détails. – Frelling

+0

Toutes mes excuses pour le délai de mise à jour. Cette chose appelée * travail * a gêné :) – Frelling