Mostrando postagens com marcador error. Mostrar todas as postagens
Mostrando postagens com marcador error. Mostrar todas as postagens

terça-feira, 26 de maio de 2009

IWAE0006E Archive is not a valid WAR File because the deployment descriptor can not be found (case sensitive): WEB-INF/web.xml

Esse é um problema que me atormentou por algumas horas até que criei coragem para procurar a solução. É um problema não muito comum mas alguns desenvolvedores já tiveram esse problema.

O problema:

Estamos no meio de um projeto (WEB) e queremos gerar um WAR através do export do Eclipse. Selecionamos a opção, o tipo da exportação (WAR), um nome e o destino onde será criado o arquivo. Click no botão Finish e surge então o nosso pesadelo (pra mim não mais), um popup (alert ou qualquer outra coisa que enche o saco). Vamos para o erro:

org.eclipse.core.runtime.CoreException: Extended Operation failure: org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentExportOperation
at org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizard.performFinish(DataModelWizard.java:182)
at org.eclipse.jface.wizard.WizardDialog.finishPressed(WizardDialog.java:680)
at org.eclipse.jface.wizard.WizardDialog.buttonPressed(WizardDialog.java:355)
at org.eclipse.jface.dialogs.Dialog$3.widgetSelected(Dialog.java:660)
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:90)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1085)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3180)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2856)
at org.eclipse.jface.window.Window.runEventLoop(Window.java:820)
at org.eclipse.jface.window.Window.open(Window.java:796)
at org.eclipse.ui.actions.ExportResourcesAction.run(ExportResourcesAction.java:180)
at org.eclipse.ui.actions.BaseSelectionListenerAction.runWithEvent(BaseSelectionListenerAction.java:168)
at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:539)
at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:488)
at org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:400)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1085)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3180)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2856)
at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:1930)
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:1894)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:422)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
at org.eclipse.ui.internal.ide.IDEApplication.run(IDEApplication.java:95)
at org.eclipse.core.internal.runtime.PlatformActivator$1.run(PlatformActivator.java:78)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:92)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:68)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:400)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:177)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.eclipse.core.launcher.Main.invokeFramework(Main.java:336)
at org.eclipse.core.launcher.Main.basicRun(Main.java:280)
at org.eclipse.core.launcher.Main.run(Main.java:977)
at org.eclipse.core.launcher.Main.main(Main.java:952)
org.eclipse.core.runtime.CoreException[0]: org.eclipse.core.commands.ExecutionException: Error exportingWar File
at org.eclipse.jst.j2ee.internal.archive.operations.J2EEArtifactExportOperation.execute(J2EEArtifactExportOperation.java:97)
at org.eclipse.wst.common.frameworks.internal.datamodel.DataModelPausibleOperationImpl$1.run(DataModelPausibleOperationImpl.java:376)
at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:1737)
at org.eclipse.wst.common.frameworks.internal.datamodel.DataModelPausibleOperationImpl.runOperation(DataModelPausibleOperationImpl.java:401)
at org.eclipse.wst.common.frameworks.internal.datamodel.DataModelPausibleOperationImpl.runOperation(DataModelPausibleOperationImpl.java:352)
at org.eclipse.wst.common.frameworks.internal.datamodel.DataModelPausibleOperationImpl.doExecute(DataModelPausibleOperationImpl.java:242)
at org.eclipse.wst.common.frameworks.internal.datamodel.DataModelPausibleOperationImpl.executeImpl(DataModelPausibleOperationImpl.java:214)
at org.eclipse.wst.common.frameworks.internal.datamodel.DataModelPausibleOperationImpl.cacheThreadAndContinue(DataModelPausibleOperationImpl.java:89)
at org.eclipse.wst.common.frameworks.internal.datamodel.DataModelPausibleOperationImpl.execute(DataModelPausibleOperationImpl.java:202)
at org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizard$1$CatchThrowableRunnableWithProgress.run(DataModelWizard.java:211)
at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:113)
Caused by: org.eclipse.jst.j2ee.commonarchivecore.internal.exception.SaveFailureException: Error opening archive for export..
at org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentExportOperation.export(WebComponentExportOperation.java:48)
at org.eclipse.jst.j2ee.internal.archive.operations.J2EEArtifactExportOperation.execute(J2EEArtifactExportOperation.java:89)
... 10 more
Caused by: org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException: IWAE0006E Archive is not a valid WAR File because the deployment descriptor can not be found (case sensitive): WEB-INF/web.xml
at org.eclipse.jst.j2ee.commonarchivecore.internal.impl.CommonarchiveFactoryImpl.openSpecificArchive(CommonarchiveFactoryImpl.java:805)
at org.eclipse.jst.j2ee.commonarchivecore.internal.impl.CommonarchiveFactoryImpl.openWARFile(CommonarchiveFactoryImpl.java:841)
at org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentExportOperation.export(WebComponentExportOperation.java:42)
... 11 more


Gostou neh? Então, primeiro saibamos analisar um erro. Em um stack trace como este a primeira coisa que olhamos é a mensagem do último erro. Último erro? Mas não é só um? Um stack trace é realmente um erro apenas mas que pelo voltar das classes acaba sendo capturado por algum try catch que lança outra exceção baseada naquela que acaba sendo capturada por outro try catch até que um belo dia o erro chega, finalmente, na nossa telinha, ou no main do sistema.

Caused by: org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException: IWAE0006E Archive is not a valid WAR File because the deployment descriptor can not be found (case sensitive): WEB-INF/web.xml
at org.eclipse.jst.j2ee.commonarchivecore.internal.impl.CommonarchiveFactoryImpl.openSpecificArchive(CommonarchiveFactoryImpl.java:805)
at org.eclipse.jst.j2ee.commonarchivecore.internal.impl.CommonarchiveFactoryImpl.openWARFile(CommonarchiveFactoryImpl.java:841)
at org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentExportOperation.export(WebComponentExportOperation.java:42)
... 11 more
O texto em negrito é o tema de nosso post de hoje. Pesquisando um pouco, como sempre no Google, chegamos na fonte do problema. Ele ocorre quando uma pasta src é definida para deploy mas não contêm nada dentro. E como vejo onde isso está definido isso? Simples, no arquivo:
meuProjeto/.settings/org.eclipse.wst.common.component
Isso é um arquivo XML, basta abrí-lo para termos algo parecido com isso:
<?xml version="1.0" encoding="UTF-8"?>
<project-modules id="moduleCoreId" project-version="1.5.0">
<wb-module deploy-name="jsftemplate">
<wb-resource deploy-path="/" source-path="jsf-template"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/WEB-INF/src"/>
<property name="java-output-path" value="build/classes"/>
<property name="context-root" value="jsftemplate"/>
</wb-module>
</project-modules>
Alguns arquivos podem variar um pouco dependendo do projeto. O nosso problema aqui são as seguintes linhas:
<wb-resource deploy-path="/" source-path="jsf-template"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/WEB-INF/src"/>
wb-resource serve para informar os sources do nosso projeto. deploy-path informa onde será feito o deploy. E o source-path mostra onde estão os sources que serão deployados. Antes de realizar qualquer alteração no arquivo verifique essas pastas definidas no xml, depois exclua as linhas que apontam para pastas vazias ou inexistentes. No meu caso foi a seguinte:
<wb-resource deploy-path="/" source-path="jsf-template"/>
Apague a linha, salve o arquivo, abra o Eclipse novamente e tente exportar seu arquivo WAR. Pronto, mais uma solução simples que possui agora mais um resultado na busca do Google.

fonte: http://www-01.ibm.com/support/docview.wss?uid=swg21255956

sexta-feira, 22 de maio de 2009

[JSF] Tomahawk: java.lang.IllegalStateException: ExtensionsFilter not correctly configured ....

Quem nunca passou por isso antes? Talvez a maioria, mas eu passei por isso a três anos atrás e hoje novamente. Na primeira vez eu resolvi mas não fazia a mínima de como, talvez tenha desistido do que estava fazendo e pronto. Mas na segunda vez tomei a iniciativa de publicar a solução, que é bastante simples.

As primeiras linhas do erro:
java.lang.IllegalStateException: ExtensionsFilter not correctly configured. Resource mapping missing. Resources cant be delivered. Please see: http://myfaces.apache.org/tomahawk/extensionsFilter.html
at org.apache.myfac...ory.throwExtensionsFilterMissing(AddResourceFactory.java:371)
at org.apache.myfac...AddResourceFactory.checkEnvironment(AddResourceFactory.java:352)
at org.apache.myfac...AddResourceFactory.getInstance(AddResourceFactory.java:288)
at org.apache.myfaces...Renderer.encodeEnd(HtmlTabbedPaneRenderer.java:88)
at javax.faces.compon...tBase.encodeEnd(UIComponentBase.java:536)
at com.sun.facelets...nentSupport.encodeRecursive(ComponentSupport.java:242)
Talvez minha inexperiência em JSF na época fossem o motivo para não ter encontrado a resposta, hoje quando procurei no Google achei até meu post de dúvida no GUJ de 2006, sem respostas obviamente. Mas hoje a história foi diferente, corri atrás dos erros analizando-os cuidadosamente.

O cenário do erro:

Desenvolvendo, feliz da vida, algumas telinhas cheias de controles e umarruma de requisições JSF cheguei a uma necessidade de ter um popup. Nada de complicado até agora, qualquer faz um popup seja com divs, outras janelas etc, mas dentro delas haveriam várias telas. Mas uma situação comum em nossas vidas de desenvolvedores. Pensei "Se são várias, mas não apareceram simultâneamente então vou usar tabs". E lá fomos nós de um componente JSF para isso. Existem vários mas como estamos utilizando o Tomahawk aqui então pegamos o t:panelTabbedPane juntamente como o t:panelTab. Montamos a tela e então .... o erro.

Actually um outro desenvolvedor que estava cuidando desta tela e, sabiamente, ao dar de cara com o erro foi procurou o sábio mestre dos mestres Google. Passeando pelas suas vias de sabedoria me procurou, me mostrou o erro e eu disse "Eu já vi isso antes, mas não lembro como resolve. Procura no Google!" E ele respondeu "Já procurei, olha o que eu achei!" e em seguida me mostrou o meu post no GUJ com a mesma dúvida. Pensei logo em chamar o Chapolin Colorado mas lembrei que ele já está bem velho, então fui lê o erro novamente, com mais atenção.

Localizando a solução:

Logo na primeira linha do erro vemos:
ExtensionsFilter not correctly configured. Resource mapping missing. Resources cant be delivered. Please see: http://myfaces.apache.org/tomahawk/extensionsFilter.html
Verifiquem o trecho em negrito. É lá que conseguiremos a solução para todos os nossos problemas. Lá ele diz logo para mapear o ExtesionFilter do MyFaces. Procurei no meu web.xml e já estava mapeado. Passei mais alguns minutos e caiu a ficha (ou o crédito do cartão). No meu arquivo de configuração tinha:
<filter-lass>org.apache.myfaces.component.html.util.ExtensionsFilter</filter-class>
E no site informado tinha:
<filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
Pensei, puxa como os outros são burros por não terem visto que era diferente (claro que eu não ia me acusar). Troquei mas o erro continuou .... As pessoas realmente não aprendem, sempre temos que ler uma solução até o fim. Ainda faltava um filter-mappping:
<filter-mapping>
<filter-name>MyFacesExtensionsFilter</filter-name>
<url-pattern>*.jsf</url-pattern>
</filter-mapping>
Adicionei ao web.xml, reiniciei o Container Web e Voilá!! Tudo funcionou bem bonitinho.

Essa é apenas mais uma solução, simples, para mais um problema, simples.

Esta foi outra lição toon
E se você pouco sabia
Caminhando pelo mundo
Vai aprender o que não queria!

Fonte: http://myfaces.apache.org/tomahawk/extensionsFilter.html