JSF 2 + Spring 3 + Hibernate + Maven 3 == Maven Fail

E ai galera, blz!?

De todas as tecs citadas no tópico estou usando a última release estável de todas.
Criei um projeto do zero, eu um pc novo.
Instalação do Java, Jdk, variáveis de ambiente, tudo ok.
Instalação do m2e no eclipse, Ok!
Escrevi o pom com todas as dependências, ajustei os arquivos: web.xml, faces-config.xml, applicationContext.xml e o persistence.xml.
Criei beans e managed beans básicos, apenas para testar o fluxo do sisteminha…
A aplicação está ok, sem erros ou warnings.
Clean e Install no Maven, ok!
Na hora de subir a aplicação no meu tomcat (7, add ao eclipse) acontece o seguinte erro:

Advertência: [SetContextPropertiesRule]{Context} Setting property 'source' to 'org.eclipse.jst.jee.server:Projeto' did not find a matching property. Jan 23, 2013 9:35:59 AM org.apache.catalina.core.StandardContext listenerStart Grave: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener java.lang.NoClassDefFoundError: javax/servlet/ServletContextListener at java.lang.ClassLoader.findBootstrapClass(Native Method) ...

Eu pesquisei muito galera!
Quase um dia inteiro e não consegui resolver essa joça…
Quais dúvidas/questões levantei após pesquisar:

  • As dependências do Maven não estão subindo junto com a aplicação e consequentemente elas não são encontradas no diretório da aplicação dentro do Tomcat…?
  • Instalando Maven através do plugin (m2e) eu sou obrigado a instalar o maven (.zip) na máquina? Se não: Devo criar a variável de ambiente M2_HOME? Se sim: Apontar para qual diretório?
  • Criando um novo projeto através do Maven(m2e) ele não cria o settings.xml (User Settings), eu acredito que devo criá-lo manualmente, mas qual o conteúdo desse arquivo? Encontrei muitos exemplos mas apenas de seu “esqueleto”, qual deve ser o conteúdo básico desse arquivo? Eu o criei, mas ele não tem valores no momento…
  • Devo copiar todos os jars baixados pelo Maven no diretório lib do Tomcat? (Estou usando uma instância dentro do eclipse, no caso ele usa as libs do próprio m2, correto?)

Entendo que o erro diz qual o problema por si só, mas acredito ter feito todas as configurações necessárias para que ele não deixasse de encontrar nada… Mas pelo visto, falta algo!
Espero que possam me ajudar…

