Montando um ambiente utilizando Tomcat + Java + MySQL (Debian)

Como a maioria de meus artigos, venho compartilhar a experiência adquirida na tentativa de executar determinada tarefa quando não encontro um artigo que mostre os passos de forma simples para a execução. Neste mostrarei como montar um ambiente que hospede um site em Java no Debian.

[ Hits: 53.461 ]

Por: Geraldo José Ferreira Chagas Júnior em 30/06/2009 | Blog: http://prginfo.blogspot.com


Ferramentas necessárias



Considerações iniciais

O objetivo desse artigo não é ensinar a programação Java nem explicar o funcionamento do Tomcat. Será considerado que o leitor já tem estas informações. Aqui iremos apenas mostrar o caminho para a instalação e configuração do servidor Tomcat, apesar de utilizar de alguns códigos em Java para testar o funcionamento de nosso servidor.

Ferramentas

Para começarmos a montagem de nosso ambiente, considerarei que algumas ferramentas já estão instaladas. Não entrarei em detalhes sobre estas instalações, mas darei uma dica para instalá-las via apt-get.

Serão necessários:

MySQL - servidor de base de dados:

# apt-get install mysql-server-5.0

Bind - servidor DNS:

# apt-get install bind9

O servidor de nomes servirá para utilizarmos o domínio de nosso servidor no lugar do localhost, apesar de este artigo utilizarmos sempre a URL http://localhost.

Lynx - navegador de páginas em modo texto:

# apt-get install lynx

Mostraremos neste artigo a instalação de:
  • Java - jsdk;
  • Tomcat - contêiner para aplicações Java para web;
  • Driver do Java para MySQL.

    Próxima página

Páginas do artigo
   1. Ferramentas necessárias
   2. Instalação das ferramentas
   3. Configurando o Tomcat
   4. Criando nossa aplicação para teste
   5. Conectando ao MySQL
Outros artigos deste autor

X Window, Controladores de Janelas e Ambientes Desktop

Linvox - Sistema Linux voltado para deficientes visuais

Configurando Servidor de Nomes - DNS (Debian)

Inicialização e interrupção do sistema (Debian)

Instalando e configurando o aMule (Debian)

Leitura recomendada

Java básico: Gravando em arquivos texto

Introdução ao Swing (parte 1)

Gerando arquivos JAR com o Eclipse

Android e Eclipse no Ubuntu 11.10 - Problemas? Eis a solução

Instalação e Configuração do JDK 7

  
Comentários
[1] Comentário enviado por michel5670 em 30/06/2009 - 21:33h

Colega muito bom seu artigo veio em boa hora pois eu estava com dificuldades de instalar e configurar o debian,seu artigo está muito bem explicado e com um assunto de interesse de uma grande maioria prova disso e o artigo acabar de ser postado e ja ter mais de 150 acessos Parabéns!!!

[2] Comentário enviado por maran em 01/07/2009 - 08:51h

Caracas Geraldo,
eu ainda não tinha visto um artigo do genero, sobre Tomcat integrado ao MySQL, muito bom!
Bem explicado, e de grande valia a muito, isso ae, show de bola,
Abraços

[3] Comentário enviado por gjr_rj em 01/07/2009 - 09:27h

Olá pessoal, venho informar que o artigo se encontra pela metade, está faltando informações. Vou avisar a equipe de moderadores do VOL.

[4] Comentário enviado por gjr_rj em 01/07/2009 - 09:42h

Pedi para incluirem o restante do arquivo, mas enquanto isso não acontece, estou colocando aqui. Seria incluido no link 5 "Conectando ao Mysql", no final.

-----------------------------------------------

Salve o arquivo e em seu browser, acesse a url hocalhost:8180/teste

Aparecerá a página:

Olá mundo !!!
1 + 1 = 2

Erro drive
java.lang.ClassNotFoundException:com.mysql.jdbc.Driver

Mas como o drive é encontrado em nossa aplicação e não é encontrado em nossa página ? O motivo é que nossa aplicação procura pelo CLASSPATH já as páginas tem é limitada a buscar no diretório padrão ou no diretório de nosso projeto.

