JWS e Class.forName

Ola,

Estou fazendo uma 1a. experiencia com Java Web Start,
em uma aplicacao que acessa um BD Firebird. Portanto,
preciso carregar a classe JDBC Jaybird.

Lendo:
http://java.sun.com/products/javawebstart/faq.html#54
foi dito que nao se pode usar Class.forName e sim o ClassLoader
da aplicacao.

Entao, fiz isso:
ClassLoader cl = this.getClass().getClassLoader();
//Class.forName(getProperty(“Driver”));
cl.loadClass(getProperty(“Driver”));
connLocal = DriverManager.getConnection(…);

A aplicacao rodando local funciona tranquilo com Class.forName, mas esta outra opcao loadClass nao carrega a classe, pois da excecao no getConnection:

java.sql.SQLException: No suitable driver
at java.sql.DriverManager.getConnection(DriverManager.java:532)
at java.sql.DriverManager.getConnection(DriverManager.java:171)

O que esta faltando?

uma pergunta nada a ver com a sua duvida: o seu sistema acessa um BD centralizado num servidor? (imagino q sim) se for assim, eu nao acho uma boa ideia o cliente fazer a conexao com o BD e tudo mais. eu acho q o melhor eh teu servidor manter um WebService (ou algo do tipo) q acesse o BD e esse WebService é acessado pelo cliente…
concordam?

Eu ate concordo, mas eu gostaria de saber, por enquanto, como substituir o codigo do Class.forName() no JWS, pois queria pelo menos ver a aplicacao de teste rodando. Por enquanto nao é uma aplicacao critica, é apenas teste de JWS, blz…

IMPORTANTE: Eu consigo rodar a aplicacao pelo console, localmente, ela nao funciona apenas por dentro do Java Web Start…

Eu tentei fazer tambem:

Class driver = cl.loadClass(“org.firebirdsql.jdbc.FBDriver”);
driver.newInstance();
Connection connLocal = DriverManager.getConnection(…);

mas tambem nao funcionou, deu msg:

java.lang.ExceptionInInitializerError
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at appsaf.(appsaf.java:81)

Caused by: java.security.AccessControlException: access denied (java.util.PropertyPermission FBLog4j read)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPropertyAccess(Unknown Source)
at java.lang.System.getProperty(Unknown Source)
at org.firebirdsql.logging.LoggerFactory.getLogger(LoggerFactory.java:36)
at org.firebirdsql.logging.LoggerFactory.getLogger(LoggerFactory.java:72)
at org.firebirdsql.jdbc.FBDriver.<clinit>(FBDriver.java:66)

Sera que o JAR do Firebird/Jaybird faz alguma coisa dentro do seu codigo que nao permite o funcionamento pelo Java Web Start?

Descobri o segte: apos tentar acessar o Firebird, o MSSQL e o MySQL, descobri que, como a application roda em um sand box igual uma applet, ela nao consegue se conectar a nenhum servico do servidor. Portanto, acho que sera necessario assinar todos os JARs, inclusive os JDBCs, com uma mutreta contida em:
http://java.sun.com/j2se/1.4.2/docs/guide/jws/developersguide/development.html
para funcionar o acesso ao BD…

[quote=edilmar]Descobri o segte: apos tentar acessar o Firebird, o MSSQL e o MySQL, descobri que, como a application roda em um sand box igual uma applet, ela nao consegue se conectar a nenhum servico do servidor. Portanto, acho que sera necessario assinar todos os JARs, inclusive os JDBCs, com uma mutreta contida em:
http://java.sun.com/j2se/1.4.2/docs/guide/jws/developersguide/development.html
para funcionar o acesso ao BD…[/quote]

Funciona sim, é só declarar os JARS no JNLP que ele baixa e utiliza normalmente. Ex:

<resources>
<j2se version=“1.4+”/>
<jar href=“jws/teste.jar”/>
<jar href=“jws/pg74.215.jdbc2ee.jar”/>
<jar href=“jws/pg74.215.jdbc3.jar”/>
</resources>

Sim, mas além de declarar os JARs será necessário fazer a assinatura dos mesmos.

[quote=leonardom]
Sim, mas além de declarar os JARs será necessário fazer a assinatura dos mesmos.[/quote]

Eu não fiz assinatura e funcionou.
Como não precisei fazer nada a mais, nem fui atrás de como se faz isso.

A assinatura não é necessária somente para acessar recursos da máquina que está rodando o aplicativo?

A assinatura é necessária também para fazer determinadas operações, como conectar-se ao servidor via uma porta TCP/IP, o que é necessário pelos drivers JDBC. Portanto, acho que o caso do JDBC exige assinatura mesmo.

Conseguiu resolver? Estava com o mesmo problema e consegui resolver fazendo a assinatura do jar

Sim, eu faco assinatura de todos os JARs.
O problema é que a assinatura padrao gerada pelo JDK dura 6 meses. Sendo necessario refaze-las com esta frequencia.

[quote=edilmar]Sim, eu faco assinatura de todos os JARs.
O problema é que a assinatura padrao gerada pelo JDK dura 6 meses. Sendo necessario refaze-las com esta frequencia.[/quote]

Você está usando certificados auto-assinados? Se sim, é só mudar o parametro “validity” do comando keytool quando for gerar as chaves.

PS: Este topico era de 2004 mesmo?

Eu uso auto-assinados mesmo, com o jarsigner.
E nao achei a opcao validity. Uso assim:
jarsigner -keystore isKeystore -storepass intersite fastatend\fastatend.jar is

[quote=edilmar]Eu uso auto-assinados mesmo, com o jarsigner.
E nao achei a opcao validity. Uso assim:
jarsigner -keystore isKeystore -storepass intersite fastatend\fastatend.jar is
[/quote]

validity é uma opção do comando keytool. O comando keytool é para gerar a keystore (que contém as chaves privadas e publica com certificado auto-assinado) que você usa no comando jarsigner. Como você estava gerando a keystore?

Nesse link é demonstrado como usar o validity

http://publib.boulder.ibm.com/wasce/V1.1.0/pt_BR/Tasks/Tomcat/Ssl.html