【问题标题】:Simple Spring MVC Hibernate project using Maven使用 Maven 的简单 Spring MVC Hibernate 项目
【发布时间】:2012-06-02 10:28:27
【问题描述】:

我一直在努力学习这个教程:http://viralpatel.net/blogs/2010/11/spring3-mvc-hibernate-maven-tutorial-eclipse-example.html

我在使用本教程时没有遇到任何问题,但我的问题是:如何创建一个战争,以便我可以在 tomcat 中部署应用程序?

编辑:我已经能够创建战争并部署它,但现在尝试访问 localhost:8080/MavenWeb 时,我有一个 404 页面。

war 已正确构建,其名称为 MavenWeb.war,在 pom.xml 文件中的 finalName 标记中指定。

这里是tomcat部署时的日志:

May 27, 2012 9:32:14 PM org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Java\jdk1.7.0_04\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Java\jdk1.7.0_04\;C:\apache-tomcat-7.0.27\lib;C:\apache-maven-3.0.4\bin;C:\Program Files\Java\jdk1.7.0_04\\bin;C:\apache-tomcat-7.0.27\lib;.
May 27, 2012 9:32:14 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-bio-8080"]
May 27, 2012 9:32:14 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-bio-8009"]
May 27, 2012 9:32:14 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 523 ms
May 27, 2012 9:32:14 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
May 27, 2012 9:32:14 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.27
May 27, 2012 9:32:14 PM org.apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive C:\apache-tomcat-7.0.27\webapps\MavenWeb.war
May 27, 2012 9:32:15 PM org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(C:\apache-tomcat-7.0.27\webapps\MavenWeb\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
May 27, 2012 9:32:17 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory C:\apache-tomcat-7.0.27\webapps\docs
May 27, 2012 9:32:17 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory C:\apache-tomcat-7.0.27\webapps\examples
May 27, 2012 9:32:17 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory C:\apache-tomcat-7.0.27\webapps\host-manager
May 27, 2012 9:32:17 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory C:\apache-tomcat-7.0.27\webapps\manager
May 27, 2012 9:32:17 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory C:\apache-tomcat-7.0.27\webapps\ROOT
May 27, 2012 9:32:17 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
May 27, 2012 9:32:17 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
May 27, 2012 9:32:17 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 2483 ms

欢迎文件在web.xml中正确设置,我创建了对应的list.jsp并放在WEB-INF/jsp文件夹中。

这里是 POM.xml

    <?xml version="1.0" encoding="UTF-8"?><project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>Spring3HibernateMaven</groupId>
  <artifactId>Spring3HibernateMaven</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <description></description>


  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.5</source>
          <target>1.5</target>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.0</version>
      </plugin>
    </plugins>

    <directory>target</directory>
    <outputDirectory>target/classes</outputDirectory>
    <!-- <finalName>${artifactId}-${version}</finalName> -->
    <finalName>MavenWeb</finalName>
    <testOutputDirectory>target/test-classes</testOutputDirectory>
    <sourceDirectory>src/main/java</sourceDirectory>
    <scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
    <testSourceDirectory>src/test/java</testSourceDirectory>
    <resources>
      <resource>
        <directory>src/main/resources</directory>
      </resource>
    </resources>
    <testResources>
      <testResource>
        <directory>src/test/resources</directory>
      </testResource>
    </testResources>
  </build>

  <dependencies>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>${org.springframework.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${org.springframework.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${org.springframework.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${org.springframework.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-orm</artifactId>
      <version>${org.springframework.version}</version>
    </dependency>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-entitymanager</artifactId>
      <version>3.5.1-Final</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.4.2</version>
    </dependency>
    <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>1.1.2</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.1.2</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.10</version>
    </dependency>
    <dependency>
      <groupId>commons-dbcp</groupId>
      <artifactId>commons-dbcp</artifactId>
      <version>20030825.184428</version>
    </dependency>
    <dependency>
      <groupId>commons-pool</groupId>
      <artifactId>commons-pool</artifactId>
      <version>20030825.183949</version>
    </dependency>
  </dependencies>
  <properties>
    <org.springframework.version>3.0.2.RELEASE</org.springframework.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
</project>

战争已经建立,我可以将它部署到 Tomcat 中而没有任何错误,但是当尝试使用 localhost:8080/MavenWeb/ 访问它时,我只有一个白页。

第一个页面在web.xml下是这样配置的:

 <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
    <display-name>Spring3-Hibernate</display-name>
    <welcome-file-list>
        <welcome-file>list.jsp</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

所以如果我理解正确的话,在访问 localhost:8080/MavenWeb/ 时,我应该直接重定向到 list.html

【问题讨论】:

  • 您好 dukable,这是一个非常广泛的问题。如果您可以更具体地说明您已经尝试过哪些步骤,也许您的问题会更清楚?祝你好运! :)
  • 可能帮助:*.com/questions/3116605/…

标签: java spring model-view-controller tomcat maven


【解决方案1】:

对此做了以下操作

安装了Tomcat 6,因为源和目标是1.5 http://tomcat.apache.org/whichversion.html

将角色 manager-gui 添加到 tomcat-users.xml

  <role rolename="manager-gui"/>
  <user username="tomcat" password="tomcat" roles="manager-gui"/>

然后登录http://localhost:8080/manager/成功部署Hello World Servlet,遗憾的是,这对OP几乎没有用,因为与教程相关的这段代码不是完成的代码。嗯。

我建议通过this mvn tutorial from sonatype,因为这将建立 Maven 技能和知识,从而可以有效地解决第一个教程的问题。

还建议在 pom.xml 中包含对 pom XSD 的引用,以便工具可以验证与开发内容相同的内容。

来自我们拥有的 sonatype 教程 pom 文件之一

<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

然后在 IntelliJ 中,例如,我可以输入 &lt; CTRL+SPACE 并获取文件中有效元素的下拉列表。

【讨论】:

  • 我确实编辑了我的第一篇文章以解释更多。我已经能够创建战争,在 pom.xml 文件中编辑构建并毫无问题地部署它,但无法访问 URL localhost:8080/ContactManager。它给了我一个白页。
  • 我刚刚在您更新前几秒钟发布了这个答案 :) 如果没有用,我会删除这个答案。
  • 好的,最好发布一个指向完整 pom.xml 的链接,这将允许我们验证文件。
  • 我确实将它添加到我的第一篇文章以及我目前的位置(我能够部署战争,但在浏览到 localhost:8080/ContactManager 时无法访问我的应用程序
【解决方案2】:

你的战争没有正确部署。启动日志说 servlet-api.jar 没有正确加载。先解决这个问题,然后我们可以进一步诊断它。

日志是这样写的

org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(C:\apache-tomcat-7.0.27\webapps\MavenWeb\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

您的classpath 中似乎有 2 个版本的 servlet-api jar,其中一个版本引起了问题。你也在使用JDK 7。请检查您使用的 jar 与 JDK 7 的兼容性

我认为你的类路径中有 servlet.jarservlet-api-2.5.jar。删除servlet.jar,你应该可以滚动了。

【讨论】:

    【解决方案3】:
    1. 验证在 tomcat 上创建和部署的战争的名称。 很多时候,maven 会创建带有版本号的战争文件。这会影响要使用的 URL。

    2. 另外,我可能对此有误,但在 web.xml 中,URL 模式不应该是:“/*”而不仅仅是“/”

    【讨论】:

    • 我确实验证了这两点,一切似乎都很好。我还使用 *.jsp 和 *.html 添加了 2 个其他 servlet 映射
    • @dukable 当你访问:1. localhost:8080/ContactManager 2. localhost:8080/ContactManager/ 3. localhost:8080/ContactManager/list.html
    • 任何这些 URL 的空白页面。
    • 如果连这个:“localhost:8080/ContactManager/list.html”给ua空白页,那么说明tomcat某处发生异常,所以浏览器在回复。另外..您的请求是否有可能通过您安装的用于调试的代理应用程序进行?
    • 我刚刚意识到 ContactManager 是数据库的名称,尝试访问它时有一个空白页面是有意义的...战争的名称是 MavenWeb,如我的第一个在 pom.xml MavenWeb 上发布。但是,当尝试访问 localhost:8080/MavenWev 时,我只是遇到 404 错误。我将在我的第一篇文章中复制tomcat的日志。
    【解决方案4】:

    你这里有错字吗??

    在您的 web.xml 中,您已将 list.jsp 指定为欢迎文件列表。

    但是在显示 web.xml 之后,你已经写到 list.html 没有被重定向。

    希望对你有所帮助。

    干杯。

    【讨论】: