Problema com JAR executável e Spring

Gente,

estou exportando a minha aplicação para um JAR executável e estou obtendo o seguinte erro na hora de executá-lo:

18/01/2012 13:24:48 br.gov.exemplo.Principal main
INFO: Inicio 18/01/12 13:24
18/01/2012 13:24:48 br.gov.exemplo.Principal main
INFO: Versao 4.5 Novo Serviço
18/01/2012 13:24:48 br.gov.exemplo.Principal main
INFO: Nome do arquivo carregado : arquivo.properties
18/01/2012 13:24:48 org.springframework.context.support.AbstractApplicationConte
xt prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationCont
ext@171732b: startup date [Wed Jan 18 13:24:48 GMT-03:00 2012]; root of context
hierarchy
18/01/2012 13:24:48 org.springframework.beans.factory.xml.XmlBeanDefinitionReade
r loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.
xml]
Exception in thread "main" org.springframework.beans.factory.xml.XmlBeanDefiniti
onStoreException: Line 15 in XML document from class path resource [applicationC
ontext.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-e
lt.1: Cannot find the declaration of element 'beans'.
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadB
eanDefinitions(XmlBeanDefinitionReader.java:396)
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBea
nDefinitions(XmlBeanDefinitionReader.java:334)
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBea
nDefinitions(XmlBeanDefinitionReader.java:302)
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReade
r.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReade
r.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReade
r.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReade
r.loadBeanDefinitions(AbstractBeanDefinitionReader.java:212)
        at org.springframework.context.support.AbstractXmlApplicationContext.loa
dBeanDefinitions(AbstractXmlApplicationContext.java:126)
        at org.springframework.context.support.AbstractXmlApplicationContext.loa
dBeanDefinitions(AbstractXmlApplicationContext.java:92)
        at org.springframework.context.support.AbstractRefreshableApplicationCon
text.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130)
        at org.springframework.context.support.AbstractApplicationContext.obtain
FreshBeanFactory(AbstractApplicationContext.java:467)
        at org.springframework.context.support.AbstractApplicationContext.refres
h(AbstractApplicationContext.java:397)
        at org.springframework.context.support.ClassPathXmlApplicationContext.<i
nit>(ClassPathXmlApplicationContext.java:139)
        at org.springframework.context.support.ClassPathXmlApplicationContext.<i
nit>(ClassPathXmlApplicationContext.java:83)
        at br.gov.exemplo.Principal.main(Principal.java:57)
Caused by: org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration
 of element 'beans'.
        at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Un
known Source)
        at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
        at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
        at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
        at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unkno
wn Source)
        at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Sou
rce)
        at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unkn
own Source)
        at org.apache.xerces.impl.XMLNSDocumentScannerImpl$NSContentDispatcher.s