Então, basta copiar o arquivo com o drive para o diretório <CATALINA_HOME>/common/lib, porém aqui iremos apenas criar um link simbólico para o arquivo.

# cd /usr/share/tomcat5.5/common/lib
# ln -s ../../../java/mysql-connector-java-5.0.4.jar mysql-connector-java.jar

Reinicie o tomcat
# /etc/init.d/tomcat5.5 restart

Tente novamente acessar a URL localhost:8180/teste
Desta vez o resultado será:

Olá mundo !!!
1 + 1 = 2

Drive encontrado!!!

Vamos continuar nosso exemplo de teste, aumentando o código.
Edite novamente o arquivo /var/www/teste/index.jsp

Agora, vamos modificá-lo deixando com o seguinte código:

<%@page import="java.sql.*"%>
Olá mundo !!!<br>
1 + 1 = ${1+1}
<br>

<%
String url = "jdbc:mysql://localhost:3306/dbTeste"; //string de conexão a base dbTeste
String user = "root"; //usuário da base de dados
String pwd = "123456";//senha do usuário criado
try
{
Class.forName("com.mysql.jdbc.Driver");
out.println("<br>Drive carregado com sucesso!!!<br>");
try
{
Connection cn = DriverManager.getConnection(url, user, pwd);
out.println("<br>Conexao estabelecida!!!<br>");
String sql = "select * from tbTeste";
Statement stm = cn.createStatement();
try
{
ResultSet rs = stm.executeQuery(sql);
while (rs.next())
{
out.println( " - " + rs.getString("codteste"));
}
}
catch (Exception ex)
{
out.println("<br>Erro no Select!!!<br>" + ex.printStackTrace());
}
}
catch (Exception ex)
{
out.println("<br>Erro na conexao!!!<br>" + ex.printStackTrace());
}
}
catch (ClassNotFoundException ex)
{
out.println("<br>Erro na conexao com a base de dados!!!<br>" + ex.printStackTrace());
}
catch (Exception ex)
{
out.println("<br>Drive nao pode ser carregado!!!<br>" + ex.printStackTrace());
}
out.println("<br>Olá Base!!!<br>");
}

%>

Ao acessarmos a URL localhost:8081/teste nos depararemos com a seguinte mensagem:

Olá mundo !!!
1 + 1 = ${1+1}

Erro na conexão

com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: ** BEGIN NESTED EXCEPTION ** java.security.AccessControlException MESSAGE: access denied (java.net.SocketPermission localhost resolve) STACKTRACE: java.security.AccessControlException: access denied (java.net.SocketPermission localhost resolve) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:264) at java.security.AccessController.checkPermission(AccessController.java:427) at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) at java.lang.SecurityManager.checkConnect(SecurityManager.java:1031) at java.net.InetAddress.getAllByName0(InetAddress.java:1134) at java.net.InetAddress.getAllByName(InetAddress.java:1072) at java.net.InetAddress.getAllByName(InetAddress.java:1008) at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:138) at com.mysql.jdbc.MysqlIO.(MysqlIO.java:277) at com.mysql.jdbc.Connection.createNewIO(Connection.java:2668) at com.mysql.jdbc.Connection.(Connection.java:1531) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266) at java.sql.DriverManager.getConnection(DriverManager.java:525) at java.sql.DriverManager.getConnection(DriverManager.java:171) at org.apache.jsp.index_jsp._jspService(index_jsp.java:65) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97) at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:334) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264) at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) 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.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:243) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAsPrivileged(Subject.java:517) at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:275) at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:161) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:245) at org.apache.catalina.core.ApplicationFilterChain.access$0(ApplicationFilterChain.java:177) at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:156) at java.security.AccessController.doPrivileged(Native Method) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:152) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527) at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) at java.lang.Thread.run(Thread.java:595) ** END NESTED EXCEPTION ** Last packet sent to the server was 52 ms ago.

Felizmente, se tudo correu bem até aqui, esse será nosso último erro.

Teremos que liberar a permissão de conexão.

As permissões estão definidas no arquivo "$CATALINA_BASE/conf/catalina.policy", neste caso em /usr/share/tomcat5.5/conf/catalina.policy.

