quarta-feira, 25 de março de 2009

Desabilitando o CaseSensitive do MySQL no Ubuntu



É uma dica batida, mas como eu demorei alguns minutos para encontrar, achei melhor registrar aki.


No linux, o mysql é case sensitive por padrão. No windows não. Ou seja, se no seu programa, vc cria consultas vc FICA alternando O case DA query, ao executar no
seu mysql instalado no windows funcionará sem problema normalmente. Porém, se vc tiver q usar o mysql em algum linux, com AS suas CONSULTAS com CASE maluco, vc provavelmente terá problemas... =/


Felizmente o mysql tem uma váriavel de sistema que pode ser setada para cancelar esse efeito.

Pare o seu mysql:
sudo service mysql stop

Edite o seu my.conf, que no meu caso estava em /etc/mysql/
sudo gedit /etc/mysql/my.conf

Na seção [mysqld] adicione o parametro lower case table name com o valor 1:
[mysqld]
..
# Desabilita o case sensitive
lower_case_table_names=1

salve e feche o arquivo e inicie o serviço do mysql novamente:
sudo service mysql start

Mas Atenção: Essa configuração deve ser feita antes de vc criar qualquer tabela no banco.

É isso.

Referência: http://dev.mysql.com/doc/refman/5.0/en/moving.html

Marcadores: , ,

quarta-feira, 18 de março de 2009

Estou começando a desenvolver! Socorro!

Desenvolver aplicações (seja para web, desktop, mobile etc.), exige uma certa disciplina.

Listo algumas inteligências que acho interessante todo desenvolvedor cultivar.
. Não acho que sejam obrigatórias, mas certamente são muito desejáveis.

Seja autodidata
A maioria das coisas de desenvolvimento q vc vai aprender, será só! Não tem jeito! Lendo algo aqui, conhecendo algo alí, analisando algum algoritmo acolá, etc. Leia desde as bíblias da sua linguagem preferida, a revistas técnicas, blogs, posts em fóruns, artigos etc. e ponha tudo em prática! Mesmo que seja só para acompanhar os exemplos dados! Isso é importante pois facilita a fixação. E, mesmo que vc não decore akela instrução nakele instante, quando vc precisar, existe uma possibilidade maior de vc lembrar que existe algo parecido com o que vc precisa.. Daew basta procurar! ;D "Autodidatismo" deve estar no sangue! (nossa, inventei outra palavra! hauah) :D

Seja curioso


Eu acho que um sentimento interessante em um desenvolvedor é esse de "mas como diabos isso funciona?" Querer ir no fundo! A nossa área é enoooorme, e possibilita muitas e muitas oportunidades! De maneira e formas que vc nem imagina! Nem eu! E isso é uma das belezas da coisa. Mesmo tendo alguns anos de experiência na área, eu posso dizer que eu descubro uma coisa totalmente nova TODOS os dias. E se eu não descubro, é porque eu não procurei, pq, com certeza há algo totalmente novo ali, escondidinho, pronto para ser descoberto. E tem mais: sabe o seu colega que também está aprendendo? Pois é, provavelmente ele já sabe disso! Por isso corra! Não, võe! Ah! E USE O GOOGLE!! É fácil, rápido, simples e com certeza tem o que vc está procurando. Mas aprenda a usar o Google corretamente (isso é importante!). Não adianta perguntar para ele "Onde está a minha alma gêmea!" que ele não vai lhe responder.. (pelo menos não por enquanto! rs..) Não é atoa que ele é o "Pai dos programadores".

Seja insatisfeito


Essa qualidade eu acho muito importante! Mesmo que vc faça algo que vc sabe que está bom e que vc superou as suas próprias espectativas, esteja certo que há uma maneira melhor ou menos onerosa, ou mais otimizada de fazer a mesma coisa! Busque saber (mesmo que não aplique) como é essa maneira! O nosso ramo evolui muito rápido, e o que vc aprende hoje, talvez vc tenha que largar amanhã e aprender outra coisa totalmente diferente. Sendo insatisfeito vc sairá na frente, pois estará sempre se reciclando e aprendendo coisas novas.

Seja humilde


Para mim, uma das piores atitudes que uma pessoa pode tomar, é pensar que sabe tudo! Uma dica: ninguem sabe de tudo! Não trate as pessoas de forma diferente porque ela usa tal tênis, veste tal roupa ou usa determinada técnologia. Eu sentia bastante isso da comunidade Java quanto eu programava em .NET! Hoje, programo Java, entendo todos os argumentos e concordo com a maioria, mesmo assim não é motivo para beltrano olhar siclano de cima para baixo! Somos todos iguais! ;)

Participe da comunidade


Sim, existe uma comunidade na área que vc quer atuar! Se é java, tem o GUJ, o JavaFree, o SouJava e muitas outras. Se é .NET tem o MSDN, o ALT.NET outras tantas.. e por ai vai com Ruby, Python e todas. E é uma ótima idéia ficar antenado nessas comunidades. Vc saberá das novidades, das tendências, do mercado, terá ajuda para suas dúvidas, poderá ajudar nas dúvidas dos outros, compartilhará e agregará conhecimento. Há muitos casos de pessoas na nossa área que se consagraram em comunidades e hoje são referências no mercado! Participe dos fóruns! Leia as notícias! Frequente os eventos! Acesse os sites! Leia os blogs! Logo vc verá o quanto a sua mente abrirá em tão pouco tempo. =D

Seja geek


Pois é, desenvolvimento é no computador! E o que vc fizer pode provavelmente será pro computador, ou pro celular, ou iPod, ou pra geladeira, ou até para uma caneta! Vc tem que gostar desses trecos! Vai ser no computador que vc vai passar a maior parte do seu dia. Imagine vc ficar a maior parte do seu dia preso em algo que vc não suporta? =/

Leia em Inglês

Hoje não há mais desculpas! As informações estão espalhadas na web. Porém, mesmo tendo bastante informação sobre a nossa área em portugues (muitas vezes mal traduzidas), a grande e esmagadora maioria está em Ingles (não, não tenho nenhuma fonte confiável sobre isso. Mas faça um teste: busque no google por "OpenSocial" e depois filtre para "Só páginas em portugues" e note a diferença entre os resultados.. =/). Esse é pré-requisito!

Não se feche em mundinhos!


Hoje eu programo em Java. Java, por sí só, já é um assunto "polvo" com tentaculos e tentaculos que tende a só aumentar mais e mais!! Cada dia que passa, eu tenho a impressão que sei menos! Mesmo assim, eu entendo que Java não é para sempre. Patterns são para sempre. Estrutura de Dados é para sempre. Orientação a Objetos é para sempre. (Bem, se não são para sempre - e realmente não devem ser - acho que tem uma vida útil muito maior que "só" a linguagem Java. rs..). Então, sim, estude a fundo a sua linguagem preferida. Isso fará com que vc utilize todo o poder dessa ferramenta, poupe tempo, esforço e tudo mais! Mas tenha em mente que um dia, ela pode "ficar fora de moda". Porém assuntos abstratos, estruturais e
conceituais vc poderá portar para qualquer outra linguagem no futuro. Um bom Pattern pode ser aplicado em Java, JavaScript, C#, VB, e até em Cobol! XD

Não se apegue (tanto) a IDE'sEssas ferramentinhas de produtividade realmente nos ajudam bastante! Mas não são as IDE que desenvolvem, somos nós! Elas apenas tentam - e as vezes conseguem - nos ajudar a fazer o que nós queremos fazer! Procure se abstrair um pouco delas! Isso nos ajuda a ir mais afundo nos nossos conhecimentos. Não as despreze! Como disse, elas nos ajudam! Mas saiba que existe mundo sem elas... ;D

Não re-invente a roda e estude os conceitos

