Forum Programmation.java Petit soucis à la c**, mais qui fait ch***

Posté par  .
Étiquettes :
0
18
mai
2007
Salut à tous,

J'expose le contexte : je veux executer une commande, récupérer le contenu, et mettre à jour une base de données.

Distrib : Fedora Core 6, en ssh.

Java : java version "1.4.2" gij (GNU libgcj) version 4.1.1 20070105 (Red Hat 4.1.1-51) - jrefactory 2.8.6-9

script :
package conso;
import java.sql.*;
import java.io.*;
/**
* @author Yami
*/
public class Main {
static Main conso = null;

dbconnect db = new dbconnect();
String driver = dbconnect.getDriver();
String host = dbconnect.getHost();
String user = dbconnect.getUser();
String pass = dbconnect.getPassword();
Connection conn = null; Statement st = null; ResultSet rs = null;

String id = new String();
String ip = new String();
String port = new String();
String cmd = new String();
String result = new String();

public Main() {
//séléction des serveurs
try {
Class.forName(driver);
conn = DriverManager.getConnection(host, user, pass);
st = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
rs = st.executeQuery("SELECT ....");
rs.first();
do {
//execution de la commande
id = rs.getString("id");
cmd = "ps ax -o\"%C %z %a\" |grep hlds_i686 |grep " + rs.getString("ip") + " |grep " + rs.getString("port") + " |grep -v grep";

try {
Runtime r = Runtime.getRuntime();
Process p = r.exec(cmd);

String s =null;
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
StringBuffer buffer = new StringBuffer();
while ((s = reader.readLine()) != null) {
buffer.append(s);
}
result = buffer.toString();
}catch(Exception e) {System.out.println("erreur d'execution " + cmd + e.toString());}

//Mise en place du résultat dans un tableau sans espaces
String[] array = result.split(" ");

st.execute("INSERT ...");
}while(rs.next());
}
catch (ClassNotFoundException ex) { System.out.println("Erreur Driver"); }
catch(SQLException s) {System.out.println("Erreur SQL : "+s.getErrorCode()+" "+s.getMessage());
}
}


et voilà, après un javac Main.java dbconnect.java , le problème se situe à l'execution : java Main.java

j'ai cette erreur :
java Main.java dbconnect.java
Exception in thread "main" java.lang.NoClassDefFoundError: Main.java
at gnu.java.lang.MainThread.run(libgcj.so.7rh)
Caused by: java.lang.ClassNotFoundException: Main.java not found in gnu.gcj.runt ime.SystemClassLoader{urls=[file:./], parent=gnu.gcj.runtime.ExtensionClassLoade r{urls=[], parent=null}}
at java.net.URLClassLoader.findClass(libgcj.so.7rh)
at gnu.gcj.runtime.SystemClassLoader.findClass(libgcj.so.7rh)
at java.lang.ClassLoader.loadClass(libgcj.so.7rh)
at java.lang.ClassLoader.loadClass(libgcj.so.7rh)
at gnu.java.lang.MainThread.run(libgcj.so.7rh)


Je désepères, aucune de mes recherches n'a abouti peut-être que quelqu'un aurait une idée.

Et au passage, ca n'a rien à voir avec Java, mais si quelqu'un connait la commande unix permettant d'afficher la bande passante utilisée par un processus.
  • # .

    Posté par  . Évalué à 3.

    Hum .. J'ai l'impression qu'il y a plusieurs erreurs :
    - je ne vois pas de méthode main : public static void main (String args) : prototype obligatoire de la fonction main
    - la commande java prend en argument le nom de la classe principale contenant la méthode main. Dans ton cas, tu devrais dire java Main (sans l'extension .class)
    • [^] # Re: .

      Posté par  . Évalué à 0.

      - la méthode main : public static void main (String args) est présente, elle est juste pas passée au c/c.

      - ca change rien.
      • [^] # Re: .

        Posté par  . Évalué à 3.

        Pourrais tu poster (ou mettre un lien si c'est trop gros) vers ton source complet ? car il s'agit d'un problème de chargment de classe, ca nous permettra de tester de notre coté et voir ce qui ne vas pas.
    • [^] # Re: .

      Posté par  . Évalué à 4.

      Le nouveau Pierre Tramo ? :-)
      • [^] # Re: .

        Posté par  . Évalué à -1.

        vais me démerder sans vous ciao
  • # Hum

    Posté par  (site web personnel) . Évalué à 2.

    C'e** f*****
    L* p******* v*** d* l* j**, e*** d*** ê*** m** c*********.
    J* t* c****** d'a**** v** à c**** a****** : h***://j***.s**.c**/j*****/6/d***/a**/i****.h***
  • # Bon

    Posté par  (site web personnel) . Évalué à 2.

    Alors, je n'y connait plus grand chose en java, mais amha ton problème
    doit avoir un lien avec le 'package conso' en tout début qui cree un
    namespace et donc rend la classe Main inaccessible en tant que tel.

    Autre chose ta commande est optimisable (un peu):
    cmd = "ps ax -o\"%C %z %a\" |grep [h]lds_i686 |grep " + rs.getString("ip") + " |grep " + rs.getString("port");

    Quand à la bande passante utilisée par processus, comment dire... le kernel ne garde pas cette information c'est donc à toi de la calculer en passant l'interface en promiscuous et en comptant les paquets emis ou a destination du port utilise par ton processus sur un intervalle de temps.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.