canRootElementHook(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContent
Dispatcher.dispatch(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Un
known Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
        at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
        at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
        at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
        at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocum
ent(DefaultDocumentLoader.java:75)
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadB
eanDefinitions(XmlBeanDefinitionReader.java:388)
        ... 14 more

O interessante é que consigo executar minha palicação normalmente através do eclipse. Esse erro só acontece com o JAR executável. Para gerá-lo eu fui em Export->Java->Runnable JAR file.

Estou utilizando o spring versão 3.0.4

Alguém poderia me dar um help? Obrigado!

O que tem nesse linha:Line 15 in XML document from class path resource [applicationContext.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'beans'.

Bom, acho que meu applicationContext.xml não está errado, mesmo porque funciona no eclipse:

applicationContext.xml


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:lang="http://www.springframework.org/schema/lang" 
	xmlns:util="http://www.springframework.org/schema/util"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:jee="http://www.springframework.org/schema/jee"
	xmlns:task="http://www.springframework.org/schema/task" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	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/lang http://www.springframework.org/schema/lang/spring-lang-3.0.xsd
       http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
       http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
       http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">
	
	<bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location" value="arquivo.properties"/>
	</bean>
	
	<task:annotation-driven />
	
	<!-- ========================= Data Source DEFINITIONS ========================= -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
		<property name="url" value="${CONEXAO}"/>
		<property name="username" value="${USER}"/>
		<property name="password" value="${PASS}"/>
		<property name="accessToUnderlyingConnectionAllowed" value="true" />
		
		<!-- Added below properties to deal with connection timeout (to db) when pollService hasnt been used for a long time -->
		<!-- Max number of connections that can remain idle in pool, without extra conns being released -->
		<property name="maxIdle" value="2" />
		<!-- Max number of active connections in the pool -->
		<property name="maxActive" value="${CONEXOES_ATIVAS_POOL}" />
		<!-- In milliseconds - wait no longer for a connection to be returned (when no conns available in pool) -->
		<property name="maxWait" value="10000" />
		<!-- Validation Query to be used to validate connections from pool -->
		<property name="validationQuery" value="select 1 from dual"/>
		<!-- Validate objects before being returned to pool (true/false) -->
		<property name="testOnBorrow" value="true" />
		<!-- Below methods are deprecated in Commons DBCP 1.3 (should be removed from here?) -->
		<property name="removeAbandoned" value="true" />
		<property name="removeAbandonedTimeout" value="30" />
		<property name="logAbandoned" value="true" /> 
	</bean>
    
    <!-- Habilita suporte a annotations para componentes -->
	<context:annotation-config />

	<!-- Pacote base para scanear componentes anotados -->
	<context:component-scan base-package="br.gov.exemplo" />
	
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>
	
	<tx:annotation-driven transaction-manager="transactionManager" />
	
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" scope="prototype">
		<constructor-arg ref="dataSource" />
	</bean>
    
	<bean id="simpleJdbcCall" class="org.springframework.jdbc.core.simple.SimpleJdbcCall" scope="prototype">
		<constructor-arg ref="dataSource" />
	</bean>
	
	<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl" scope="prototype">
		<property name="host" value="${servidor_email_host}" />
		<property name="port" value="${servidor_email_smtp_por}" />
		<property name="defaultEncoding" value="${servidor_email_mime_charset}" />
	</bean>
	
</beans>

:roll:

O problema parece ser aqui:http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
Tira essa linha e mais a linha:xmlns:jee="http://www.springframework.org/schema/jee"

E testa sem elas.

Bom, eu já havia retirado, mas o erro sempre ocorre, agora com a linha a cima. Já tirei todas deixando apenas o xsd do beans, mas não rola. :cry:

Pelo que vi aqui, parece que não está localizando os XSDs do Spring a começar pelo beans (http://www.springframework.org/schema/beans/spring-beans-3.0.xsd).
Do eclipse a aplicação executa ok, mas do jar tem esse problema. Ainda não sei como resolver. :?

[quote=novato25]Pelo que vi aqui, parece que não está localizando os XSDs do Spring a começar pelo beans (http://www.springframework.org/schema/beans/spring-beans-3.0.xsd).
Do eclipse a aplicação executa ok, mas do jar tem esse problema. Ainda não sei como resolver. :? [/quote]
É… Pode ser.

Carinha, uma pergunta: você está exportando o jar e daí está executando o jar dentro do mesmo ambiente e sistema operacional, ou está executando ele em outro lugar?

Já tive um problema, há muuuuuuuito tempo atrás, que estou puxando da memória, que o jasper reports não estava renderizando um relatório no servidor web, porque o servidor tinha problemas de permissão, e tinha mais uns problemas de configuração, que não me lembro… O problema é que o servidor tentava acessar a URL do XSD externa explicitamente e havia um bloqueio do firewall…

Uma possibilidade horrorível é ao invés de usar o XSD original, é colocar uma cópia dele em algum lugar que seja acessível ao servidor em questão e mudar a URL do XSD para este novo local.

http://stackoverflow.com/questions/1729307/spring-schemalocation-fails-when-there-is-no-internet-connection

abmpicoli,

o JAR é executado na mesma máquina que está o eclipse. Inclusive tenho um projeto MAVEN com as mesma configurações do Spring e o JAR que ele gera executa normalmente. Não sei qual a mágica que o MAVEN faz. O problema é que estou mexendo num sistema legado que não é um projeto MAVEN e estou atualizando a versão do Spring que estava ainda na versão 1. Removi a lib da versão antiga do Spring e coloquei as libs da versão nova (3.0.4). Preciso desta atualização porque preciso implementar uma funcionalidade nova e a versão nova do Spring me ajudaria muito (envio de e-mail e agendamento de tarefas). A nível de teste, criei um projeto apenas carregando o contexto do Spring e o erro é o mesmo. Funciona no eclipse, porém, quando exportado para um jar executável, não funciona.

Fabiofalci,

Eu já havia visto esta solução. Mas verificando os arquivos spring.handlers e spring.schemas dentro do JAR, acredito que não haja nenhum problema na configuração. Veja:

spring.schemas

http\://www.springframework.org/schema/context/spring-context-2.5.xsd=org/springframework/context/config/spring-context-2.5.xsd
http\://www.springframework.org/schema/context/spring-context-3.0.xsd=org/springframework/context/config/spring-context-3.0.xsd
http\://www.springframework.org/schema/context/spring-context.xsd=org/springframework/context/config/spring-context-3.0.xsd
http\://www.springframework.org/schema/jee/spring-jee-2.0.xsd=org/springframework/ejb/config/spring-jee-2.0.xsd
http\://www.springframework.org/schema/jee/spring-jee-2.5.xsd=org/springframework/ejb/config/spring-jee-2.5.xsd
http\://www.springframework.org/schema/jee/spring-jee-3.0.xsd=org/springframework/ejb/config/spring-jee-3.0.xsd
http\://www.springframework.org/schema/jee/spring-jee.xsd=org/springframework/ejb/config/spring-jee-3.0.xsd
http\://www.springframework.org/schema/lang/spring-lang-2.0.xsd=org/springframework/scripting/config/spring-lang-2.0.xsd
http\://www.springframework.org/schema/lang/spring-lang-2.5.xsd=org/springframework/scripting/config/spring-lang-2.5.xsd
http\://www.springframework.org/schema/lang/spring-lang-3.0.xsd=org/springframework/scripting/config/spring-lang-3.0.xsd
http\://www.springframework.org/schema/lang/spring-lang.xsd=org/springframework/scripting/config/spring-lang-3.0.xsd
http\://www.springframework.org/schema/task/spring-task-3.0.xsd=org/springframework/scheduling/config/spring-task-3.0.xsd
http\://www.springframework.org/schema/task/spring-task.xsd=org/springframework/scheduling/config/spring-task-3.0.xsd

spring.handlers

http\://www.springframework.org/schema/context=org.springframework.context.config.ContextNamespaceHandler
http\://www.springframework.org/schema/jee=org.springframework.ejb.config.JeeNamespaceHandler
http\://www.springframework.org/schema/lang=org.springframework.scripting.config.LangNamespaceHandler
http\://www.springframework.org/schema/task=org.springframework.scheduling.config.TaskNamespaceHandler

Estou quase desistindo de atualizar a versão do Spring e procurar outra solução para o que vou fazer no sistema. :cry:

Agradeço a colaboração de todos. Obrigado!

Dá uma olhada na seguinte coisa, carinha.

  1. Repare que o que o carinha está reclamando no código, não é a falta do XSD, mas sim de que o XML que ele está buscando não é válido: Ele não encontra no XML a declaração do elemento “beans”. Só me caiu a ficha agora.

Faz muuuuuuito tempo que mexi com o spring, pra te ajudar melhor nisso. Ele está procurando a definição de beans no XML e não está achando. Será que não está faltando uma configuração do bixo pra ele procurar o xml dentro do jar?

  1. Será que por algum milagre de classpath você está rodando o spring 1 com o spring3 juntos no eclipse, mas quando empacota só fica o 3 e daí o bixo começa a reclamar de alguma incompatibilidade entre o spring 1 e o spring 3?

Bom, sobre o problema, encontrei este post: http://stackoverflow.com/questions/5049374/build-spring-roo-export-maven-project-with-eclipse-export-runnable-jar-file

Resolvi meu problema retirando as anotações do spring do meu código e configurei tudo via xml mesmo, pois percebi que o problema acontecia quando eu utilizava o elemento ‘scan’ do context.

<context:component-scan base-package="xxxxxx" />

removi este elemento e funcionou! Obrigado a todos pela colaboração. Se alguém encontrar uma solução, posta aí. Obrigado!!

Sério? Que estranho isso.