Sabe, esse problema que vc quer resolver? Pois é, esse mesmo! Certamente alguem já passou por ele. E digo mais: alguem já passou por ele e já bolou uma maneira muito bacana de resolve-lo! Portanto antes de implementar uma idéia genial, pesquise, estude, pergunte! Não é para limar a sua criatividade, não. Mas para alguns problemas, já há algumas receitinhas de bolo prontinhas, que são tão utilizadas e já foram testadas tantas e tantas vezes, que com certeza dará certo. Fora o fato de gerar um vocabulário único entre os desenvolvedores. Ah, e estude profundamente sobre POG's (para aprender como algo NÃO deve ser feito! rs..)

Mude

Todos mudam. O tempo todo! É normal! Melhor: é desejável! Não tenha "aquela velha opinião formada sobre tudo"! Nem se conforme com "verdades absolutas"! Em um caso, determinado conceito pode ser aceito/desejável/aplicável e em outro caso talvez seja melhor utilizar um outro conceito. E o primeiro não necessariamente desmerece o segundo. Aceite isso! Não há bala de pratas no nosso ramo! É tudo uma questão de necessidade. ;D

Tentei abstrair o máximo possível de plataforma, linguagem, etc... Também não é um manifesto fechado! Ajude a incrementa-lo contribuindo com as suas sugestões!! =D

É isso.

Algumas referências interessantes:
http://www.guiadohardware.net/comunidade/aprender-programar/723510/

Marcadores: ,

terça-feira, 17 de março de 2009

Hospedando projetos no Google Code

Este post parece bem básico e inútil, mas a idéia dele guardar algumas pegadinhas da hospedagem de projetos no Google Code.

..mas que diabos??

É possível hospedar o seu projeto no Google Code. Ele disponibilizará o SVN como controle de versão. Seu projeto estará disponível na internet. A única restrição do Google, é que o projeto seja OpenSource. Tudo o que vc precisa é uma Google Account.

Ah ta.. mas como?

Bom, isso é fácil, vc entra no hosting do Google Code, se autentica e clica em "Create a new project".

Então vc preenche um formulário..


..escolhe uma licença..



..e clica em "Create Projetct".

Simples assim!

O seu projeto já está hospedado, e tem até site: http://code.google.com/p/nomeDoSeuProjeto/


Agora vc pode criar wiki pro seu projeto, disponibilizar downloads, responder perguntas e tudo mais.

Na aba "Source" clicando em Browse vc acessa os arquivos do seu projeto.


..mas porque não tem nenhum arquivo lá? Pq vc não mandou nada ainda, oras!

Legal, mas como eu mando os meus arquivos pra lá?


Vc vai precisar de um client SVN para acessar o repositório do projeto no Google Code.

Vc pode instalar o SVN e acessar via linha de comando mesmo.. mas se vc é preguiçoso, como eu, pode usar uma GUI OpenSource para acessar o repositório.

Tem o RapidSVN e o Tortuise ou pode ser pelo Eclipse mesmo, se for o seu caso.. (além de muitas outras..)

Eu instalei o RapidSVN. Porém quando fui acessar o repositório.. o endereço do projeto não funfou...

Acontece que o repositório do seu projeto não é o site do seu projeto. O repositório deve ser acessado pelo endereço: https://nomeDoSeuProjeto.googlecode.com/svn/trunk/

Ok, então eu abro o RapidSVN, clico com o botão direito em Favoritos e seleciono "Adicionar Repositório Existente". Será solicitado o endereço do repositório e insiro "https://nomeDoSeuProjeto.googlecode.com/svn/trunk/", claro!

Ele vai solicitar a confirmação para um certificado, que eu aceito, e será solicitado o usuário e senha. Eu insero o seu usuário do Google Account e.. e..

Hey! Cadê a senha do meu projeto no SVN do Google Code?

Pois é, esse foi uma das pegadinhas que eu demorei para sacar. A senha do seu projeto no SVN do Google Code não é a mesma que a sua senha do Google Account (apesar do usuário ser o mesmo). Há uma senha para cada projeto que é gerada automaticamente.

Para vc ver a senha do seu projeto, vá no site do seu projeto, em http://code.google.com/p/nomeDoSeuProjeto/ e clique na aba "Source".


Na seção "Command-Line Access", vc clica no link "googlecode.com password." (escondido né?)

e (voilá!) essa é a senha que vc coloca no seu client SVN:

..É possível até mudar a senha..

Depois de colocar a senha do seu repositório, para enviar os arquivos do seu projeto para o repositório através do RapidSVN, basta vc arrastar os arquivos que vc quer mandar pela a parte direita da GUI.



E como eu acesso os arquivos do projeto na web?

Depois que vc mandou os seus arquivos para o seu projeto no SVN do Google Code, vc pode acessa-los pelo:

Site do seu projeto:
http://code.google.com/p/nomeDoSeuProjeto/

Repositório do seu projeto na web
https://nomeDoSeuProjeto.googlecode.com/svn/trunk/
(exige o usuário (Google Account) e senha do seu projeto no SVN do Google Code)

E pelo repositório readonly do projeto na web (não precisa de senha):
http//nomeDoSeuProjeto.googlecode.com/svn/trunk/
(ou seja, os arquivos do seu projeto poderão ser acessados na internet diretamente por esse link!)

É isso!

Marcadores:

quarta-feira, 11 de março de 2009

Maven (m2eclipse) não acha JDK no Ganymede


Meus dias tem sido tensos!

Primeiro porque eu não consegui de jeito nenhum configurar o ISA como proxy do Ubuntu e tive que migrar, temporáriamente, pro windows para continuar realizando as minhas tarefas (argh!).

Depois tive vários problemas de incompatibilidade na instalação de alguns plugins do eclipse. A versão do eclipse que estou usando é a eclipse-jee-ganymede-SR2-win32.zip.

O ultimo problema que tive foi ao instalar o plugin m2Eclipse (Maven Integration Plugin for Eclipse).

Depois da instalação ao reiniciar o eclipse era exibido o seguinte aviso:
Maven Integration for Eclipse JDK Warning

The Maven Integration requires that Eclipse be running in a JDK,
because a number of Maven core plugins are usin jars from the JDK.

Please make shure the -vm option in eclipse.ini is poiting to a JDK and verify that Instaled JREs are also using JDK installs.
Segui a sugestão do aviso, e vi na documentação como configurar o parametro -vm no eclipse.ini. Segue trecho:
-vm c:\jdk1.4.2\jre\bin\javaw
A exemplo da documentação, entrei no meu eclipse.ini, e adicionei ao final da lista o parametro, evidentemente apontando para o meu próprio jdk. Não funcionou. Depois de várias tentativas e váriações, a solução aconteceu por acaso: tive que colocar o parametro -vm na primeira linha do arquivo e o caminho para o javaw na linha seguinte.

Não me pergunte o por que!

O arquivo eclipse.ini completo ficou assim:
-vm
C:\Java\jdk1.6.0_10\bin\javaw
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256M
-framework
plugins\org.eclipse.osgi_3.4.3.R34x_v20081215-1030.jar
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms40m
-Xmx512m
..vai entender...

É isso.

Marcadores: , , , ,

Nuvem de tags em flash no Blogger

Estou iniciando agora com essa história de blog, e só hoje eu descobri da existência dos tais widgets do Blogger.

Coloquei o widget para exibir os blogs que eu acompanho, mas senti falta de um widget que exiba as etiquetas das minhas postagens em uma nuvem de tags (tag cloud).

Pesquisando na net, achei um post do blog bloggerbuster que mostra como colocar essa mesma tag cloud, em flash, que eu tenho nesse blog em qualquer blog do Blogger.

É muito simples: basta colar um trecho que código no html do seu blog e já era!!

Ainda é possível customizar a nuvem de tags com cores, fontes etc. Mas eu não fui tão fundo assim.

É isso.

Marcadores:

terça-feira, 10 de março de 2009

Acessando dados do Orkut com Java server-side!

