Problema com JAR executável e Spring

12 respostas
novato25

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!

12 Respostas

romarcio

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'.

novato25

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:

romarcio

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.

novato25

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:

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. :?

romarcio

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. :?

É… Pode ser.

A

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.

fabiofalci

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

novato25

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!

A

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?
novato25

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!!

romarcio

Sério? Que estranho isso.

Criado 18 de janeiro de 2012
Ultima resposta 19 de jan. de 2012
Respostas 12
Participantes 4