2013-07-02 69 views
0

试图学习Ant/Tomcat,我遇到了部署我的战争的一些困难。我在catalina,localhost或localhost_access日志中没有发现任何错误,所以我确信它只是一个配置问题。 Ant构建运行良好。部署战争。当我到localhost:8080/antDemo/hello时,我得到了一个404代码。将战争部署到tomcat配置问题

有一件事对我来说很奇怪,当我导航到tomcat/webapps/antDemo时,我只能看到HelloServlet.java文件和一个META-INF文件夹,当我期望看到一个web.xml和一个类文件夹或类似的东西。

我读过很多堆栈溢出问题(虽然感觉像一个白痴不能排序),但没有运气。

帮助会很好,但更重要的是,朝着全面的信息资源方向发展,不仅解释了如何配置这样的事情,而且为什么需要这样配置。获取为什么一直难以找到......并且是最重要的部分。

项目结构:

tomcatdemo 
|-src 
|---HelloServlet.java 
|-WebContent 
|---WEB-INF 
|------classes 
|---------HelloServlet.class 
|------web.xml 
|-build.xml 

HelloServlet.java

import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

public class HelloServlet extends HttpServlet{ 

    public void doGe(HttpServletRequest request, HttpServletResponse response) 
    throws IOException{ 
     PrintWriter out = response.getWriter(); 
     out.println("<html>"); 
     out.println("<body>"); 
     out.println("<h1>Hello Servlet Get</h1>"); 
     out.println("</body>"); 
     out.println("</html>"); 
    } 
} 

的build.xml

<?xml version="1.0" encoding="UTF-8"?> 
<project default="clean" basedir="."> 
    <property name="tomcat" value="C:\tomcat"/> 
    <property name="tomcat.deployment" value="${tomcat}/webapps"/> 
    <property name="tomcat.bin" value="${tomcat}/bin"/> 
    <property name="base" value="."/> 
    <property name="source" value="${base}/src"/> 

    <target name="clean"> 
     <delete file="${tomcat.deployment}/antDemo.war"/> 
     <antcall target="compile"/> 
    </target> 

    <target name="compile"> 
     <javac srcdir="src" destdir="${base}/WebContent/WEB-INF/classes" classpath="C:/tomcat/lib/servlet-api.jar"/> 
     <antcall target="deployTarget"/> 
    </target> 


    <target name="warTarget"> 
     <war warFile="antDemo.war" webxml="${base}/WebContent/WEB-INF/web.xml"> 
      <fileset dir="${source}"/> 
     </war> 
     <antcall target="deployTarget"/> 
    </target> 

    <target name="deployTarget"> 
     <copy file="${base}/antDemo.war" todir="${tomcat.deployment}" /> 
     <antcall target="startTomcat"/> 
    </target> 

    <target name="startTomcat"> 
     <exec executable="${tomcat.bin}/startup.bat"> 
      <env key="CATALINA_HOME" value="${tomcat}"/> 
     </exec> 
    </target> 

    <target name="stopTomcat"> 
     <exec executable="${tomcat.bin}/shutdown.bat"> 
      <env key="CATALINA_HOME" value="${tomcat}"/> 
     </exec> 
    </target> 
</project> 

的web.xml

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE web-app 
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" 
    "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd"> 

<web-app> 

    <display-name>myServletWAR, a first Web Application</display-name> 
    <description> 
    </description> 

    <servlet> 
     <servlet-name>Hello</servlet-name> 
     <servlet-class>HelloServlet</servlet-class> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>Hello</servlet-name> 
     <url-pattern>/hello</url-pattern> 
    </servlet-mapping> 

</web-app> 

编辑: 战争结构如下(和它显然是错误的)

antDemo 
|-META-INF 
|----MANIFEST.MF 
|-HelloServlet.java 
+0

请发送你的'war'结构。 – AlexR

+0

@AlexR Tomcat是怎么膨胀的?在/ tomcat/webapps/antDemo/ – Brad

+0

构建WAR文件后,其结构是什么?您可以通过从.war重命名为.zip来解压WAR。如果WAR文件没有正确创建,这可能会有所帮助。话虽如此,我会期待在服务器日志中出现错误。 –

回答

1

问题是

  <fileset dir="${source}"/> 

您应该使用

  <fileset dir="${base}/WebContent"/> 

代替(未经测试)。

+0

谢谢。这是我的问题的一部分。一般来说,我的build.xml中有很多失败。这帮助我揪出所有这些。一些额外的失败是我的编译目标是调用部署目标而不是战争目标。结果,后续的构建并没有执行战争任务,所以相同的(破碎的)战争一直在部署到tomcat(facepalm)。再次感谢 – Brad

+0

,它非常有助于在生成的工件内部查看实际发生的情况。也就是说,如果你还在努力开始,我建议你从蚂蚁切换到maven。你避免了这些问题,因为Maven比你的项目更了解你的项目。 –

+0

这是非常有益的...谢谢你。有趣的是你应该提到maven。这就是我想用的(我在过去的项目中使用过它),但我的新雇主明确表示不使用maven。哦,好:) – Brad