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.


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>

"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.


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>

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

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.


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.


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


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").


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>

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.


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>

-4

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


1
Jawaban ini tidak menambahkan apa pun yang belum ada dalam jawaban ini .
Glorfindel
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.