Seria só alterar esse arquivo, mas se verificarmos nosso daemon (/etc/init.d/tomcat5.5), veremos que este arquivo e montado na inicialização do tomcat, pois encontraremos a seguinte linha:

cat /etc/tomcat5.5/policy.d/*.policy \
>> "$CATALINA_BASE/conf/catalina.policy"

Ou seja, não adianta modificar o arquivo /usr/share/tomcat5.5/conf/catalina.policy, pois quando iniciarmos o tomcat esse arquivo será refeito. Na inicialização, o conteúdo do arquivo "$CATALINA_BASE/conf/catalina.policy" é substituindo pelo conteúdo de todos os arquivos ".policy" do diretório /etc/tomcat5.5/policy.d/. Então, a linha abaixo nós poderemos incluir dentro de um arquivo ".policy" do diretório /etc/tomcat5.5/policy.d/ ou, o que acho mais organizado, criar um arquivo.

Crie um arquivo /etc/tomcat5.5/policy.d/05teste.policy. Inclua o seguinte conteúdo:

grant codeBase "file:/var/www/teste/-" {
permission java.security.AllPermission;
};

Com esse conteúdo, você faria todas as liberações para sua aplicação. O mais seguro é ir liberando as permissões a medida que forem aparecendo as necessidades, então, sugiro substituir o conteúdo do arquivo por

grant codeBase "file:/var/www/teste/-" {
permission java.net.SocketPermission "localhost:3306", "connect,resolve";
};

Assim, liberaremos apenas a conexão com o mysql.

Agora, basta reiniciarmos o tomcat

# /etc/init.d/tomcat5.5 restart

e testarmos nossa aplicação acessando a URL localhost:8180/teste

deverá aparecer o seguinte conteúdo:

Olá mundo !!!
1 + 1 = 2

Drive carregado com sucesso!!!

Conexao estabelecida!!!

- 1

- 7

- 17

- 37


[5] Comentário enviado por fabio em 01/07/2009 - 13:00h

Desculpem o transtorno, artigo completo no ar!

Obrigado pelo aviso Geraldo.

[6] Comentário enviado por Milton Quirino em 23/07/2009 - 10:34h

Muito bom !!!

Já add nos favoritos.

[7] Comentário enviado por rbertelle em 30/09/2009 - 17:53h

Caro gjr_rj segui criteriosamente seu tutorial, achei um pequeno erro na hora de compilar o arquivo teste2.java, mas consegui contorna-lo.
Já no final revisei e tentei de tudo, mas só obtive a resposta abaixo no browser.
Alguma segestão?
Abraço


HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: Unable to compile class for JSP:

An error occurred at line: 30 in the jsp file: /index.jsp
The operator + is undefined for the argument type(s) String, void
27: }
28: catch (Exception ex)
29: {
30: out.println("<br>Erro no Select!!!<br>" + ex.printStackTrace());
31: }
32: }
33: catch (Exception ex)


An error occurred at line: 35 in the jsp file: /index.jsp
The operator + is undefined for the argument type(s) String, void
32: }
33: catch (Exception ex)
34: {
35: out.println("<br>Erro na conexao!!!<br>" + ex.printStackTrace());
36: }
37: }
38: catch (ClassNotFoundException ex)


An error occurred at line: 40 in the jsp file: /index.jsp
The operator + is undefined for the argument type(s) String, void
37: }
38: catch (ClassNotFoundException ex)
39: {
40: out.println("<br>Erro na conexao com a base de dados!!!<br>" + ex.printStackTrace());
41: }
42: catch (Exception ex)
43: {


An error occurred at line: 44 in the jsp file: /index.jsp
The operator + is undefined for the argument type(s) String, void
41: }
42: catch (Exception ex)
43: {
44: out.println("<br>Driver nao pode ser carregado!!!<br>" + ex.printStackTrace());
45: }
46: out.println("<br>Olá Base!!!<br>");
47: }


An error occurred at line: 47 in the jsp file: /index.jsp
Syntax error, insert "Finally" to complete TryStatement
44: out.println("<br>Driver nao pode ser carregado!!!<br>" + ex.printStackTrace());
45: }
46: out.println("<br>Olá Base!!!<br>");
47: }
48:
49: %>



An error occurred at line: 95 in the generated java file
Syntax error on token "catch", Identifier expected


An error occurred at line: 97 in the generated java file
out cannot be resolved


An error occurred at line: 97 in the generated java file
_jspx_out cannot be resolved


An error occurred at line: 98 in the generated java file
out cannot be resolved


An error occurred at line: 98 in the generated java file
out cannot be resolved


An error occurred at line: 99 in the generated java file
out cannot be resolved


An error occurred at line: 100 in the generated java file
_jspx_page_context cannot be resolved


An error occurred at line: 100 in the generated java file
_jspx_page_context cannot be resolved


An error occurred at line: 102 in the generated java file
Syntax error on token "finally", { expected


An error occurred at line: 103 in the generated java file
_jspxFactory cannot be resolved


An error occurred at line: 103 in the generated java file
_jspxFactory cannot be resolved


An error occurred at line: 103 in the generated java file
_jspx_page_context cannot be resolved

Stacktrace:
org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:93)
org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)
org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:435)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:298)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:277)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:265)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:564)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:302)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:244)
java.security.AccessController.doPrivileged(Native Method)
javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:276)
org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:162)

note The full stack trace of the root cause is available in the Apache Tomcat/5.5 logs.
Apache Tomcat/5.5

[8] Comentário enviado por admwagner em 24/05/2010 - 13:33h

.'.
Grato pelo artigo

Wagner Ferreira
.'.

[9] Comentário enviado por felimpe em 15/09/2010 - 09:52h

foi um excelente artigo porem o final decepcionou.
deu o mesmo erro que o kra q falou acima..

org.apache.jasper.JasperException: Unable to compile class for JSP:

An error occurred at line: 30 in the jsp file: /index.jsp
The operator + is undefined for the argument type(s) String, void
27: }
28: catch (Exception ex)
29: {
30: out.println("<br>Erro no Select!!!<br>" + ex.printStackTrace());
31: }
32: }
33: catch (Exception ex)


An error occurred at line: 35 in the jsp file: /index.jsp
The operator + is undefined for the argument type(s) String, void
32: }
33: catch (Exception ex)
34: {
35: out.println("<br>Erro na conexao!!!<br>" + ex.printStackTrace());
36: }
37: }
38: catch (ClassNotFoundException ex)


An error occurred at line: 40 in the jsp file: /index.jsp
The operator + is undefined for the argument type(s) String, void
37: }
38: catch (ClassNotFoundException ex)
39: {
40: out.println("<br>Erro na conexao com a base de dados!!!<br>" + ex.printStackTrace());
41: }
42: catch (Exception ex)
43: {


An error occurred at line: 44 in the jsp file: /index.jsp
The operator + is undefined for the argument type(s) String, void
41: }
42: catch (Exception ex)
43: {
44: out.println("<br>Drive nao pode ser carregado!!!<br>" + ex.printStackTrace());
45: }
46: out.println("<br>Olá Base!!!<br>");
47: }


An error occurred at line: 47 in the jsp file: /index.jsp
Syntax error, insert "Finally" to complete TryStatement
44: out.println("<br>Drive nao pode ser carregado!!!<br>" + ex.printStackTrace());
45: }
46: out.println("<br>Olá Base!!!<br>");
47: }
48:
49: %>


An error occurred at line: 104 in the generated java file
Syntax error on token "catch", Identifier expected

An error occurred at line: 106 in the generated java file
out cannot be resolved

An error occurred at line: 106 in the generated java file
_jspx_out cannot be resolved

An error occurred at line: 107 in the generated java file
out cannot be resolved

An error occurred at line: 107 in the generated java file
out cannot be resolved

An error occurred at line: 108 in the generated java file
out cannot be resolved

An error occurred at line: 109 in the generated java file
_jspx_page_context cannot be resolved

An error occurred at line: 109 in the generated java file
_jspx_page_context cannot be resolved

An error occurred at line: 111 in the generated java file
Syntax error on token "finally", { expected

An error occurred at line: 112 in the generated java file
_jspx_page_context cannot be resolved

Stacktrace:
org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:92)
org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)
org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:439)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:334)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:312)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:299)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:589)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts