Bug Oracle Driver 11.2.0.x

Solução de contorno para o erro “SQLException: Invalid column type: sqlType=2009” lançado pelo Driver Oracle ojdbc.jar versão 11.2.0.x ao tentar atribuir NULL a uma coluna do tipo XMLTYPE

Ao utilizar o Driver do Oracle ojdbc.jar versão 11.2.0.x, não foi possível atribuir NULL a uma coluna do tipo XMLTYPE, utilizando o java.sql.Type correspondente. Assim, na execução do código statement.setNull(i, Types.SQLXML) o driver lança o seguinte erro:  SQLException: Invalid column type: sqlType=2009.

Após gastar um tempo de pesquisa, não encontrei nenhum fix do driver. O que encontrei foi uma solução de contorno, conforme código abaixo. Continue lendo “Bug Oracle Driver 11.2.0.x”

JBoss EAP 6.x ClassLoading Isolation

Sem dúvida que Servidores JEE que se prezem são mais robustos, mesmo para simples aplicações WAR. Assim, se o Classloading Isolation é trabalhoso, vale a pena o esforço.

JBossAS7ClassloadingAssim como acontece muito nos Servidores de Aplicação JEE como o  IBM WebSphere ou no Oracle WebLogic, o Classloading Isolation no JBoss EAP não é tão simples em alguns casos. Claro que o nosso desejo é sempre gerarmos um EAR/WAR “limpo” de arquivos de configurações, que rode em qualquer servidor de aplicação. Geralmente temos desistido e voltado para o bom e velho Apache Tomcat, o que não é ruim quando precisamos rodar apenas arquivos WAR. Creio que não temos muitos problemas com o Tomcat porque ele não possui (em seu ambiente) muitas APIs ou Frameworks que poderiam provocar conflitos com as utilizadas pelas aplicações. Mas é fato que nem sempre iremos produzir somente pacotes WAR. E quando precisarmos de Segurança, Escalabilidade, Transação e outros tantos serviços presentes na especificação JEE? Sem dúvida que Servidores de Aplicação JEE que se prezem são mais robustos, mesmo para simples aplicações WAR. Assim, se o Classloading Isolation é trabalhoso, vale a pena o esforço (até certo ponto, obviamente).

À medida que eu encontrar problemas e soluções de Classloading Isolation no JBoss, vou atualizando este post. Descrevo abaixo alguns problemas e soluções:

1) Isolando bibliotecas do EAP 6.x para utilizar as que estão definidas na aplicação

Basicamente, basta configurar o arquivo /WEB-INF/jboss-deployment-structure.xml. No exemplo abaixo, a versão do SL4J utilizada pelo EAP é excluída do classloading, para que seja utilizada a versão definida na aplicação:

post 1-1

Esta é a configuração básica de isolamento e deve funcionar na maioria dos casos. Entretanto, para determinadas APIs, o isolamento não é tão simples, como é o caso do JSF (Java Server Faces) e JPA (Java Persistence API).

Continue lendo “JBoss EAP 6.x ClassLoading Isolation”

À procura de um “part-time” Java

À procura de um “part-time” Java

Atualmente estou me programando para trabalhar como freelancer por algum tempo. O perfil de projeto que estou procurando deverá ser, necessariamente, em Java para a Web. Posso atuar somente com Arquitetura (7 anos) e/ou Análise-Desenvolvimento (10 anos).

Em meu último trabalho como freelancer atuei como Arquiteto-Desenvolvedor para o Projeto Time to Talk Cardio. Construí um Framework sob a Plataforma Java 6, o qual denominei JAgile. Foram utilizados os frameworks Struts e Hibernate, banco de dados MySQL e o Tomat Web Server.

  • Leia mais sobre minha experiência com a linguagem de programação Java clicando aqui
  • Se desejar entrar em contato, clique aqui.

WTP Eclipse Plugin x JBoss

Um caminho simples para publicar EarProjects ou WarProjects utilizando o WTP incluso no Eclipse Ganymede e servidor de aplicação JBoss4.2.3.GA

Visto que não encontrei na Internet nenhum ant build modificado do WebTools para publicações no JBoss, de maneira a “explodir” um EAR ou WAR no servidor de aplicação, resolvi eu mesmo modificar o arquivo server323.xml padrão. Abaixo descrevo a solução.

A solução abaixo foi testada com a versão do WTP inclusa no Eclipse Ganymede e servidor de aplicação JBoss 4.2.3.GA.

1) Baixe os arquivos ant-contrib-0.6.jar e ant4eclipse-0.5.0.rc1.jar

2) Prepare o runtime do Apache ANT no workspace do Eclipse:

No workspace do Eclipse, vá em “Windows –> Preferences –> Ant –> Runtime –> Global Entries –> Add JARs” e referencie as duas bibliotecas acima (1).

3) Se você não tiver esse projeto (LibraryANT), crie a seguinte classe Java:

—————————————————————-

WebModulesTask.java

/**
* @author leonardop
* 14/10/2009
*/
public class WebModulesTask extends Task {
private String ear;
private String webModules;

public static class WarFilenameFilter implements FilenameFilter {
/**
* Method overridden accept
* @see java.io.FilenameFilter#accept(java.io.File, java.lang.String)
*/
public boolean accept(File dir, String name) {
return name != null && name.endsWith(“.war”);
}
}

/**
* Constructor of WebModulesTask
*/
public WebModulesTask() {
super();
}

/**
* Method getWebModulesDiscovered
* @return String
*/
private String getWebModulesDiscovered() {
System.out.println(“this.ear = ” + this.ear);
StringBuffer sbWebModules = new StringBuffer();
File file = new File(this.ear);
if (file.isDirectory()) {
File[] warFiles = file.listFiles(new WarFilenameFilter());
for (int index = 0; index < warFiles.length; index++) {
String warFilename = warFiles[index].getName();
sbWebModules.append(warFilename.substring(0, warFilename.lastIndexOf(‘.’)));
if (index + 1 < warFiles.length)
sbWebModules.append(‘,’);
}
}
else {
System.out.println(“NÃO É UM DIRETÓRIO!!”);
// TODO extract ear file
}
return sbWebModules.toString();
}

/**
* Method overridden execute
* @see org.apache.tools.ant.Task#execute()
*/
public void execute() throws BuildException {
super.getProject().setProperty(this.webModules, this.getWebModulesDiscovered());
}

/**
* Method getEar
* @return Returns the ear.
*/
public String getEar() {
return this.ear;
}

/**
* Method setEar
* @param ear The ear to set.
*/
public void setEar(String ear) {
this.ear = ear;
}

/**
* Method getWebModules
* @return Returns the webModules.
*/
public String getWebModules() {
return this.webModules;
}

/**
* Method setWebModules
* @param webModules The webModules to set.
*/
public void setWebModules(String webModules) {
this.webModules = webModules;
}
}

—————————————————————-

4) Agora crie um arquivo  jee_antlib.xml, no diretório root de fontes Java do projeto onde está a classe Java acima. Este arquivo deve ter seguinte conteúdo:

—————————————————————-

<?xml version=”1.0″?>
<antlib>
<typedef name=”getWebModules” classname=”package.WebModulesTask” />
</antlib>

—————————————————————-

5) Seguindo o mesmo passo (2), adicione o projeto Java criado, o qual contém a classe Java acima, assim como o antlib.xml

6) Criar e editar o arquivo abaixo:

/eclipse/plugins/org.eclipse.jst.server.generic.jboss_1.5.206.v20090115/buildfiles/jboss42exploded.xml

——————————————————————

<project name=”deployextension” default=”deploy.j2ee.web” basedir=”.”>
<property name=”pause.deploy” value=”10″ />
<property name=”pause.undeploy” value=”5″ />

<!– declare ant4eclipse –>
<taskdef resource=”net/sf/ant4eclipse/antlib.xml” />
<!– optional: declare ant-contrib –>
<taskdef resource=”net/sf/antcontrib/antlib.xml” />
<!– declare antlib –>
<taskdef resource=”jee_antlib.xml” />

