Java+ActiveMQ, errore

di il
5 risposte

Java+ActiveMQ, errore

Salve sto cercando di usare ActiveMQ, ho realizzato in java un sender e un receiver. Il problema è che se avvio da Eclipse il main prima di una e poi l'altra classe, il tutto funziona. Se le avvio da prompt col comando java cartella.Sender (o .Receiver), ottengo l' errore :
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: javax/jms/Message
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
        at java.lang.Class.privateGetMethodRecursive(Unknown Source)
        at java.lang.Class.getMethod0(Unknown Source)
        at java.lang.Class.getMethod(Unknown Source)
        at sun.launcher.LauncherHelper.validateMainClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Caused by: java.lang.ClassNotFoundException: javax.jms.Message
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 7 more
Da quello che ho potuto leggere è una questione di classe non trovata a tempo di esecuzione, ma che a tempo di compilazione c'è.
Forse è per la libreria activemq-all-5.14.5.jar, che non so dove debba essere copiata( la importo nel progetto come libreria esterna ma non basta effettivamente). Potreste aiutarmi? non riesco a capire l'errore.

5 Risposte

  • Re: Java+ActiveMQ, errore

    Qwerty1234 ha scritto:


    Se le avvio da prompt col comando java cartella.Sender (o .Receiver), ottengo l' errore :
    Error: A JNI error has occurred, please check your installation and try again
    Exception in thread "main" java.lang.NoClassDefFoundError: javax/jms/Message
    Immagino che "cartella" sia un tuo package (che poi si "riflette" in una cartella fisica) , giusto?

    Se sei su Windows:
    java -cp .;percorsodovesta\activemq-all-5.14.5.jar cartella.Sender
    Se invece su Linux/Unix, cambia ovviamente \ in / e usa : come separatore nel classpath.
  • Re: Java+ActiveMQ, errore

    Sì è un package.
    Ho dovuto solamente aggiungere un \ alla fine perché senza non partiva, non so perché però.
    Mi potresti spiegare la necessità di quel .; all'inizio? perché li devo aggiungere?
    Cmq grazie per l'aiuto .
  • Re: Java+ActiveMQ, errore

    Qwerty1234 ha scritto:


    Ho dovuto solamente aggiungere un \ alla fine perché senza non partiva, non so perché però.
    Alla fine di cosa?

    Qwerty1234 ha scritto:


    Mi potresti spiegare la necessità di quel .; all'inizio? perché li devo aggiungere?
    Il "classpath" è concettualmente un elenco di: a) directory; b) file jar che la JVM utilizza per andare a cercare classi/risorse varie.
    Si può impostare in diversi modi. Con i tool java/javac tramite l'opzione -cp.

    Quindi .;percorsodovesta\activemq-all-5.14.5.jar vuol dire:
    cerca (una certa classe/risorsa):
    prima nella directory corrente (".")
    poi nel activemq-all-5.14.5.jar in quel percorso

    Presuppone che tu abbia lanciato il comando dalla directory che CONTIENE la directory "cartella" perché è il package radice.
    Anche le TUE classi infatti devono essere rintracciabili!
  • Re: Java+ActiveMQ, errore

    andbin ha scritto:


    Qwerty1234 ha scritto:


    Ho dovuto solamente aggiungere un \ alla fine perché senza non partiva, non so perché però.
    Alla fine di cosa?
    Di nulla ho sbagliato io ad interpretare una cosa

    andbin ha scritto:


    Qwerty1234 ha scritto:


    Mi potresti spiegare la necessità di quel .; all'inizio? perché li devo aggiungere?
    Il "classpath" è concettualmente un elenco di: a) directory; b) file jar che la JVM utilizza per andare a cercare classi/risorse varie.
    Si può impostare in diversi modi. Con i tool java/javac tramite l'opzione -cp.

    Quindi .;percorsodovesta\activemq-all-5.14.5.jar vuol dire:
    cerca (una certa classe/risorsa):
    prima nella directory corrente (".")
    poi nel activemq-all-5.14.5.jar in quel percorso

    Presuppone che tu abbia lanciato il comando dalla directory che CONTIENE la directory "cartella" perché è il package radice.
    Anche le TUE classi infatti devono essere rintracciabili!
    Credo di aver capito, la mia classe viene rintracciata dal percorso definito dal . e le classi di activemq vengono rintracciate dal percorso percorsodovesta, e il ; ha lo scopo di separare i percorsi.

    Ho provato a cambiare percorso del jar aggiungendolo nella directory bin del progetto e ho notato che tutte questi comandi funzionano:
    
    java -cp .;.\activemq-all-5.14.5.jar cartella.Sender
    java -cp ;.\activemq-all-5.14.5.jar cartella.Sender
    java -cp ;\activemq-all-5.14.5.jar cartella.Sender
    
    Dove la differenza è solo la presenza o meno del . quindi suppongo che quando avvio normalmente il comando java package.Main si sottointende che il cp sia quello corrente per avviare la classe, giusto?
  • Re: Java+ActiveMQ, errore

    Qwerty1234 ha scritto:


    Credo di aver capito, la mia classe viene rintracciata dal percorso definito dal . e le classi di activemq vengono rintracciate dal percorso percorsodovesta, e il ; ha lo scopo di separare i percorsi.
    Il classpath infatti è solo un insieme di "basi" (directory/jar) da cui partire per trovare le classi/risorse.
    Se in classpath c'è una directory C:\Prove e la JVM deve cercare e caricare una classe com.esempio.Demo, allora andrà a cercare se c'è un:
    C:\Prove\com\esempio\Demo.class

    Questo è il motivo per cui i nomi di package si DEVONO sempre "riflettere" nelle cartelle (che siano "sciolte" sul file-system o che siano in jar, è lo stesso).

    Qwerty1234 ha scritto:


    Dove la differenza è solo la presenza o meno del .
    Effettivamente un elemento "vuoto" in classpath sembrerebbe corrispondere lo stesso al ".". Dovrei andare a vedere la documentazione ufficiale per verificare se ritrovo questa regola. Io personalmente, se devo mettere in classpath la directory corrente, esplicito sempre il "." .

    Qwerty1234 ha scritto:


    quindi suppongo che quando avvio normalmente il comando java package.Main si sottointende che il cp sia quello corrente per avviare la classe, giusto?
    Se usi -cp il classpath è definito solo da questa opzione.
    Se non usi -cp, il classpath è definito dalla variabile di ambiente CLASSPATH
    Se non c'è una variabile di ambiente CLASSPATH, il classpath è per default la directory "corrente".

    Stop, tutto qui.
Devi accedere o registrarti per scrivere nel forum
5 risposte