我有一个非常简单的java Web应用程序,我使用maven进行构建过程并尝试在Tomcat上部署它。
我使用的是tomcat 7.0.5332,maven 2.2.1版。
这是我非常简单的网络应用程序:
的pom.xml:
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tugay.anotherwebapp</groupId>
<artifactId>another-webapp</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>another-webapp Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
</dependency>
</dependencies>
<build>
<finalName>another-webapp</finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
这是我的web.xml:
<web-app 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_3_0.xsd"
version="3.0">
<servlet>
<servlet-name>MyServletName</servlet-name>
<servlet-class>MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServletName</servlet-name>
<url-pattern>/index.html</url-pattern>
</servlet-mapping>
</web-app>
和MyServlet类:
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* User: Tugay
* Date: 4/5/14
* Time: 9:14 PM
*/
public class MyServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) throws IOException {
System.out.println("Hello World!");
}
}
所以
mvn clean install
工作正常并产生战争。但是当部署在Tomcat上时,我得到了这个:
- jar not loaded. See Servlet Spec 3.0, section 10.7.2. Offending class: /javax/servlet/Servlet.class
我做错了什么?
答案 0 :(得分:2)
我认为您应该将此依赖关系设置为:
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
因为它已经存在于tomcat共享类加载器
中答案 1 :(得分:0)
这很正常。 Servlet容器提供自己的servlet-api实现类。所以战争中包含的类(来自javaee-api
)与tomcat提供的类冲突。
要避免这种情况,请将javaee-api
依赖关系的范围设置为provided
。
这样,依赖项提供的类将在编译时可见,但jar本身不会包含在生成的战争中。
答案 2 :(得分:0)
如果你看一下Servlet规范3.0,第10.7.2节 - 你会发现问题似乎是你正在尝试加载容器已经提供的Servlet类(Tomcat)。请检查servlet-api是否在你的战争中(它不应该是)并使用javaee-api提供的范围。