<!– PACKED EAR (DEFAULT)
<target name=”deploy.j2ee.ear”>
<jar destfile=”${project.working.dir}/${module.name}.ear”>
<zipfileset dir=”${module.dir}”>
<include name=”**/*.*”/>
<exclude name=”**/*.java”/>
</zipfileset>
</jar>
<move file=”${project.working.dir}/${module.name}.ear” todir=”${server.publish.dir}”/>
<sleep seconds=”${pause.deploy}”/>
</target>
–>
<!– EXPLODED EAR –>
<target name=”deploy.j2ee.ear”>
<echo>Copiando ${module.dir} em ${server.publish.dir}/${module.name}.ear</echo>
<copy todir=”${server.publish.dir}/${module.name}.ear”>
<fileset dir=”${module.dir}”>
<include name=”**/*.*” />
<exclude name=”**/*.war” />
</fileset>
</copy>
<echo>Buscando módulos web…</echo>
<getWebModules ear=”${module.dir}” webmodules=”webModulesProperty” />
<foreach list=”${webModulesProperty}” target=”deploy.j2ee.ear.webModule” param=”webModule.name” trim=”yes” inheritall=”true” />
<sleep seconds=”${pause.deploy}” />
</target>
<target name=”deploy.j2ee.ear.webModule”>
<echo>Copiando ${project.working.dir}/${webModule.name} em ${server.publish.dir}/${module.name}.ear/${webModule.name}.war</echo>
<copy todir=”${server.publish.dir}/${module.name}.ear/${webModule.name}.war”>
<fileset dir=”${project.working.dir}/${webModule.name}”>
<include name=”**/*.*” />
</fileset>
</copy>
</target>

<!– PACKED WAR (DEFAULT)
<target name=”deploy.j2ee.web”>
<jar destfile=”${project.working.dir}/${module.name}.war”>
<zipfileset dir=”${module.dir}”>
<include name=”**/*.*”/>
<exclude name=”**/*.war”/>
</zipfileset>
</jar>
<move file=”${project.working.dir}/${module.name}.war” todir=”${server.publish.dir}”/>
<sleep seconds=”${pause.deploy}”/>
</target>
–>
<!– EXPLODED WAR –>
<target name=”deploy.j2ee.web”>
<copy todir=”${server.publish.dir}/${module.name}.war”>
<fileset dir=”${module.dir}”>
<include name=”**/*.*” />
<exclude name=”**/*.war” />
</fileset>
</copy>
<sleep seconds=”${pause.deploy}” />
</target>

<target name=”deploy.j2ee.ejb”>
<jar destfile=”${project.working.dir}/${module.name}.jar”>
<zipfileset dir=”${module.dir}”>
<include name=”**/*.*” />
<exclude name=”**/*.java” />
</zipfileset>
</jar>
<move file=”${project.working.dir}/${module.name}.jar” todir=”${server.publish.dir}” />
<sleep seconds=”${pause.deploy}” />
</target>

<!– PACKED WAR (DEFAULT)
<target name=”undeploy.j2ee.web”>
<delete file=”${server.publish.dir}/${module.name}.war” failonerror=”false” />
<sleep seconds=”${pause.undeploy}” />
</target>
–>
<target name=”undeploy.j2ee.web”>
<delete dir=”${server.publish.dir}/${module.name}.war” failonerror=”false” />
<sleep seconds=”${pause.undeploy}” />
</target>

<target name=”undeploy.j2ee.ejb”>
<delete file=”${server.publish.dir}/${module.name}.jar” failonerror=”false” />
<sleep seconds=”${pause.undeploy}” />
</target>

<!– PACKED EAR (DEFAULT)
<target name=”undeploy.j2ee.ear”>
<delete file=”${server.publish.dir}/${module.name}.ear” failonerror=”false”>
</delete>
<sleep seconds=”${pause.undeploy}” />
</target>
–>
<target name=”undeploy.j2ee.ear”>
<delete dir=”${server.publish.dir}/${module.name}.ear” failonerror=”false” />
<sleep seconds=”${pause.undeploy}” />
</target>

</project>

——————————————————————

7) Editar o arquivo:

/eclipse/plugins/org.eclipse.jst.server.generic.jboss_1.5.206.v20090115/servers/jboss42.serverdef

Substitua, dentro do arquivo, a referência do arquivo jboss323.xml por jboss42exploded.xml, conforme abaixo:

—————————————–

<publisherdata>
<dataname>build.file</dataname>
<datavalue>/buildfiles/jboss42exploded.xml</datavalue>
</publisherdata>

—————————————–

8) Reinicie o Eclipse e parta para o abraço! 🙂

NOTA IMPORTANTE: Como é característica do JBoss, sempre que um EAR é publicado “explodido” no diretório /JBOSS_DIST/server/default/deploy, necessariamente a instância default deverá ser reiniciada. Para rápidas atualizações dos recursos web (html, js, imagens, jsp, css, etc), crie um ant-build simples que copie somente os arquivos alterados para o respectivo WAR “explodido” no servidor. Qualquer dúvida estou à disposição.