Partage
  • Partager sur Facebook
  • Partager sur Twitter

NoClassDefFoundError et ClassNotFoundException

ObjectMapper

Sujet résolu
    18 janvier 2018 à 22:03:45

    Bonjour/Bonsoir,
    Développeur java amateur et récent, sur Eclipse, je viens de rejoindre l’équipe bénévole d’un serveur de jeu. Je rencontre un problème sur le plugin du serveur. Il est normalement lié à notre site web, mais le lien ne se fait plus correctement. Il semblerait que la cause soit un “ObjectMapper” qui n’est pas trouvé par le plugin :
    [21:20:16] [Thread-8/WARN]: Exception in thread "Thread-8" 
    [21:20:16] [Thread-8/WARN]: java.lang.NoClassDefFoundError: org/codehaus/jackson/map/ObjectMapper
    [21:20:16] [Thread-8/WARN]: 	at main.java.com.naheulcraft.specific.Ressources.FeatureFunctions$AsynchronousAPISender$APISenderRunnable.run(FeatureFunctions.java:669)
    [21:20:16] [Thread-8/WARN]: 	at java.lang.Thread.run(Unknown Source)
    [21:20:16] [Thread-8/WARN]: Caused by: java.lang.ClassNotFoundException: org.codehaus.jackson.map.ObjectMapper
    [21:20:16] [Thread-8/WARN]: 	at java.net.URLClassLoader.findClass(Unknown Source)
    [21:20:16] [Thread-8/WARN]: 	at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:101)
    [21:20:16] [Thread-8/WARN]: 	at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:86)
    [21:20:16] [Thread-8/WARN]: 	at java.lang.ClassLoader.loadClass(Unknown Source)
    [21:20:16] [Thread-8/WARN]: 	at java.lang.ClassLoader.loadClass(Unknown Source)
    [21:20:16] [Thread-8/WARN]: 	... 2 more
    La dépendance suivante est indiquée dans le pom.xml, et maven semble bien l’avoir prise en compte  :
    <dependency>
          <groupId>org.codehaus.jackson</groupId>
          <artifactId>jackson-mapper-asl</artifactId>
          <version>1.9.11</version>
          <type>jar</type>
          <scope>compile</scope> 
    </dependency>
    Il n’y a pas d’erreur sur l’importation :
    import org.codehaus.jackson.map.ObjectMapper;
    [...]
    
    private class APISenderRunnable implements Runnable
            {
                Map<String, String> params;
                APISenderRunnable(Map<String, String> params)
                {
                    this.params = params;
                }
    
                public void run()
                {
                    ObjectMapper mapper = new ObjectMapper();
                    String url = FeatureFunctions.BuildFullUrl(NCPlugin.API_URL, params);
                    try
                    {
                        array = mapper.readTree(new URL(url));
                    }
                    catch(Exception e)
                    {
                        System.out.println("ERROR, URL BUILDING FAILED OR API IS DOWN.");
                    }
                }
            }
    Et pourtant, ça ne fonctionne pas. J’ai tenté tout ce que j’ai trouvé sur internet, changer la version, utiliser com.fasterxml.jackson.databind à la place, modifier le .classpath, ajouter le jar manuellement via buildpath > external jars, sans succès. Je me suis donc résolu à demander de l’aide.
    Voici le pom.xml complet :
    <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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.naheulcraft</groupId>
        <artifactId>specific</artifactId>
        <url>http://www.naheulcraft.com/</url>
        <build>
    	 <sourceDirectory>src</sourceDirectory>
            <resources>
                <resource>
                    <filtering>true</filtering>
                    <directory>src</directory>
                    <includes>
                        <include>plugin.yml</include>
                    </includes>
                </resource>
            </resources>
    	<plugins>
    	    <plugin>
    		<groupId>org.apache.maven.plugins</groupId>
    		<artifactId>maven-compiler-plugin</artifactId>
    		<version>2.0.2</version>
    		<configuration>
    		    <source>1.8</source>
    		    <target>1.8</target>
    		    <encoding>${project.build.sourceEncoding}</encoding>
    		</configuration>
    	    </plugin>
    	    <plugin>
    		<groupId>org.apache.maven.plugins</groupId>
    		<artifactId>maven-assembly-plugin</artifactId>
    		<version>2.4</version>
    		<executions>
    		    <execution>
    			<phase>package</phase>
    			<goals>
    			    <goal>single</goal>
    			</goals>
    		    </execution>
    		</executions>		
    		<configuration>
    		    <descriptorRefs>
    			<descriptorRef>jar-with-dependencies</descriptorRef>
    		    </descriptorRefs>
    		</configuration>
    	    </plugin>
    	    <plugin>
    		<groupId>org.apache.maven.plugins</groupId>
    		<artifactId>maven-resources-plugin</artifactId>
    		<version>2.4.3</version>
    		<configuration>
    		    <encoding>${project.build.sourceEncoding}</encoding>
    		</configuration>
    	    </plugin>
    	</plugins>
        </build>
        <repositories>
    	<repository>
    	    <id>spigot-repo</id>
    	    <url>https://hub.spigotmc.org/nexus/content/groups/public/</url>
    	</repository>
    	<!--<repository>
    	    <id>bukkit-repo</id>
    	    <url>http://repo.bukkit.org/content/groups/public</url>
    	</repository>-->
    	<repository>
    	    <id>codehaus-snapshots</id>
    	    <url>http://snapshots.repository.codehaus.org</url>
    	</repository>
        </repositories>
        <dependencies>
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.1</version>
            </dependency>
    	<dependency>
    	    <groupId>org.codehaus.jackson</groupId>
    	    <artifactId>jackson-mapper-asl</artifactId>
    		<version>1.9.11</version>
    	    <type>jar</type>
    	    <scope>compile</scope> 
    	</dependency>
        <!--<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.3</version>
    		<type>jar</type>
    	    <scope>compile</scope> 
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.3</version>
    		<type>jar</type>
    	    <scope>compile</scope> 
        </dependency>
        <dependency>
    			<groupId>com.fasterxml.jackson.core</groupId>
    			<artifactId>jackson-databind</artifactId>
    			<version>2.9.3</version>
    			<type>jar</type>
    			<scope>compile</scope> 
    				<exclusions>
    					<exclusion> 
    						<groupId>com.fasterxml.jackson.core</groupId>
    						<artifactId>jackson-annotations</artifactId>
    					</exclusion>
    					<exclusion> 
    						<groupId>com.fasterxml.jackson.core</groupId>
    						<artifactId>jackson-core</artifactId>
    					</exclusion>
    			 </exclusions> 
        </dependency>-->
    	<!--<dependency>
    	    <groupId>org.bukkit</groupId>
    	    <artifactId>bukkit</artifactId>
    	    <version>LATEST</version>
    	</dependency>-->
            <dependency>
                <groupId>com.google.code.google-collections</groupId>
                <artifactId>google-collect</artifactId>
                <version>snapshot-20080530</version>
                <type>jar</type>
            </dependency>
        </dependencies>
        <properties>
    	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
        <name>NaheulcraftFR-Specific</name>
        <version>1.10</version>
    </project>
    Voici le .classpath actuel :
    <?xml version="1.0" encoding="UTF-8"?>
    <classpath>
    	<classpathentry kind="src" path="src"/>
    	<classpathentry exported="true" kind="lib" path="C:/Users/Florent_2/Desktop/Serveur test Spigot/bukkit.jar"/>
    	<classpathentry exported="true" kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
    		<attributes>
    			<attribute name="maven.pomderived" value="true"/>
    		</attributes>
    	</classpathentry>
    	<classpathentry exported="true" kind="lib" path="C:/Users/Florent_2/Desktop/spigot-1.12.2-R0.1-SNAPSHOT-b1577.jar"/>
    	<classpathentry exported="true" kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
    	<classpathentry exported="true" kind="lib" path="C:/Users/Florent_2/Desktop/jackson-mapper-asl-1.9.11.jar"/>
    	<classpathentry exported="true" kind="lib" path="C:/Users/Florent_2/Desktop/jackson-core-asl-1.9.11.jar"/>
    	<classpathentry kind="output" path="target/classes"/>
    </classpath>
    Je vous remercie d’avance.
    Florent
    • Partager sur Facebook
    • Partager sur Twitter
    Contrôleur programmeur des finances publiques depuis le 01/10/18
      20 janvier 2018 à 9:18:19

      Bonjour,

      Que déploies-tu sur ton serveur (un jar, un war, un ear) ? De quel type de serveur s'agit-il (web serveur type tomcat, JEE serveur type Glassfish, autre) ?

      Je vois que tu builde un jar-with-dependencies lors du package, est-ce bien lui que tu déploies ?

      Si oui, vérifies que le jar contient bien la classe en question

      • Partager sur Facebook
      • Partager sur Twitter
        20 janvier 2018 à 16:59:00

        Bonjour,

        Merci pour votre réponse.

        Je déploie un .jar sur un serveur minecraft Spigot.

        Pour déployer, je vais dans export > jar file et j'inclus toutes les ressources :

        Je ne sais pas si je procède comme il faut, je ne sais pas où se trouve ce jar-with-dependencies et comment l'exporter avec Eclipse / Maven. Pour tout vous avouer, j'ai rejoint ce projet (qui a déjà quelques années) il y a à peine 2 semaines, il n'y a aucune documentation (ou très peu) et les anciens développeurs utilisaient NetBeans et pas Eclipse pour déployer (je suis en contact avec l'un d'eux, il ne comprend pas non plus l'erreur). Je ne connaissais pas Maven ni les pom.xml avant de rejoindre ce projet, je n'avais jamais utilisé cela avant. J'ai tenté de passer sur NetBeans, mais je maîtrise encore moins cet IDE qu'Eclipse et des erreurs qui n'apparaissaient pas dans Eclipse apparaissent donc j'ai laissé tomber.

        Sur un autre forum sur lequel j'ai demandé de l'aide (https://stackoverflow.com/questions/48330529/javaeclipse-noclassdeffounderror-classnotfoundexception-objectmapper), on m'a dit qu'il fallait ajouter les jars dans le "runtime classpath" en plus du "build classpath", parce que le programme se construit correctement mais ne trouve plus le jar importé à l'exécution. Je ne sais pas comment modifier le "runtime classpath" dans Eclipse. J'ai tenté d'aller dans "Run Configurations" pour définir le jar à importer et le rattacher au projet, sans succès : 

        Dans d'autres forums sur le web, j'ai lu qu'il fallait ajouter les jars dans le "deployment assembly". J'ai installé m2eclipse pour débloquer cet onglet, j'ai tenté d'ajouter les jars ou les dépendances Maven (qui comprennent les jars) pour qu'ils soient pris en compte à l'exécution, ça n'a pas fonctionné :

        Sur un autre forum encore, il est dit qu'Eclipse ne met pas correctement à jour le fichier manifest lorsque l'on exporte le projet en .jar. Qu'il faut écrire un script pointant vers les fichiers jars ou entrer les jars requis dans le fichier manifest. (https://stackoverflow.com/questions/36044107/class-not-found-even-when-in-jar-in-the-classpath) Je ne sais pas comment faire cela. Quel script ? Et ce fichier manifest, comment le modifier, que faut-il mettre à l'intérieur exactement ?

        Bref, je tourne en rond et je pars dans tous les sens, ce problème me donne mal au crâne et me donne des cheveux blancs. Je suis sûr que la solution est à portée de main mais je ne la trouve pas ou je n'arrive pas à la mettre en oeuvre. J'espère que vous aurez des idées car c'est désespérant.

        PS : org.codehaus.jackson.map.ObjectMapper OU com.fasterxml.jackson.databind.ObjectMapper, ça n'a pas d'importance. Ce que je souhaite c'est pouvoir utiliser l'ObjectMapper correctement, peu importe d'où il vienne, et que le lien plugin/site soit rétabli.

        -
        Edité par _Florent_ 20 janvier 2018 à 17:00:27

        • Partager sur Facebook
        • Partager sur Twitter
        Contrôleur programmeur des finances publiques depuis le 01/10/18
          20 janvier 2018 à 17:40:59

          Bonjour,

          Bien que je ne connaisse pas les spécificités du serveur MineCraft, il semble être un serveur autonome chargeant des extensions sous forme de fichier jars.

          Donc 2 possibilités

          • les jars d'extension doivent contenir toutes leurs dépendances. Et dans ce cas là, il faut builder le projet avec Maven (m2eclipse) et déployer le jar-with-dependencies créé dans le répertoire target du projet
          • sinon déployer le jar, de préférence celui généré par Maven (par le jar-with-dependencies, mais l'autre) dans le répertoire target (ton export contient beaucoup trop de choses) et déployer les dépendances runtime sur le serveur Minecraft, pas dans Eclipse. Mais là je ne sais pas où se trouve le répertoire des librairies runtime du serveur Minecraft

          En espérant que cela t'aide

          • Partager sur Facebook
          • Partager sur Twitter
            20 janvier 2018 à 18:30:03

            Re-Bonjour,

            Je tente votre première proposition.

            J'ai d'abord essayé d'aller dans maven > update project :

            Cela n'a crée aucun jar-with-dependencies (il n'y a que des .class dans target ou des dossiers vides).

            En revanche, j'ai trouvé quelque chose d'intéressant dans run as, je suppose que c'est ici que je dois aller :

            En cliquant ici j'arrive sur cette fenêtre :

            J'ai appuyé directement sur Run, et voici le résultat :

            [INFO] Scanning for projects...
            [INFO] ------------------------------------------------------------------------
            [INFO] BUILD FAILURE
            [INFO] ------------------------------------------------------------------------
            [INFO] Total time: 0.231 s
            [INFO] Finished at: 2018-01-20T18:28:04+01:00
            [INFO] Final Memory: 6M/77M
            [INFO] ------------------------------------------------------------------------
            [ERROR] No goals have been specified for this build. You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy. -> [Help 1]
            [ERROR] 
            [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
            [ERROR] Re-run Maven using the -X switch to enable full debug logging.
            [ERROR] 
            [ERROR] For more information about the errors and possible solutions, please read the following articles:
            [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/NoGoalSpecifiedException

            Je ne comprends pas, que dois-je mettre exactement dans goals ? <Naheulcraft>:<compile> ?

            • Partager sur Facebook
            • Partager sur Twitter
            Contrôleur programmeur des finances publiques depuis le 01/10/18
              20 janvier 2018 à 18:38:47

              le plus simple est de choisir l'option Run / Maven install
              • Partager sur Facebook
              • Partager sur Twitter
                20 janvier 2018 à 19:55:25

                Je vous remercie infiniment. J'ai pu récupérer le jar-with-dependancies, l'ObjectMapper se trouvait bien à l'intérieur.

                J'ai installé le jar sur le serveur et après quelques réglages, le lien entre le site et le plugin s'est rétabli :)

                La solution était bien sous mon nez, il me manquait juste un petit aiguillage et vous êtes la seule personne qui ait pu me le donner.

                Je vous souhaite une bonne soirée, et encore merci.

                • Partager sur Facebook
                • Partager sur Twitter
                Contrôleur programmeur des finances publiques depuis le 01/10/18

                NoClassDefFoundError et ClassNotFoundException

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown