Aller au contenu

[Résolu] [Java web start] Driver JDBC


Messages recommandés

Bonjour,

j'ai écrit un programme qui permet d'afficher une fenetre dans laquelle, il y a une JTable

et un menu qui permet d'afficher un graphe lorsque l'on fait un choix.

La fenetre est de ce type :

http://cjoint.com/data/gBpRqCTQrd.htm

Comme le programme fonctionnait, je souhaitais déployer cette ap^plication via java web part

mais le programme ne fait rien.

Il y a bien la fenetre et le menu mais la JTable n'apparait pas et il y a pas de graphes qui

apparaissent lorsque je clique sur un des choix du menu.

Ce que j'obtiens :

http://cjoint.com/data/gBpRN1NLtm.htm

Pour obtenir les graphes, j'ai utilisé JFreeChart et awt/swing pour l'interface graphique.

Le fichier test.jnlp que j'ai écrit est le suivant :

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+" codebase="http://localhost/Local-Site-A/" href="test.jnlp">

<information>
	<title>Mon Logiciel par JNLP</title>
	<vendor>Pierre Sylvestre</vendor>

</information>

<resources>
	<j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se"/>
	<jar href="http://localhost/Local-Site-A/test.jar"/>
	<jar href="http://localhost/Local-Site-A/lib/jfreechart-1.0.5.jar"/>
	<jar href="http://localhost/Local-Site-A/lib/junit.jar"/">
	<jar href="http://localhost/Local-Site-A/lib/itext-2.0.1.jar"/>
	<jar href="http://localhost/Local-Site-A/lib/jfreechart-1.0.5.jar"/>
	<jar href="http://localhost/Local-Site-A/lib/jfreechart-1.0.5-experimental.jar"/>
	<jar href="http://localhost/Local-Site-A/lib/servlet.jar"/>
	<jar href="http://localhost/Local-Site-A/lib/jcommon-1.0.9.jar"/>
	<jar href="http://localhost/Local-Site-A/lib/jfreechart-1.0.5-swt.jar"/>
	<jar href="http://localhost/Local-Site-A/lib/swtgraphics2d.jar"/>
</resources>

<application-desc main-class="MonMenu" />

</jnlp>

Est-ce que quelqu'un aurait une idée de la raison pour laquelle, la fenetre s'affiche mais

ne fait rien ?

Merci

Lien vers le commentaire
Partager sur d’autres sites

Re, pour remplir la table, je me connecte à une base de donnée en utilisant JDBC.

Avec JWS, les données ne sont pas présentes. Je suppose qu'il faut que j'ajoute ces pilotes aux ressources.

Est-ce que quelqu'un pourrait m'indiquer le bout de code qui permette de faire ça.

Merci

Lien vers le commentaire
Partager sur d’autres sites

Et en rajoutant simplement le JAR du driver dans la liste des dépendances de ton application ? (dans le fichier jnlp)

Je mets uniquement le code qui m'a permis de me connecter à la base de donnée sql server.

Pour effectuer la connection, je n'ai pas eu besoin d'importer un fichier jar dans Eclipse.

Voici le code pour la connection:

MyTableModel contient les méthodes pour remplir, vider la table

public static void main(String[] args){
	JFrame frame = new JFrame();			
	MyTableModel maTable = new MyTableModel();		
	JTable jTable = new JTable(maTable);
	List<Object[]> donnees = new ArrayList<Object[]>();

	//Parametre de connexion a la base de données
	String url="jdbc:odbc:MaTable";
String login = "root";
String password = "root";
Connection connection = null;

	JScrollPane scroll = new JScrollPane(jTable);
	frame.setSize(600,250);
	frame.add(scroll);
	frame.setVisible(true);
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	try{
		while(true){		
			maTable.vide();
			Driver monDriver = new JdbcOdbcDriver();
			DriverManager.registerDriver(monDriver);
			connection=DriverManager.getConnection(url,login,password);
			Statement stmt = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
			String sql = "SELECT * FROM MaTable";
			ResultSet rs = stmt.executeQuery(sql);
			ResultSetMetaData rsmd = rs.getMetaData();
			int ncols = rsmd.getColumnCount();
			//Remise du curseur à sa position initiale
			rs.beforeFirst();
			boolean suivant = rs.next();
			while(suivant){
				Object val [] = new Object[ncols];
				for(int j=1; j<=ncols; j++)
					val[j-1] = rs.getString(j);
				donnees.add(val);
				suivant = rs.next();
			}		
			((MyTableModel)jTable.getModel()).remplie(donnees);	
			//Remise du curseur à sa position initiale
			rs.beforeFirst();
			try {
				Thread.sleep(2000);
			}catch(InterruptedException ie){
				ie.printStackTrace();
			}	
		}
	}catch(SQLException se){
		se.printStackTrace();
	}
}

Comme je n'ai pas eu à importer de jar dans Eclipse pour pouvoir me connecter, je ne sais pas trop du quel tu parles.

J'ai essayé en mettant le jar sqljdbc.jar que j'ai téléchargé ici :

http://www.microsoft.com/downloads/thankyo...;displayLang=en

Mais ça ne donne rien. J'ai aussi essayé en mettant le jar rt.jar dans mon fichier jnlp mais rien également.

Je ne sais plus trop quoi tester.

Lien vers le commentaire
Partager sur d’autres sites

Ah, tu passes par ODBC...

Pour que cela fonctionne sur une machine X, il va falloir paramétrer la source de données ODBC sur cette machine X.

Du coup, c'est en totale contradiction avec ton but, qui est de déployer ton application via JNLP pour justement éviter de l'installer et de la configurer sur chaque poste client...

Mon conseil : Change ton code pour effectuer une connexion directe JDBC, sans passer par ODBC. Pour cela, il te faut le driver correspondant à la BDD que tu utilises. Et ensuite, il suffira d'inclure le jar de ce driver JDBC dans ton descripteur JNLP, comme indiqué plus haut.

Lien vers le commentaire
Partager sur d’autres sites

J'ai changé et utilisé le pilote sql server. J'ai importé dans Eclipse le jar qu'il fallait sqljdbc.jar.

Je lance le programme et j'obtiens l'exception :

com.microsoft.sqlserver.jdbc.SQLServerException: Échec de la connexion TCP/IP à l'hôte . java.net.ConnectException: Connection refused: connect
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.loginWithoutFailover(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at Test.main(Test.java:41)

Une idée d'ou peut provenir le probleme ?

Le code modifié :

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;

import com.microsoft.sqlserver.jdbc.SQLServerDriver;

public class Test{
public static void main(String[] args){
	JFrame frame = new JFrame();			
	MyTableModel maTable = new MyTableModel();		
	JTable jTable = new JTable(maTable);
	List<Object[]> donnees = new ArrayList<Object[]>();

	//Parametre de connexion a la base de données
	String url = "jdbc:sqlserver://localhost:1433;databaseName=MaTable";
	String login = "root";
String password = "root";
Connection connection = null;

	JScrollPane scroll = new JScrollPane(jTable);
	frame.setSize(600,250);
	frame.add(scroll);
	frame.setVisible(true);
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	try{
		while(true){		
			maTable.vide();
			Driver monDriver = new SQLServerDriver();
			DriverManager.registerDriver(monDriver);
			Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
			connection = DriverManager.getConnection(url,login,password);
			Statement stmt = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
			String sql = "SELECT * FROM MaTable";
			ResultSet rs = stmt.executeQuery(sql);
			ResultSetMetaData rsmd = rs.getMetaData();
			int ncols = rsmd.getColumnCount();
			//Remise du curseur à sa position initiale
			rs.beforeFirst();
			boolean suivant = rs.next();
			while(suivant){
				Object val [] = new Object[ncols];
				for(int j=1; j<=ncols; j++)
					val[j-1] = rs.getString(j);
				donnees.add(val);
				suivant = rs.next();
			}		
			((MyTableModel)jTable.getModel()).remplie(donnees);	
			//Remise du curseur à sa position initiale
			rs.beforeFirst();
			try {
				Thread.sleep(2000);
			}catch(InterruptedException ie){
				ie.printStackTrace();
			}	
		}
	}catch(SQLException se){
		se.printStackTrace();
	}catch(ClassNotFoundException cnfe){
		cnfe.printStackTrace();
	}
}
}

Lien vers le commentaire
Partager sur d’autres sites

J'ai résussi à établir une connection en utilisant le driver sql server.

L'arborescence de mon projet est maitenant le suivant :

http://cjoint.com/data/gCpnNZCh70.htm

Le fichier sqljdbc_auth.dll est nécessaire car sinon j'obtenais une exception.

Le programme fonctionne normalement avec Eclipse mais ça se gâte encore avec Java Web Start.

Tous les fichiers et jar sont placés ici :

http://cjoint.com/data/gCpqhYq3rt.htm

J'ai mis le fichier sqljdbc_auth.dll dans l'archive testNtiveLib.jar

test.jnlp :

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+" codebase="http://localhost/Local-Site-A/" href="test.jnlp">

<information>
	<title>Mon Logiciel par JNLP</title>
	<vendor>Pierre Sylvestre</vendor>

</information>

<security>
	<all-permission/>
</security>

<resources>
	<j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se"/>
	<jar href="http://localhost/Local-Site-A/test.jar"/>
	<jar href="http://localhost/Local-Site-A/lib/jfreechart-1.0.5.jar"/>
	<jar href="http://localhost/Local-Site-A/lib/junit.jar"/">
	<jar href="http://localhost/Local-Site-A/lib/itext-2.0.1.jar"/>
	<jar href="http://localhost/Local-Site-A/lib/jfreechart-1.0.5.jar"/>
	<jar href="http://localhost/Local-Site-A/lib/jfreechart-1.0.5-experimental.jar"/>
	<jar href="http://localhost/Local-Site-A/lib/servlet.jar"/>
	<jar href="http://localhost/Local-Site-A/lib/jcommon-1.0.9.jar"/>
	<jar href="http://localhost/Local-Site-A/lib/jfreechart-1.0.5-swt.jar"/>
	<jar href="http://localhost/Local-Site-A/lib/swtgraphics2d.jar"/>
	<jar href="http://localhost/Local-Site-A/sqljdbc.jar"/>
	<jar href="http://localhost/Local-Site-A/testNativeLib.jar"/>
</resources>

<application-desc main-class="MonMenu" />

</jnlp>

Ensuite je lance JWS, et j'obtiens :

Je mets toutes les étapes :

http://cjoint.com/data/gCpuOEZfYj.htm

http://cjoint.com/data/gCpwrohVRe.htm

http://cjoint.com/data/gCpxEgtlXM.htm

http://cjoint.com/data/gCpyYfLQYX.htm

et pour l'exception, c'est :

java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.javaws.Launcher.executeApplication(Unknown Source)
at com.sun.javaws.Launcher.executeMainClass(Unknown Source)
at com.sun.javaws.Launcher.doLaunchApp(Unknown Source)
at com.sun.javaws.Launcher.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ExceptionInInitializerError
at com.microsoft.sqlserver.jdbc.SQLServerConnection$1LogonProcessor.<init>(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.sendLogon(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.logon(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.access$000(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection$LogonCommand.doExecute(Unknown Source)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.loginWithoutFailover(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at MonMenu.main(MonMenu.java:605)
... 9 more
Caused by: java.security.AccessControlException: access denied (java.lang.RuntimePermission loadLibrary.sqljdbc_auth)
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.checkLink(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at com.microsoft.sqlserver.jdbc.AuthenticationJNI.<clinit>(Unknown Source)
... 23 more

Lien vers le commentaire
Partager sur d’autres sites

Apparemment le driver SQLServer nécessite certaines permissions spéciales pour s'exécuter. Or, Java Web Start est sécurisé et fait tourner les applications dans un environnement protégé, qui ne permet pas, par défaut, le genre d'opérations que le driver SQLServer tente d'effectuer.

A mon avis, il faut que tu signes les jars de ton application et que tu règles les permissions correctement. Voir la doc de Java Web Start.

Lien vers le commentaire
Partager sur d’autres sites

J'ai réussi à régler quelques soucis mais il en reste encore ...

J'ai signé toutes les archives mais arrivé au jar sqljdbc.jar, j'obtiens une erreur

Microsoft Windows XP [version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

D:\Documents and Settings\pierre\Desktop\lib>jarsigner -keystore monStore -signe
djar sSQLJDBC.jar sqljdbc.jar signature
Enter Passphrase for keystore: *****
jarsigner: unable to sign jar: java.util.zip.ZipException: invalid entry compres
sed size (expected 6093 but got 6065 bytes)

Comment corrigé ça ?

Donc j'ai essayé de lancer le JWS sans avoir signé ce jar et j'obtiens :

Erreur : Les ressources jar n'ont pas été signés à l'aide du même certificat :

Fichier de lancement :

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+" codebase="http://localhost/Local-Site-A/" href="test.jnlp">

<information>
	<title>Mon Logiciel par JNLP</title>
	<vendor>Pierre Sylvestre</vendor>

</information>

<security>
	<all-permissions/>
</security>

<resources>		
	<j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se"/>
	<jar href="http://localhost/Local-Site-A/lib/sTest.jar"/>
	<jar href="http://localhost/Local-Site-A/lib/sFreeChart.jar"/>
	<jar href="http://localhost/Local-Site-A/lib/sUnit.jar"/">
	<jar href="http://localhost/Local-Site-A/lib/sText.jar"/>
	<jar href="http://localhost/Local-Site-A/lib/sFreeChartExperimental.jar"/>
	<jar href="http://localhost/Local-Site-A/lib/sServlet.jar"/>
	<jar href="http://localhost/Local-Site-A/lib/sCommon.jar"/>
	<jar href="http://localhost/Local-Site-A/lib/sFreeChartSWT.jar"/>
	<jar href="http://localhost/Local-Site-A/lib/sSWT2d.jar"/>
	<jar href="http://localhost/Local-Site-A/lib/sqljdbc.jar"/>
</resources>

<resources os="Windows">
	<nativelib href="sAuth.jar"/>		
</resources>

<application-desc main-class="MonMenu" />

</jnlp>

Exception :

JNLPException[category: Erreur dans le fichier de lancement : Exception: null : LaunchDesc: 
<jnlp spec="1.0+" codebase="http://localhost/Local-Site-A/" href="http://localhost/Local-Site-A/test.jnlp">
 <information>
<title>Mon Logiciel par JNLP</title>
<vendor>Pierre Sylvestre</vendor>
<homepage href="null"/>
 </information>
 <security>
<all-permissions/>
 </security>
 <update check="timeout" policy="always"/>
 <resources>
<java href="http://java.sun.com/products/autodl/j2se" version="1.6+"/>
<jar href="http://localhost/Local-Site-A/lib/sTest.jar" download="eager" main="false"/>
<jar href="http://localhost/Local-Site-A/lib/sFreeChart.jar" download="eager" main="false"/>
<jar href="http://localhost/Local-Site-A/lib/sUnit.jar" download="eager" main="false"/>
<jar href="http://localhost/Local-Site-A/lib/sFreeChartExperimental.jar" download="eager" main="false"/>
<jar href="http://localhost/Local-Site-A/lib/sServlet.jar" download="eager" main="false"/>
<jar href="http://localhost/Local-Site-A/lib/sCommon.jar" download="eager" main="false"/>
<jar href="http://localhost/Local-Site-A/lib/sFreeChartSWT.jar" download="eager" main="false"/>
<jar href="http://localhost/Local-Site-A/lib/sSWT2d.jar" download="eager" main="false"/>
<jar href="http://localhost/Local-Site-A/lib/sqljdbc.jar" download="eager" main="false"/>
<nativelib href="http://localhost/Local-Site-A/sAuth.jar" download="eager" main="false"/>
 </resources>
 <application-desc main-class="MonMenu"/>
</jnlp> ]
at com.sun.javaws.LaunchDownload.checkSignedResourcesHelper(Unknown Source)
at com.sun.javaws.LaunchDownload.checkSignedResources(Unknown Source)
at com.sun.javaws.Launcher.prepareLaunchFile(Unknown Source)
at com.sun.javaws.Launcher.prepareToLaunch(Unknown Source)
at com.sun.javaws.Launcher.launch(Unknown Source)
at com.sun.javaws.Main.launchApp(Unknown Source)
at com.sun.javaws.Main.continueInSecureThread(Unknown Source)
at com.sun.javaws.Main$1.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

Lien vers le commentaire
Partager sur d’autres sites

Ca a été long mais j'ai enfin réussi à faire fonctionner mon programme avec JWS.

Pour ce qui est de mon erreur précédente, je l'ai résolu en décompressant sqljdbc.jar puis j'ai viré le répertoire qui contenait le fichier manifest puis j'ai recrée l'archive. Je l'ai signé. Et ça fonctionne maitenant.

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...