toples tidak dimuat. Lihat Servlet Spec 2.3, bagian 9.7.2. Kelas yang menyinggung: javax / servlet / Servlet.class

100

Saya menjalankan proyek Maven yang juga merupakan proyek web dinamis. Saya telah menggunakan semua perpustakaan Spring di Maven. Saya membuatnya web.xml, tetapi ketika saya memulai server Tomcat 7 saya, saya mendapatkan pesan berikut:

INFO: validateJarFile(C:\Users\mibvzd0\workspace\.metadata\.plugins\
org.eclipse.wst.server.core\tmp2\wtpwebapps\hapi_hl7\WEB-INF\lib\
servlet-api-2.4.jar) - jar not loaded.
See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class

Saya mencoba menghapus servlet dari webapp/lib, tetapi tidak berhasil. Beri tahu saya apa yang harus dilakukan dalam kasus saya.

dreambigcoder.dll
sumber
Perhatikan bahwa perilaku ini sesuai dengan spesifikasi servlet. Pemahaman penuh sangat membantu dalam memahami masalah yang lebih rumit yang mungkin Anda hadapi.
Thorbjørn Ravn Andersen

Jawaban:

113

File servlet API .jar tidak boleh disematkan di dalam webapp karena, jelas, kontainer sudah memiliki kelas-kelas ini di jalur kelasnya: ia mengimplementasikan antarmuka yang terdapat dalam jar ini.

Dependensi harus berada dalam providedcakupan, bukan compilecakupan default , di pom Maven Anda:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>
JB Nizet
sumber
"Dependensi harus dalam cakupan yang disediakan, bukan cakupan kompilasi default, di pom Maven Anda." Bagaimana saya bisa melakukannya
dreambigcoder
Lihat jawaban saya yang diedit. bersihkan dan bangun aplikasi menggunakan Maven, dan periksa apakah jar servlet tidak ada di direktori WEB-INF / lib di webapp yang dihasilkan.
JB Nizet
Saya melakukan segalanya. namun saya menemukan toples di direktori WEB-INF / lib. Jika saya melepas jar, saya mendapatkan pesan di bawah ini INFO: Memulai Servlet Engine: Apache Tomcat / 7.0.12 Apakah ada yang perlu saya lakukan?
dreambigcoder
6
Mungkin Anda memiliki ketergantungan yang memiliki ketergantungan transitif ke versi jar servlet lain. Gunakan mvn dependency: tree untuk menemukan dari mana jar servlet ini berasal, dan tambahkan sebuah pengecualian.
JB Nizet
bagaimana saya melakukan hal yang sama untuk ivy?
Dinesh Babu KG
21

Anda mendapatkan pesan peringatan ini ketika file jar servlet api telah dimuat dalam wadah dan Anda mencoba memuatnya sekali lagi dari libdirektori.

Spesifikasi Servlet mengatakan Anda tidak diizinkan memiliki servlet.jar di libdirektori webapps Anda .

  • Singkirkan pesan peringatan hanya dengan menghapus servlet.jardari libdirektori Anda .
  • Jika Anda tidak menemukan jar di libdirektori, pindai jalur build Anda dan hapus jar.

C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\project\WEB-INF\lib

Jika Anda menjalankan proyek maven, ubah javax.servlet-apidependensi menjadi cakupan provideddi Anda pom.xml karena container sudah menyediakan jar servlet itu sendiri.

Beruntung
sumber
4

Untuk memperbaikinya, setel cakupan ke disediakan . Ini memberitahu Maven menggunakan kode servlet-api.jar untuk kompilasi dan pengujian saja, tapi TIDAK memasukkannya ke dalam file WAR. Container yang di-deploy akan "menyediakan" servlet-api.jar pada saat runtime.

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
</dependency>
Sandeep Kumar
sumber
2

Anda mungkin menemukan baris perintah windows berikut berguna dalam melacak file jar yang menyinggung. itu membuat indeks dari semua file kelas di semua toples di folder. Jalankan dari dalam folder lib aplikasi yang Anda terapkan, lalu cari kelas yang melanggar di file index.txt.

for /r %X in (*.jar) do (echo %X & jar -tf %X) >> index.txt
Chris Nava
sumber
2

Lingkup Ketergantungan Maven

disediakan : Ini jauh seperti kompilasi, tetapi menunjukkan Anda mengharapkan yang JDK atau wadah untuk memberikan ketergantungan pada saat runtime. Misalnya, saat membuat aplikasi web untuk Java Enterprise Edition, Anda akan menyetel ketergantungan pada Servlet API dan Java EE API terkait ke cakupan yang disediakan karena wadah web menyediakan kelas tersebut . Cakupan ini hanya tersedia pada kompilasi dan pengujian classpath, dan tidak transitif.

yuceel
sumber
1

Saya telah berjuang dengan masalah ini dan saya telah mencoba berbagai "solusi".

Namun, pada akhirnya, satu-satunya yang berfungsi dan sebenarnya membutuhkan beberapa detik untuk melakukannya adalah: menghapus dan menambahkan kembali instance server baru !

Pada dasarnya, saya mengklik kanan pada server Tomcat saya di Eclipse di bawah Server dan menghapusnya. Selanjutnya, saya telah menambahkan server Tomcat baru. Membersihkan dan menerapkan ulang aplikasi dan saya menyingkirkan kesalahan ini.

iaforek
sumber
Klik kanan pada server Anda -> Bersihkan ... dan sekali lagi klik kanan pada server Anda -> direktori kerja kucing jantan bersih memperbaikinya untuk saya
kiltek
0

Periksa Di Dalam Direktori Berikut untuk file jar el-api.jar: C: \ apache-tomcat-7.0.39 \ lib \ el-api.jar jika ada, maka di direktori ini aplikasi web Anda WEB-INF \ lib \ el-api.jar toples itu harus dibuang

Fred Ondieki
sumber
0

ketika pola URL Anda salah, kesalahan ini mungkin terjadi.

misalnya. Jika Anda menulis @WebServlet ("login"), kesalahan ini akan ditampilkan. Yang benar adalah @WebServlet ("/ login").

Phyo Thinza
sumber
0

Pengecualian dan providedketergantungan tidak akan berfungsi dalam proyek anak.

Jika Anda menggunakan warisan dalam proyek Maven, Anda harus menyertakan konfigurasi ini pada pom.xmlfile induk . Anda akan memiliki <parent>...</parent>bagian di pom.xml Anda jika Anda menggunakan warisan . Jadi Anda akan memiliki sesuatu seperti ini pada orang tua Anda pom.xml:

<groupId>some.groupId</groupId>
<version>1.0</version>
<artifactId>someArtifactId</artifactId>
<packaging>pom</packaging>
<modules>
    <module>child-module-1</module>
    <module>child-module-2</module>
</modules>
<dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.1</version>
        <scope>provided</scope>
    </dependency>
</dependencies>
lmiguelmh
sumber
0

Pustaka ketergantungan JAX-WS "jaxws-rt.jar" tidak ada.

Buka di sini http://jax-ws.java.net/ . Unduh distribusi JAX-WS RI. Unzip dan salin “jaxws-rt.jar” ke folder library Tomcat “{$ TOMCAT} / lib“. Mulai ulang Tomcat.

Faiz
sumber
0

Biasanya ketika Anda melihat pesan ini, itu tidak berbahaya. Jika tertulis

INFO: validateJarFile(/<webapp>/WEB-INF/lib/servlet-api-2.5.jar) - jar not loaded. 
See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class

Itu berarti ia mengabaikan servlet-api-2.5.jar Anda karena tomcat sudah memiliki versi bawaan dari jar itu, jadi tidak akan menggunakan milik Anda. Biasanya ini tidak menimbulkan masalah.

Namun jika dikatakan WEB-INF/lib/my_jar.jar - jar not loaded...Offending class: javax/servlet/Servlet.class

lalu apa yang dapat Anda lakukan (dalam contoh saya, ini adalah toples berbayang) dijalankan

Ketergantungan $ mvn: tree

dan temukan bahwa Anda memiliki ketergantungan transitif pada "sesuatu" yang bergantung pada stoples yang berupa servlet-api atau sejenisnya (misal:) tomcat-servlet-api-9.0.0. Jadi tambahkan pengecualian untuk itu ke pom Anda, misalnya: (dalam kasus saya, tomcat, dalam kasus Anda, mungkin yang disebutkan dalam jawaban lain):

 <dependency>
    ...
    <exclusions>
      <exclusion>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-servlet</artifactId>
      </exclusion>
    </exclusions> 
</dependency>
rogerdpack
sumber
-4

Hapus servlet.jardari web-inf/libfolder sumber karena tersedia di libfolder kucing jantan maka itu berfungsi dengan baik

Suresh Bkonda
sumber
1
Jawaban ini tidak menambahkan apa pun yang belum ada dalam jawaban ini .
Glorfindel