[RESOLVIDO]ANT Deploy

7 respostas
EmerXavier

Bom dia, amigos!

Tenho uma aplicação com Struts² e Hibernate e estou fazendo o build pelo ANT.

build.xml

<project name="sgp" basedir="." default="deploy-local">  
          
        <property file="build.properties" />  
        <property name="web.dir" value="WebContent" />  
        <property name="src.dir" value="src" />  
        <property name="project.name" value="sgp" />  
        <property name="dist.dir" value="dist" />  
        <property name="build.classes.dir" value="${web.dir}" />        
          
            <!-- define o classpath do projeto, usa os .jars presentes no Tomcat -->  
        <path id="master-classpath">  
            <fileset dir="${web.dir}/WEB-INF/lib">  
                <include name="**/*.jar" />  
            </fileset>  
            <fileset dir="${tomcat.home}/lib">  
                <include name="servlet*.jar"/>  
                <include name="jsp-api.jar"/>           
                <include name="mail.jar"/>              
                <include name="activation.jar"/>                        
            </fileset>          
            <pathelement path="${build.classes.dir}"/>  
        </path>         
      
            <!-- compila -->    
            <target name="build">  
            <echo>Compilando...</echo>  
            <javac destdir="${build.classes.dir}" debug="true"  
                   deprecation="false" optimize="false">  
                   <src path="${src.dir}"/>  
                   <classpath refid="master-classpath"/>  
            </javac>  
        </target>  
          
            <!-- gera o .war e copia para a pasta dist do projeto -->  
        <target name="create-war" depends="build">  
            <echo>Gerando war ...</echo>  
            <mkdir dir="${dist.dir}" />         
            <war destfile="${dist.dir}/${project.name}.war" webxml="${web.dir}/WEB-INF/web.xml">  
                <fileset dir="${web.dir}">  
                    <include name="**/*.*"/>
                    <exclude name="**/*web.xml"/>               
                </fileset>
                <fileset dir="${src.dir}">  
                    <include name="**/*.xml"/>
                	<include name="**/*.properties"/>
                </fileset>  
            </war>  
        </target>  
          
            <!-- apenas copia o .war para o webapps do tomcat, precisa estar com auto-deploy para funcionar  
            caso contr�rio precisa de uma outra task para reiniciar o projeto, n�o precisa reiniciar o servidor -->  
        <target name="deploy-local" depends="create-war">  
            <echo>Fazendo o deploy no tomcat ...</echo>  
            <copy file="${dist.dir}/${project.name}.war" todir="${tomcat.home}/webapps" />  
        </target>  
              
            <!-- remove a pasta dist e outras que precisar -->  
        <target name="clean">  
            <echo>Removendo diret�rios n�o usados ...</echo>  
            <delete dir="${dist.dir}" />  
        </target>   
          
    </project>

O meu arquivo .war é gerado e eu utilizo-o para fazer o deploy na mão no TomCat7.

Ele levanta a aplicação mas quando eu tento acessá-la acarreta no seguinte erro:

http://localhost:8080/sgp/Login_input.action

HTTP Status 404 - There is no Action mapped for namespace / and action name Login_input.

type Status report

message There is no Action mapped for namespace / and action name Login_input.

description The requested resource (There is no Action mapped for namespace / and action name Login_input.) is not available.

O arquivo .war pode ter sido gerado errado??

Alguém pode ajudar??

[]'s

7 Respostas

zanata

Olá.

O problema está em alguma configuração do seu struts.xml (ou outro nome de arquivo xml que tenha sido utilizado no seu app). Teria como enviar uma cópia desse texto aqui no forum pra gente analisar?

É preciso que haja algo semelhante ao trecho abaixo nesse seu “struts.xml”:

<package name="minhaAppWeb" namespace="/" extends="struts-default">
    	

    	<action name="Login_input" class="minhaPackage.MinhaClasseAction" >
        ...

Verifique também se o nome da Action utilizada está de acordo com o que foi escrito no struts.xml (case sensitive), etc.

[]s

EmerXavier

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="false" />

    <package name="default" namespace="/" extends="struts-default">

       <default-action-ref name="home" />

        <global-results>
            <result name="error">/error.jsp</result>
        </global-results>

        <global-exception-mappings>
            <exception-mapping exception="java.lang.Exception" result="error"/>
        </global-exception-mappings>  


		<!-- Action default -->
		<action name="Home">
			<result>/WEB-INF/jsp/login.jsp</result>
		</action>
		
		<!-- Actions -->
		<action name="Login_*" class="br.com.sgp.login.action.LoginAction" method="{1}">
			<result name="input">/WEB-INF/jsp/login.jsp</result>
			<result name="error">/WEB-INF/jsp/login.jsp</result>
			<result name="success">/WEB-INF/jsp/protected/index.jsp</result>
		</action>
				
    </package>

    <include file="example.xml"/>

    <!-- Add packages here -->

</struts>

Na index faço o padrão:

<% response.sendRedirect("Login_input.action"); %>
zanata

Oi Emerson.

Eu não tenho o hábito de usar wildcards, mas vamos lá, tomara que eu consiga te dizer algo que preste:

Analisando o trecho abaixo do seu struts.xml:

<!-- Actions -->
		<action name="Login_*" class="br.com.sgp.login.action.LoginAction" method="{1}">
			<result name="input">/WEB-INF/jsp/login.jsp</result>
			<result name="error">/WEB-INF/jsp/login.jsp</result>
			<result name="success">/WEB-INF/jsp/protected/index.jsp</result>
		</action>

Tendo isso como base, a sua chamada a URL "http://localhost:8080/sgp/Login_input.action " seria interpretada como o seguinte (isso em tempo de execução):

<!-- Actions -->
		<action name="Login_input" class="br.com.sgp.login.action.LoginAction" method="input">
			<result name="input">/WEB-INF/jsp/login.jsp</result>
			<result name="error">/WEB-INF/jsp/login.jsp</result>
			<result name="success">/WEB-INF/jsp/protected/index.jsp</result>
		</action>

Esse trecho quer dizer que será chamado o método “doInput()” o objeto da classe “LoginAction” que pertence a package “br.com.sgp.login.action”

algo como:

package br.com.sgp.login.action;

public class LoginAction {
	
	public String doInput() {
		return "success";
	}

}

Acredito que você tenha feito isso corretamente.

Devido ao erro que você encaminhou, acreditei que a falha estivesse no seu struts.xml, mas na verdade o que está acontecendo é que o arquivo “struts.xml” não está sendo empacotado junto com a aplicação que está sendo implantada no seu Tomcat.

Eu fiz o teste aqui e obtive o mesmo erro.

Vou simular o que foi feito com o seu “build.xml” e já te dou um retorno.

zanata

Emerson.

O problema é esse mesmo.

O seu build está fazendo com que, ao gerar o arquivo sgp.war, as suas classes e o arquivo struts.xml fiquem diretamente no subdiretório “WEB-INF” da app. O correto é que esses arquivos sejam inseridos no subdiretório “WEB-INF/classes”.

Consegue fazer a alteração no build.xml para que isso seja corrigido? É simples, mas se precisar de alguma ajuda avisa.

Enrolei, enrolei e a solução era simples. Desculpe-me.

[]s

PS: Se puder, publique a alteração que fez para que o pessoal ver como ficou. Ok? Sempre aparece alguém que está aprendendo ou com dúvidas que pode se beneficiar disso.

EmerXavier

Que isso, cara! Brigadão!

Mas ainda to enrolado aqui!

É apenas o struts.xml que tem que estar em WEB-INF/classes ???

Pois estou tentando enviar todos os meus arquivos .xml e .properties lá pra dentro e não consigo!

Ainda sou leigo nas funcionalidades do ant.

EmerXavier

Consegui, irmão!

<project name="sgp" basedir="." default="deploy-local">  
  
	<property file="build.properties" /> 
	<property name="src.dir" value="src" />
	<property name="dist.dir" value="dist" />   
	   
	<path id="master-classpath">  
	    <fileset dir="${web.dir}/WEB-INF/lib">  
	        <include name="**/*.jar" />  
	    </fileset>  
	    <fileset dir="${tomcat.home}/lib">  
	        <include name="servlet*.jar"/>  
	        <include name="jsp-api.jar"/>           
	        <include name="mail.jar"/>              
	        <include name="activation.jar"/>                        
	    </fileset>          
	    <pathelement path="${build.classes.dir}"/>  
	</path>         
	    
	<target name="build">  
	    <echo>Compilando...</echo>  
	    <mkdir dir="${build.classes.dir}" />
	    <javac destdir="${build.classes.dir}" debug="true"  
	           deprecation="false" optimize="false">  
	           <src path="${src.dir}"/>  
	           <classpath refid="master-classpath"/>  
	    </javac> 
	    <echo>Compilado para ${build.classes.dir}</echo>
	    <copy todir="${build.classes.dir}">  
	        <fileset dir="${src.dir}">  
	            <include name="**/*.xml"/>
	        	<include name="**/*.properties"/>
	        </fileset>
	    </copy>
	</target>
	  
	    <!-- gera o .war e copia para a pasta dist do projeto -->  
	<target name="create-war" depends="build">  
	    <echo>Gerando war ...</echo>  
	    <mkdir dir="${dist.dir}" />         
	    <war destfile="${dist.dir}/${project.name}.war" webxml="${web.dir}/WEB-INF/web.xml">  
	        <fileset dir="${web.dir}">  
	            <include name="**/*.*"/>
	            <exclude name="**/*web.xml"/>               
	        </fileset>  
	    </war>  
	</target>  
	
	
	<target name="deploy-local" depends="create-war">  
	    <echo>Fazendo o deploy no tomcat ...</echo>  
	    <copy file="${dist.dir}/${project.name}.war" todir="${tomcat.home}/webapps" />  
	</target>  
	      
	<target name="clean">  
	    <echo>Removendo diret�rios n�o usados ...</echo>  
	    <delete dir="${dist.dir}" />  
	</target>   
</project>

Muito Obrigado pelo help!

Abraço!

zanata

Opa! Eu tinha dado uma saída com a criançada e acabei demorando pra responder.

Que bom!

[]s!

PS: Eu não sei como o pessoal faz isso, mas acho que tem que “encerrar” o tópico do Fórum. Acredito que tenha apenas que alterar o título adicionando a palavra [RESOLVIDO] no início do assunto do tópico.

Criado 19 de novembro de 2011
Ultima resposta 19 de nov. de 2011
Respostas 7
Participantes 2