Absence d'attribut de Code dans la méthode qui n'est pas natif ou abstrait dans le fichier de classe javax / servlet/ServletException

j'ai l'intention d'utiliser des servlets Java dans mon application. J'ai inclus ce qui suit dans la POM de mon projet.fichier xml à charger Java servlet 3.0 mise en œuvre jar.

<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.servlet</artifactId>
    <version>3.2-b05</version>
</dependency> 

le projet compile fine. Cependant, quand je le lance, j'obtiens l'erreur suivante:

java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/servlet/ServletException

j'ai cherché ici et trouvé quelques bonnes réponses .

j'ai compris d'eux que cette erreur se produit quand nous incluons le JAR qui ne contient que des interfaces définies par l'API servlet et non l'implémentation réelle. Donc, j'ai vérifié que le bocal de glassfish que j'utilise n'est qu'une interface ou qu'il contient aussi une implémentation. J'ai découvert que c'est une implémentation et pas seulement des interfaces.

Alors maintenant, je me demande pourquoi j'obtiens cette erreur à l'exécution. Quiconque?

mise à jour:

tout à l'heure, j'ai découvert que c'était une erreur flagrante de mon côté (j'ajoutais le pot à un seul projet, alors, était à l'exécution d'une complètement différente du projet!). Je suis désolé pour cela. L'ajout de la servlette glassfish résout le problème.

Merci, Sandeep

20
demandé sur Community 2012-05-23 00:59:41

8 réponses

j'ai combattu les 2 dernières heures environ avec un problème lié aux dépendances javaee-api et javaee-web-api utilisées pour surefire plugin. Comme les gars du forum JBoss ont eu la gentillesse de posté il y a un certain temps , il semble que toute la bibliothèque JEE6 a été divisée (selon la décision de Sun/Oracle) en un JAR API (interfaces/stubs seulement) et les fournisseurs.

quel rapport avec ça? Si vous avez un problème avec, dites Classe FacesContext , vous obtenez une erreur comme ceci:

java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/faces/context/FacesContext

si vous jetez un coup d'oeil à l'arbre des dépendances, vous trouverez un bocal D'API par défaut dans la compilation classpath qui est aussi en train de se mettre en place pour les questions d'exécution:

javax.faces:javax.faces-api:jar:2.1:provided

ajouter une exclusion explicite pour la configuration du plugin surefire va renforcer l'utilisation des dépendances JAR du fournisseur au moment du test:

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.12</version>
    <configuration>
        <classpathDependencyExcludes>
            <!-- exclude code absent api -->
            <classpathDependencyExclude>javax.faces:javax.faces-api</classpathDependencyExclude>
        </classpathDependencyExcludes>
    </configuration>
</plugin>

Espère que ça aide, il a fait un travail pour moi.

14
répondu RickB 2012-07-23 04:48:48

j'ai troqué tout ça contre du poisson de mer et j'ai résolu l'affaire.

    <dependency>
        <groupId>org.glassfish.main.extras</groupId>
        <artifactId>glassfish-embedded-all</artifactId>
        <version>3.1.2.2</version>
        <scope>provided</scope>
    </dependency>
8
répondu frekele 2013-05-31 13:55:29
<dependency>
<groupId>org.glassfish.main.extras</groupId>
<artifactId>glassfish-embedded-all</artifactId>
<version>3.1.2.2</version>
<scope>provided</scope>

ça a marché pour moi. Grâce. Mais de l'ordre à pom.xml compte aussi pour moi

 <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>6.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.glassfish.main.extras</groupId>
        <artifactId>glassfish-embedded-all</artifactId>
        <version>3.1.2.2</version>
        <scope>test</scope>
    </dependency>

au-dessus de la commande ne fonctionne pas

<dependency>
        <groupId>org.glassfish.main.extras</groupId>
        <artifactId>glassfish-embedded-all</artifactId>
        <version>3.1.2.2</version>
        <scope>test</scope>
    </dependency>
 <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>6.0</version>
        <scope>provided</scope>
    </dependency>

Ordre Ci-Dessus Fonctionne

4
répondu Dhaval Patel 2015-06-03 06:16:22

j'ai fait face à la même erreur en utilisant Jersey spécifiquement quand je fais mes tests (JUnit + Mockito). Ce qui fonctionne pour moi était d'ajouter le code ci-dessous à mon pom.fichier xml.

<dependency>
   <groupId>com.sun.jersey</groupId>
   <artifactId>jersey-test-framework</artifactId>
   <version>1.1.5.1</version>
   <scope>test</scope>
</dependency>

Note: J'utilise Jersey 1.17

3
répondu josdem 2013-07-29 20:48:36

j'ai récemment rencontré cette même erreur et, grâce à cette question et les réponses ci - dessus-en particulier leandro.freitos-j'ai pu le résoudre en utilisant

 <dependency>
    <groupId>org.glassfish.main.extras</groupId>
    <artifactId>glassfish-embedded-all</artifactId>
    <version>3.1.2.2</version>
    <scope>provided</scope>
</dependency>

S'avère que le mien avait à voir avec javax.servlet

3
répondu Chuck Ludwigsen 2014-12-12 15:30:27

j'ai eu un cas similaire à celui de josdem (même erreur, également en courant JUnit avec Mockito), mais sans Jersey. Voici donc une solution indépendante du Jersey qui a fonctionné pour moi:

    <dependency> 
        <groupId>org.apache.geronimo.specs</groupId>
        <artifactId>geronimo-servlet_3.0_spec</artifactId>
        <version>1.0</version>
        <scope>test</scope>
    </dependency>
2
répondu machinery 2014-01-08 15:39:06

même problème ici. Bien que cela se soit avéré pour moi d'être l'ordre dans lequel je déclarais des dépendances. La dépendance intégrée à glassfish doit être déclarée avant la dépendance javaee-Web-api fournie.

    <dependency>
        <groupId>org.glassfish.extras</groupId>
        <artifactId>glassfish-embedded-all</artifactId>
        <version>3.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version>6.0</version>
        <scope>provided</scope>
    </dependency>

Je ne suis pas sûr de savoir pourquoi le chemin de classe est confus lorsque le poisson enrobé est placé après l'api javaee-web dans les tests. Je suppose que la JVM essaie de résoudre les classes javax dans le fourni d'abord et ensuite abandonne pendant les tests. Je voudrais figure que la déclaration de la portée du test aurait préséance, mais cela ne semble pas être le cas dans ma situation. Espérons que cela aide quelqu'un.

1
répondu Hodglem 2017-01-04 15:31:42

a eu le même problème de compilation avec netbeans 7.2.1. Cependant, la sortie a spécifié un de mes propres fichiers source java comme ayant l'attribut "absent code".......etc "

en même temps, je pouvais compiler et exécuter le même projet en utilisant JDeveloper. Après quelques "nettoyages" et redémarrages, les netbeans ont encore soulevé le même problème.

Je l'ai finalement corrigé en ajoutant une méthode principale dans le java étant signalé comme ayant "attribut de code absent" et en utilisant le même que le cible de débogage. Tout retour à la normale.

-2
répondu Vince Stewart 2013-06-07 00:00:48