Conteúdo dos arquivos:

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 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_3_0.xsd"
	id="WebApp_ID">
	<display-name>Projeto</display-name>
	<!-- Configuracao do Spring -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/applicationContext.xml</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<!-- Configuracao DO JSF -->	
	<servlet>
		<servlet-name>Faces Servlet</servlet-name>
		<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>*.jsf</url-pattern>
		<url-pattern>/faces/*</url-pattern>
	</servlet-mapping>
	<welcome-file-list>
		<welcome-file>index.xhtml</welcome-file>
	</welcome-file-list>
</web-app>

faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    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-facesconfig_2_0.xsd"
    version="2.0">

	<application>
		<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
	</application>

</faces-config>

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

	<!-- Anotações usadas pelo Spring -->
	<context:annotation-config />
	<!-- Beans anotados -->
	<context:component-scan base-package="br.com.projeto.service,br.com.projeto.dao" />
	
	<!-- Transações com annotations -->
	<tx:annotation-driven />
	<!-- Configuracao do Banco de Dados -->
	<bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://localhost:3306/projetodb" />
		<property name="username" value="root" />
		<property name="password" value="admin" />
	</bean>
	<!-- Configuracao do Hibernate -->
	<bean id="entityManagerFactory"
		class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="persistenceUnitName" value="projetodb" />
		<property name="dataSource" ref="dataSource" />
		<property name="jpaVendorAdapter">
			<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
				<property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect" />
				<property name="showSql" value="true" /> 
			</bean>
		</property>
	</bean>
	<!-- Gerente de transacoes do Spring -->
	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory" />
	</bean>
</beans>

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence:persistence version="2.0" 
	xmlns:persistence="http://java.sun.com/xml/ns/persistence" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
	http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd ">

	<persistence:persistence-unit name="projetodb"/>
	
</persistence:persistence>

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>br.com.projeto</groupId>
  <artifactId>Projeto</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>Projeto Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <properties>
    <org.springframework.version>3.0.6.RELEASE</org.springframework.version>
  </properties>
  <dependencies>
  ...
  </dependencies>
  <build>
    <finalName>Projeto</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-pmd-plugin</artifactId>
            <version>3.0</version>
            <configuration>
                <targetJdk>1.6</targetJdk>
            </configuration>
        </plugin>
    </plugins>
  </build>
</project>

settings.xml

<settings xmlns="http://maven.apache.org/SETTINGS/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd">
  <localRepository/>
  <interactiveMode/>
  <usePluginRegistry/>
  <offline/>

  
</settings>

Abraços!

Jarvis, já tentou iniciar o projeto através do maven? mvn tomcat:run Tenta aí para ver se funciona.

Nesse caso não é o tomcat 7, mas se for o caso, basta instalar o plugin

Executei o comando e tive essa resposta:

[INFO] Running war on http://localhost:8080/Projeto
[INFO] Creating Tomcat server configuration at D:\Desenvolvimento\workspaces\Projeto
\target\tomcat
Jan 23, 2013 1:53:42 PM org.apache.catalina.startup.Embedded start
Informaþ§es: Starting tomcat server
Jan 23, 2013 1:53:43 PM org.apache.catalina.core.StandardEngine start
Informaþ§es: Starting Servlet Engine: Apache Tomcat/6.0.29
Jan 23, 2013 1:53:43 PM org.apache.catalina.core.ApplicationContext log
Informaþ§es: Marking servlet Faces Servlet as unavailable
Jan 23, 2013 1:53:43 PM org.apache.catalina.core.StandardContext loadOnStartup
Grave: Servlet /Projeto threw load() exception
java.lang.ClassCastException: javax.faces.webapp.FacesServlet cannot be cast to
javax.servlet.Servlet
        at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1116)
        at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:993)
        at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4350)
        at org.apache.catalina.core.StandardContext.start(StandardContext.java:4659)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
        at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
        at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)
        at org.apache.catalina.startup.Embedded.start(Embedded.java:825)
        at org.codehaus.mojo.tomcat.AbstractRunMojo.startContainer(AbstractRunMojo.java:558)
        at org.codehaus.mojo.tomcat.AbstractRunMojo.execute(AbstractRunMojo.java:255)
        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
        at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
        at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320)
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
        at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537)
        at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196)
        at org.apache.maven.cli.MavenCli.main(MavenCli.java:141)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230)
        at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)
        at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)
Jan 23, 2013 1:53:43 PM org.apache.coyote.http11.Http11Protocol init
Informaþ§es: Initializing Coyote HTTP/1.1 on http-8080
Jan 23, 2013 1:53:43 PM org.apache.coyote.http11.Http11Protocol start
Informaþ§es: Starting Coyote HTTP/1.1 on http-8080

sobre o restante, senão for o tomcat 7 que plugin eu tenho que instalar você diz?

vou te dar de presente a resposta ehehehhe

o erro acontece pq não possui a bibliotecas do servlet 2.5 ou 3.0… no pom do projeto…

<dependency> <groupId>servletapi</groupId> <artifactId>servlet-api</artifactId> <version>2.4</version> </dependency>

como vc esta usando o tomcat ele lhe prove a biblioteca… mas o maven não enxerga logo, vc tem que por no pom.xml

verifica a ultima versao desse jar e adiciona no projeto…

Na verdade você não deve incluir essa lib no projeto, precisa indicar no pom que ela será fornecida pelo ambiente:

<dependency> <groupId>servletapi</groupId> <artifactId>servlet-api</artifactId> <version>2.4</version> <scope>provided</scope> </dependency>

[quote=von.juliano]Na verdade você não deve incluir essa lib no projeto, precisa indicar no pom que ela será fornecida pelo ambiente:

<dependency> <groupId>servletapi</groupId> <artifactId>servlet-api</artifactId> <version>2.4</version> <scope>provided</scope> </dependency>[/quote]

foi o que disse…lol

Achei que faltou colocar a tag

<scope>provided</scope>E explicar o que ela faz :smiley:

verdade, do jeito que postei esta com o default (compile) ele se propaga por todo projeto esta correto com provided xD

desculpa não tinha reparado que dizia do scoped, interpretei de forma errada!