Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    java.lang.NoClassDefFoundError:

    Salve a tutti

    devo realizzare un applet java che comunichi con la porta seriale, ho realizzato correttamente la firma e tutto il resto e sto utilizzando le librerie RXTXcomm per poter comunicare.

    il codice è il seguente:

    codice:
    package microcom;
    
    import javax.swing.JApplet;
    import gnu.io.*;
    import java.io.*;
    import java.util.*;
    
    public class comApplet extends JApplet {
    
        static Enumeration portList;
        static CommPortIdentifier portId;
        static String messageString = "\"articolo\"500H1R\n1T";
        static String param = "";
        static SerialPort serialPort;
        static OutputStream outputStream;
      
        /**
         * Initialization method that will be called after the applet is loaded
         * into the browser.
         */
        @Override
        public void init() {
          
           //System.setSecurityManager(null);             
           
           comApplet.class.getClassLoader().getResource("RXTXcomm.jar");                           
          
           portList = CommPortIdentifier.getPortIdentifiers();
                while (portList.hasMoreElements()) {
                portId = (CommPortIdentifier) portList.nextElement();
                if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
                     if (portId.getName().equals("COM1")) {
                    //if (portId.getName().equals("/dev/term/a")) {
                        try {
                            serialPort = (SerialPort)
                                portId.open("SimpleWriteApp", 2000);                            
                        } catch (PortInUseException e) {}
                        try {
                            outputStream = serialPort.getOutputStream();
                        } catch (IOException e) {}
                        try {
                            serialPort.setSerialPortParams(9600,
                                SerialPort.DATABITS_8,
                                SerialPort.STOPBITS_1,
                                SerialPort.PARITY_NONE);
                        } catch (UnsupportedCommOperationException e) {}
                        try {
                            outputStream.write(messageString.getBytes());
                        } catch (IOException e) {
                        
                           
                        
                        }
                    }
                }
            }           
        
        System.exit(0);
        }
        
        
        
        // TODO overwrite start(), stop() and destroy() methods
    }
    quando eseguo il codice però se sono sotto netbeans funziona mentre se lo metto sotto il browser, mi chiede correttamente di accettare il certificato ma poi mi da il seguente errore:

    Exception in thread "thread applet-microcom/comApplet.class-2" java.lang.NoClassDefFoundError: Could not initialize class gnu.io.CommPortIdentifier
    at microcom.comApplet.init(comApplet.java:31)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionR unnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

    io ho eseguito qualche ricerca e tempo fa un utente del forum ha avuto lo stesso problema e l'ha risolto inserendo questo comando: System.setSecurityManager(null); e gli è andata bene... ora però il l'ho remmato perché se lo metto mi da errore di security manager... qualcuno sa darmi un consiglio? GRAZIE!!!!


  2. #2
    Prova a fare Class.forName("gnu.io.CommPortIdentifier"); all'inizio di init() e vedi se ti da errore di ClassNotFoundException oppure altro.
    Leggendo in giro ho letto che quella libreria ha altre librerie (dll e so) che dovresti caricare.
    lolide
    Java Programmer

    Informati

  3. #3
    ciao, grazie per la risposta, l'ho inserito subito dopo init() e netbeans mi da il seguente errore:

    unreported exception java.lang.ClassNotFoundException; must be caught or declared to be thrown
    ----

    perdona la mia ignoranza in java ma io programmo in C# e PHP ma devo realizzare un applet che invia alla porta COM dei dati. Ho capito che devo preparare i certificati ed i permessi.., infatti ho notato che lanciando l'applet da browser in alcuni casi leggevo che l'accesso alla risorsa era negato. Infine ricevevo l'errore postato. Ho fatto come dice in questo blog: http://hacky.typepad.com/blog/2009/0...n-applets.html.. ma nulla! Sono disperato... devo riuscire a passare 'sti maledetti dati da php all'applet per poter stampare sul registratore di cassa del cliente... (devo usare java per forza perché deve essere multipiattaforma).

    Grazie mille in anticipo per l'aiuto.

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Devi usare il blocco try/catch (o aggiungere alla firma del metodo la clausola throws) perchè ci sono istruzioni che possono lanciare eccezioni e Java non permette che vi siano eccezioni incontrollate.

    Il compilatore ti dice anche a quale riga di quale file c'è l'istruzione "potenzialmente pericolosa".

    codice:
    try {
       ...  // Istruzioni potenzialmente pericolose
    } catch (TipoEccezione1 te1) {
       ...  // Gestione dell'eccezione 1
    } catch (TipoEccezione2 te2) {
       ...  // Gestione dell'eccezione 2
    } catch (Exception e) {
       ...  // Eccezione più generica di tutte
    } finally {
       ...  // codice che verrà eseguito sempre e comunque anche dopo l'eccezione
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Ecco... qualcosa è cambiato in effetti:

    l'errore che mi restituisce ora è questo:

    java.lang.NullPointerException
    at gnu.io.RXTXPort.setSerialPortParams(RXTXPort.java: 178)
    at microcom.comApplet.init(comApplet.java:48)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionR unnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

    la prima volta.. poi l'ho rilanciato

    java.lang.NullPointerException
    at microcom.comApplet.init(comApplet.java:45)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionR unnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)


    ossia questo comando: outputStream = serialPort.getOutputStream();

    prima almeno stampava in netbeans... ora manco più quello

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Posta il nuovo codice con il blocco try/catch. Può essere che vi sia un problema di scope.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Spero che tutto questo serva a qualcun'altro :-)

    ecco qui il codice:

    codice:
    package microcom;
    
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.swing.JApplet;
    import gnu.io.*;
    import java.io.*;
    import java.util.*;
    
    public class comApplet extends JApplet {
    
        static Enumeration portList;
        static CommPortIdentifier portId;
        static String messageString = "\"articolo\"500H1R\n1T";
        static String param = "";
        static SerialPort serialPort;
        static OutputStream outputStream;
      
        /**
         * Initialization method that will be called after the applet is loaded
         * into the browser.
         */
        @Override
        public void init() {
            try {
                Class.forName("gnu.io.CommPortIdentifier");
                 //System.setSecurityManager(null);
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(comApplet.class.getName()).log(Level.SEVERE, null, ex);
            }
           
           comApplet.class.getClassLoader().getResource("RXTXcomm.jar");                           
          
           portList = CommPortIdentifier.getPortIdentifiers();
                while (portList.hasMoreElements()) {
                portId = (CommPortIdentifier) portList.nextElement();
                if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
                     if (portId.getName().equals("COM1")) {
                    //if (portId.getName().equals("/dev/term/a")) {
                        try {
                            serialPort = (SerialPort)
                                portId.open("SimpleWriteApp", 2000);                            
                        } catch (PortInUseException e) {
                            Logger.getLogger(comApplet.class.getName()).log(Level.SEVERE, null, e);
                        }
                        try {
                            outputStream = serialPort.getOutputStream();
                        } catch (IOException e) {
                            Logger.getLogger(comApplet.class.getName()).log(Level.SEVERE, null, e);
                        }
                        try {
                            serialPort.setSerialPortParams(9600,
                                SerialPort.DATABITS_8,
                                SerialPort.STOPBITS_1,
                                SerialPort.PARITY_NONE);
                        } catch (UnsupportedCommOperationException e) {
                            Logger.getLogger(comApplet.class.getName()).log(Level.SEVERE, null, e);
                        }
                        try {
                            outputStream.write(messageString.getBytes());
                        } catch (IOException e) {
                        
                           Logger.getLogger(comApplet.class.getName()).log(Level.SEVERE, null, e);
                        
                        }
                    }
                }
            }           
        
        System.exit(0);
        }
        
        
        
        // TODO overwrite start(), stop() and destroy() methods
    }

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Allora, io le librerie RXTX le ho già usate, ma per un'applicazione stand-alone (non un'applet). Non dovrebbe cambiare molto, ad ogni modo, se non la necessità della firma, che mi pare tu abbia già fatto.

    codice:
            try {
                Class.forName("gnu.io.CommPortIdentifier");
                 //System.setSecurityManager(null);
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(comApplet.class.getName()).log(Level.SEVERE, null, ex);
            }
           
           comApplet.class.getClassLoader().getResource("RXTXcomm.jar");
    Tutto questo pezzo di codice è perfettamente inutile.
    Il suggerimento di lolide va bene per testare che la JVM veda le classi, ma di fatto non c'è necessità di caricarle esplicitamente.

    Soprattutto l'ultima delle righe sopra è perfettamente inutile, se RXTXcomm.jar è già nel CLASSPATH dell'applet.

    I miei dubbi tornano alla prima eccezione che hai ottenuto:

    codice:
    Exception in thread "thread applet-microcom/comApplet.class-2"
    java.lang.NoClassDefFoundError: Could not initialize class gnu.io.CommPortIdentifier
    Da qui una premessa: sul client deve essere presente la libreria dinamica nativa per l'interfacciamento con la seriale.

    Domanda: c'è sul client la DLL (per Windows) o il .so (per Unix/Linux) della libreria RXTX? Perchè sono necessarie per la corretta inizializzazione della libreria.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Si, le librerie dinamiche le ho caricate, anche perché, come ti ho già detto, se eseguo il codice tramite netbeans, cacchio mi funziona! Se eseguo la classe tramite browser mi da l'errore (ti parlo di questo: Exception in thread "thread applet-microcom/comApplet.class-2"
    java.lang.NoClassDefFoundError: Could not initialize class gnu.io.CommPortIdentifier
    )

    sono veramente confuso...

  10. #10
    Ecco... in una ricerca ho trovato un listato che da lo stesso errore:

    (il nullPointException)

    codice:
     
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package microcom;
    import java.io.*;
    import java.util.*;
    import gnu.io.*;
    import java.applet.Applet;
     
     
     
    public class portChooser extends Applet  
    {
         static Enumeration         portList;
            static CommPortIdentifier portId;
            static String           messageString = "\"articolo\"500H1R\n1T";
            static SerialPort	serialPort;
            static OutputStream     outputStream;
            static boolean          outputBufferEmptyFlag = false;
       
        @Override
         public void init() {
            //System.out.println("Path is " + System.getProperty("java.library.path"));
            //Path is C:\Sun\SDK\jdk\jre\bin
         }
         
        
        @Override
        public  void start() 
        {
    	boolean portFound = false;
    	String  defaultPort = "COM1";
     
    	portList = CommPortIdentifier.getPortIdentifiers();
     
    	while (portList.hasMoreElements()) {
     
    	    portId = (CommPortIdentifier) portList.nextElement();
     
    	    if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
     
    		if (portId.getName().equals(defaultPort)) {
    		    System.out.println("Found port " + defaultPort);
     
    		    portFound = true;
     
    		    try {
    			serialPort = 
    			    (SerialPort) portId.open("SimpleWrite", 100);
    		    } catch (PortInUseException e) {
    			System.out.println("Port in use.");
    			continue;
    		    } 
     
    		    try {
    			outputStream = serialPort.getOutputStream();
    		    } catch (IOException e) {}
     
    		    try {
    			serialPort.setSerialPortParams(9600, 
    						       SerialPort.DATABITS_8, 
    						       SerialPort.STOPBITS_1, 
    						       SerialPort.PARITY_NONE);
    		    } catch (UnsupportedCommOperationException e) {}
    	
    		    try {
    		    	serialPort.notifyOnOutputEmpty(true);
    		    } catch (Exception e) {
    			System.out.println("Error setting event notification");
    			System.out.println(e.toString());
    			System.exit(-1);
    		    }
    		  
    		    System.out.println(
    		    	"Writing \""+messageString+"\" to "
    			+serialPort.getName());
     
    		    try {
    			outputStream.write(messageString.getBytes());
    		    } catch (IOException e) {}
     
    		    try {
    		       Thread.sleep(200);  // Be sure data is xferred before closing
    		    } catch (Exception e) {}
    		    serialPort.close();
    		    System.exit(1);
    		} 
    	    } 
    	} 
     
    	if (!portFound) {
    	    System.out.println("port " + defaultPort + " not found.");
    	} 
        } 
     
     
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.