Em um país que acessa mais redes sociais do que email, as empresas saem correndo atrás do prejuizo, e todo mundo fica que nem louco pensando: "como diabos eu posso ganhar dinheiro com isso?". Pior ainda, é quando surgem algumas idéias para se ganhar dinheiro com isso, que é barrada com outra pergunta: "como diabos eu posso obter os dados das redes sociais e ganhar dinheiro com isso fora das redes sociais?"

Se a sua pergunta for a segunda, seus problemas acabaram!!

Comecei a pesquisar uma maneira de conectar
obter os dados de um perfil do Orkut (como seu nome, fotos, amigos, etc) para ser tratado server-side em uma aplicação Java Web
(evitando a famigerada técnica POST/GET buscando por cada campo pelo nome, claro!).

Tentei descobrir como o power.com obtém os dados do Orkut, mas não tive muito sucesso. Li em alguns fóruns (não-oficiais, ou seja, não confiáveis), que os dados do Orkut são replicados e armazenados em um banco de dados local.. (argh!)

Bom, eu esperava uma maneira mais fácil para conectar e interagir com a rede social e continuei procurando..

..que tal um Social Aberto?

A principio, havia entendido que o OpenSocial possibilitava apenas a interação interna entre os mini-aplicativos (ou gadgets) e as redes sociais onde estavam instalados.

Porém, pesquisando na sua documentação, encontrei algumas informações sobre como conectar nas redes sociais que fazem parte do OpenSocial server-side via REST/RPC, com suporte a autenticação OAuth, e obter os seus dados no formato JSON. Há até um guiazinho prontinho com alguns exemplos bem legais!!

Fantástico!! Agora eu conseguia carregar os dados em JSON via REST para converter em objetos e.. e..

..ah, mas peraew!

..pois é! Eu vim da plataforma .NET e sou muuuuito preguiçoso e mal acostumado.. ok, eu já tinha a forma de me conectar, me autenticar, criar os parses do JSON na mão para objetos java.. mas eu gostaria de alguma coisa menos.. err.. menos "na unha", entende?

..e, depois de pesquisar um pouco mais, qual foi a minha surpresa quando eu descobri, escondidinho, sem muitos alardes, que existe algo fácil, server-side e muito mais!

O OpenSocial Library Client!!

O projeto OpenSocial Library Client, possibilita conectar-se server-side em algumas redes do Open Social usando Java, PHP, Phyton, Ruby, Objective C. Li hoje que já iniciaram um projeto para .NET. =)

Ainda estou estudando a library, mas parece ser beeem simples! Ela encapsula toda a complexidade da conexão via REST/RPC, da autenticação com o OAuth, do parse do JSON em objetos na sua linguagem preferida. Tudo de forma bem simples e padronizada! =D

(O pior é que, eu não sei se eu sou um péssimo googler, mas só encontrei uma única noticia tupiniquim comentando sobre esses caras.. fala sério..)

Só um gostinho..

Vc baixa o client da sua linguagem preferida (no meu caso, estou usando java) e basta vc seguir alguns dos exemplos da documentação, para já sair brincando..

Para demonstrar a simplicidade da API, segue abaixo um trecho código java, baseado nos exemplos disponíveis na documentação, que, em poucas linhas de código, carrega um perfil do Orkut e seus amigos.

Para não ficar uma cópia escarrada da documentação, fiz alguns ajustes para exemplificar a solicitação de 3 campos específicos de tipos diferentes e a técnica para exibição de cada um deles no método exibirAmigo():

- o campo "gender" é um campo texto simples e seu valor é acessado através do método field.getStringValue();

- o campo "name", é um campo que retorna um objeto complexo (ou seja, objetos encadeados); É necessário iterar os seus objetos filhos (acessados via field.getValues()) para, então, obter os seus valores (ou outros objetos..);

- já o campo "languagesSpoken" é um campo que pode ser multivalorado. No caso de ser multivalorado, seus valores podem ser iterados através do método field.getStringValues(). Caso não seja multivalorado, seu valor pode ser obtido da mesma forma que o campo "gender";

Segue o código completo com alguns comentários:
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import org.opensocial.client.OpenSocialClient;
import org.opensocial.client.OpenSocialProvider;
import org.opensocial.client.OpenSocialRequestParameter;
import org.opensocial.data.OpenSocialException;
import org.opensocial.data.OpenSocialObject;
import org.opensocial.data.OpenSocialPerson;

public class CarregarPerfilEAmigosDoOrkut {

private static final String SOCIAL_NETWORK = "ORKUT";
private static final String CONSUMER_KEY = "orkut.com:623061448914";
private static final String CONSUMER_SECRET = "uynAeXiWTisflWX99KU1D2q5";
private static final String VIEWER_ID = "03067092798963641994";

/**
* Busca um perfil utilizando a API do OpenSocial e exibe os seus amigos
*
* @param args
*/
public static void main(String[] args) {

// aki é configurado o acesso a rede social
// pelo que eu entendi, ao menos até a escrita desse POST,
// é possivel acessar o Orkut, MySpace, Google (tipo o iGoogle) e PLAXO
OpenSocialClient client = new OpenSocialClient(OpenSocialProvider
.valueOf(SOCIAL_NETWORK));

// determina as credenciais fornecidas por uma aplicação (gadget)
// instalada em um perfil na rede social
client.setProperty(OpenSocialClient.Properties.CONSUMER_KEY,
CONSUMER_KEY);
client.setProperty(OpenSocialClient.Properties.CONSUMER_SECRET,
CONSUMER_SECRET);

// o id do usuário que será autenticado (deve possuir o gadget
// instalado)
// e que será recuperado no metodo client.fetchPerson()
client.setProperty(OpenSocialClient.Properties.VIEWER_ID, VIEWER_ID);

try {

// carrega o perfil
OpenSocialPerson perfil = client.fetchPerson();

//parametros da consulta
Map parameters =
new HashMap();

// determina os campos que retornarão na busca por amigos
parameters.put("fields", new OpenSocialRequestParameter(
new String[] { "gender", "name", "languagesSpoken" }));

// configura 100 amigos como retorno
parameters.put("count", new OpenSocialRequestParameter("100"));

// carrega os 100 primeiros amigos do perfil, trazendo os campos solicitados
Collection amigos = client.fetchFriends(perfil
.getId(), parameters);

// exibe o id do perfil
System.out.println("Perfil: " + perfil.getId());

// exibe os amigos do perfil
for (OpenSocialPerson amigo : amigos) {

exibirAmigo(amigo);
}

} catch (Exception e) {

e.printStackTrace();
}
}

/***
* Exibe os dados de um amigo
*
* @param amigo
* Amigo que será exibido
*
* @throws OpenSocialException
*/
private static void exibirAmigo(OpenSocialPerson amigo)
throws OpenSocialException {

StringBuilder amigoStrinBuilder = new StringBuilder("Amigo: "
.concat(amigo.getId()));

// se o amigo tiver o campo "gender"
if (amigo.hasField("gender")) {

// valor de um campo texto simples
amigoStrinBuilder.append(", gender: ".concat(amigo.getField(
"gender").getStringValue()));
}

// se o amigo tiver o campo "name"
if (amigo.hasField("name")) {

// itera o valor de um campo de objetos complexo (objetos
// encadeados)
for (OpenSocialObject objeto : amigo.getField("name").getValues()) {

amigoStrinBuilder.append(", givenName: ".concat(objeto
.getField("givenName").getStringValue()));
amigoStrinBuilder.append(", familyName: ".concat(objeto
.getField("familyName").getStringValue()));
}
}

// se o amigo tiver o campo "languagesSpoken"
if (amigo.hasField("languagesSpoken")) {

amigoStrinBuilder.append(", lingua: ");

// se for um campo multivalorado
if (amigo.getField("languagesSpoken").isMultivalued()) {

// itera os valores do campo
amigoStrinBuilder.append("{");
for (String lingua : amigo.getField("languagesSpoken")
.getStringValues()) {

amigoStrinBuilder.append(lingua.concat(","));
}
amigoStrinBuilder.append("}");

} else {

// é valor de um campo texto simples
amigoStrinBuilder.append(amigo.getField("languagesSpoken")
.getStringValue());
}
}

// exibe as informações do amigo
System.out.println(amigoStrinBuilder.toString());
}
}
Se vc souber de mais detalhes e quiser compartilhar, ou fazer alguma observação, por favor, sinta-se a vontade para comentar.

