2
votes

Obtention de java.lang.ClassNotFoundException: jakarta.servlet.Filter sur le service Web Maven / Jersey lors de l'exécution sur Tomcat 9

Je suis nouveau dans jakarta EE / webservice. Lors de l'exécution sur le serveur Tomcat 9 avec la ressource suivante, j'obtiens l'erreur java.lang.ClassNotFoundException: jakarta.servlet.Filter

Ce qui suit est le fichier pom.xml

package com.telusko.demorest;

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;

/**
 * Root resource (exposed at "myresource" path)
 */
@Path("myresource")
public class MyResource {

    /**
     * Method handling HTTP GET requests. The returned object will be sent
     * to the client as "text/plain" media type.
     *
     * @return String that will be returned as a text/plain response.
     */
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getIt() {
        return "Got it!";
    }
}

Voici le fichier web.xml avec le projet demorest.

<?xml version="1.0" encoding="UTF-8"?>
<!-- This web.xml file is not required when using Servlet 3.0 container,
     see implementation details http://jersey.java.net/nonav/documentation/latest/jax-rs.html -->
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>com.telusko.demorest</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>/webapi/*</url-pattern>
    </servlet-mapping>
</web-app>

Le fichier de ressources qui a été créé est le suivant:

<modelVersion>4.0.0</modelVersion>

<groupId>com.telusko</groupId>
<artifactId>demorest</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>demorest</name>

<build>
    <finalName>demorest</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.5.1</version>
            <inherited>true</inherited>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
    </plugins>
</build>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.glassfish.jersey</groupId>
            <artifactId>jersey-bom</artifactId>
            <version>${jersey.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet-core</artifactId>
        <!-- use the following artifactId if you don't need servlet 2.x compatibility -->
        <!-- artifactId>jersey-container-servlet</artifactId -->
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.inject</groupId>
        <artifactId>jersey-hk2</artifactId>
    </dependency>
    
    
    <!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-core -->

    
    <!-- uncomment this to get JSON support
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-binding</artifactId>
    </dependency>
    
    -->
</dependencies>
<properties>
    <jersey.version>3.0.0-M6</jersey.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> </project>

Tout type d'aide est apprécié.


1 commentaires

Comme je sais que le tomcat 9 ne prend pas en charge Jakarta EE pour le support Jakarta EE, vous devez utiliser tomcat 10 qui n'est pas encore pris en charge dans eclipse et vous devez l'essayer dans netbeans avec tomcat 10 ou installer wildfly sur votre système, puis installer les outils jboss du marché eclipse placez puis ajoutez wildfly et exécutez votre projet vérifiez également que votre wildfly téléchargé fait le jakarta ee un pas java ee


3 Réponses :


6
votes

java.lang.ClassNotFoundException: jakarta.servlet.Filter

Cette classe fait partie de la version 5.0 de l'API Servlet qui à son tour fait partie de la version 9 de Jakarta EE.

Et,

<jersey.version>3.0.0-M6</jersey.version>

cette version de Jersey est basée sur la version 3.0 de l'API JAX-RS qui fait à son tour partie de la version 9 de Jakarta EE.

Et,

Serveur Tomcat 9

Cette version de Tomcat est basée sur la version 4.0 de l'API Servlet, qui à son tour fait partie de la version 8 de Java / Jakarta EE.

Donc, en résumé, les versions JEE ciblées ne correspondent pas et cela vous cause des problèmes. Vous avez 2 options:

  1. Rétrograder Jersey à la version 2.x. Celui-ci est basé sur la version 2.x de l'API JAX-RS qui à son tour fait partie de la version 8 de Java / Jakarta EE.

  2. Ou mettez à niveau Tomcat vers la version 10.x. Celui-ci est basé sur la version 5.0 de l'API Servlet qui à son tour fait partie de la version 9 de Jakarta EE (qui propose à son tour l'API JAX-RS version 3.x pour laquelle vous pouvez ainsi utiliser la version Jersey prévue).

La raison technique est que lors de l'étape de Java / Jakarta EE 8 vers Jakarta EE 9, tous les javax.* Ont été renommés en jakarta.* . Il n'y a donc plus de rétrocompatibilité depuis Jakarta EE 9. Le runtime cible lui-même (donc, Tomcat lui-même), doit vraiment être celui ciblé pour les API utilisées par Jakarta EE 9.

Voir également:


0 commentaires

0
votes

A également travaillé sur le projet Jersey sur Tomcat 9 Essayez avec ces dépendances

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
    http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
      <display-name>JerseyTomcatTest</display-name>
</web-app>

De plus, vous n'avez rien à mettre dans votre web.xml tant que vous utilisez une classe comme suit

import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("jerseyontomcat/*")
public class RestApp extends Application
{

    @Override
    public Set<Class<?>> getClasses()
    {
        HashSet<Class<?>> classes = new HashSet<Class<?>>();
        classes.add(MyClass.class);
        return classes;
    }
}

Voici le contenu de web.xml

<dependency>
                <groupId>org.glassfish.jersey.containers</groupId>
                <artifactId>jersey-container-servlet</artifactId>
                <version>2.31</version>
            </dependency>
            <dependency>
                <groupId>org.glassfish.jersey.core</groupId>
                <artifactId>jersey-client</artifactId>
                <version>2.31</version>
            </dependency>
            <dependency>
                <groupId>org.eclipse</groupId>
                <artifactId>yasson</artifactId>
                <version>1.0.7</version>
            </dependency>
            <dependency>
                <groupId>org.glassfish.jersey.inject</groupId>
                <artifactId>jersey-hk2</artifactId>
                <version>2.31</version>
            </dependency>
            <dependency>
                <groupId>org.glassfish.hk2</groupId>
                <artifactId>hk2-api</artifactId>
                <version>2.6.1</version>
            </dependency>
            <dependency>
                <groupId>org.glassfish.hk2</groupId>
                <artifactId>hk2-locator</artifactId>
                <version>2.6.1</version>
            </dependency>
            <dependency>
                <groupId>org.glassfish.hk2</groupId>
                <artifactId>hk2-utils</artifactId>
                <version>2.6.1</version>
            </dependency>
            <dependency>
                <groupId>org.glassfish.jersey.media</groupId>
                <artifactId>jersey-media-sse</artifactId>
                <version>2.31</version>
            </dependency>
            <dependency>
                <groupId>org.glassfish.jersey.media</groupId>
                <artifactId>jersey-media-json-binding</artifactId>
                <version>2.31</version>
            </dependency>


0 commentaires

-1
votes

Le simple fait de changer la version du maillot dans le fichier pom.xml de <jersey.version> 3.0.0-M6 </jersey.version> à <jersey.version> 3.0.0-M1 </jersey.version> a fonctionné pour moi. Je pense que la dernière version M6 n'est pas compatible avec Java EE (eclipse). Il est préférable d'utiliser la deuxième dernière version en attendant.


0 commentaires