É isso!

Marcadores: ,

terça-feira, 3 de março de 2009

Netbeans 6.5 + Hibernate3 + RESTFul (Jersey) = NoSuchMethodError: org.objectweb.asm.ClassWriter.(Z)V!

Por determinação da UFSCar, o desenvolvimento dos projetos da pós-graduação deve ser realizado no netbeans 6.5.

Nunca tinha mexido com essa IDE e estou encontrando algumas dificuldades. Na medida em que os problemas forem aparecendo pretendo registra-los (e se possível a solução) tanto para futuras referências quanto para compartilhar o conhecimento.


Nesse post, vou comentar sobre um erro bizarro que aconteceu comigo utilizando o netbeans 6.5..

..bizarro!

A aplicação (Struts2+Spring2.5+Hibernate3 JPA+GlassFish2) depois de muito trabalho, estava funcionando muito bem, obrigado.

Eu precisava gerar um WS-REST e, como estava utilizando o netbeans, simplesmente acessei
Tools > Plugins, adicionei a biblioteca RESTFul WebServices e a referenciei no projeto.

Montei o WS-REST que precisava e qual foi minha surpresa, quando, ao rodar o projeto para testar, o netbeans tentou fazer o deploy da aplicação no GlassFish e, após muita demora.. PIMBA:

java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.(Z)V

=/ (...e eu só adicionei a library do WS-REST.. JURO!!)

..mas por que isso?

Buscando na web, encontrei alguns coitados (como eu) com o mesmo erro e variações.

De acordo com o que li e pelo que eu entendi, o problema ocorre quando, ao adicionar a
biblioteca do Jersey ao projeto, é adicionado o asm.jar desse módulo. (nâo, eu não tinha adicionado o Jersey.. o netbeans o incluiu implicitamente, para criar o WS-REST...)

Acontece que já havia uma outra versão desse jar no meu projeto (
utilizada pelo Hibernate). E a versão do Hibernate (1.5.3) e a do Jersey (3.1) tem arquiteturas (e até pacotes) diferentes. Ao subir a aplicação, o Hibernate tentava utilizar a nova versão e não encontrava o que procurava e dava tiutio!

..tá, e daí?

Entre umas e outras tentativas, encontrei a solução em uma thread do java.net
, que comentava que o asm.jar do Hibernate é utilizado indiretamente através da cglib. Eles comentam que há uma nova versão dessa biblioteca, a cglib-nodep que serve tanto para comunicar com a asm.jar do Hibernate quanto para comunicar com o asm.jar do Jersey. Removi a cglib do Hibernate e substitui pela cglib-nodep e..

..voilá! ;D

..maass..

..caso vc não esteja utilizando esse modulo no seu projeto, e o netbeans simplesmente tenha adicionado essa biblioteca por forças misticas desconhecidas, esse trecho da dica do Rambo pode ser útil:
(..) right click on the web module and select library and remove RESTful and Jersey ... or so one might think. But apparently the web.xml file has references to RESTful and removing the lib doesn't remove those entries. So go thru that file and remove all ref. to RESTful well, that is how I have got my app to load onto glassfish. (..)
Se preferir, veja o post completo!

..bom, é isso!

Espero que funcione para quem passar por problemas semelhantes..

..argh!

O pior, é que após passar um bom stress com isso, encontrei um ótimo post que explica detalhadamente o problema. Segue link para referência:
Hildeberto's Blog: Hibernate and Jersey Conflict on Glassfish

Marcadores: , , , ,