[RISOLTO] java.lang.NoClassDefFoundError e dipendenze

C, C++, Java, ...
Rispondi
elatorre
Newbie
Newbie
Messaggi: 22
Iscritto il: 13/03/2015, 12:28
Località: Pomezia (ROMA)
Contatta:

[RISOLTO] java.lang.NoClassDefFoundError e dipendenze

Messaggio da elatorre »

Salve a tutti.

Dopo estenuanti ricerche non sono riuscito a trovare la soluzione.

Distro: Debian 10;
IDE: Apache NetBeans;
JDK: 14;
Utility to compile: Maven

Nel pom ho aggiunto la dipendenza (come riportato dal repository):

Codice: Seleziona tutto

<!-- https://mvnrepository.com/artifact/com.udojava/EvalEx -->
        <dependency>
            <groupId>com.udojava</groupId>
            <artifactId>EvalEx</artifactId>
            <version>2.5</version>
        </dependency>
In "run" tutto ok, ma se provo a creare il "build", dopo il comando:

Codice: Seleziona tutto

java -jar [Calculator.jar]
il risultato è:

Codice: Seleziona tutto

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: com/udojava/evalex/Expression
        at Calculator.jButton16ActionPerformed(Calculator.java:343)
        at Calculator.access$1400(Calculator.java:16)
        at Calculator$15.actionPerformed(Calculator.java:170)
        at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
        at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
        at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
        at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
        at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)
        at java.desktop/java.awt.Component.processMouseEvent(Component.java:6636)
        at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
        at java.desktop/java.awt.Component.processEvent(Component.java:6401)
        at java.desktop/java.awt.Container.processEvent(Container.java:2263)
        at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5012)
        at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
        at java.desktop/java.awt.Component.dispatchEvent(Component.java:4844)
        at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4919)
        at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4548)
        at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4489)
        at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
        at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2764)
        at java.desktop/java.awt.Component.dispatchEvent(Component.java:4844)
        at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
        at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
        at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
        at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
        at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
        at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
        at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
        at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
        at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
        at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
        at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.lang.ClassNotFoundException: com.udojava.evalex.Expression
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
        ... 38 more
Grazie per il supporto.
Allegati
calculator.PNG
Ultima modifica di elatorre il 31/07/2020, 8:12, modificato 3 volte in totale.
Aki
Hero Member
Hero Member
Messaggi: 9970
Iscritto il: 27/12/2007, 16:59

Re: java.lang.NoClassDefFoundError: com/udojava/evalex/Expre

Messaggio da Aki »

Codice: Seleziona tutto

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: com/udojava/evalex/Expression
        at Calculator.jButton16ActionPerformed(Calculator.java:343)
Dall’errore indicato ipotizzo che la classe com/udojava/evalex/Expression non sia trovata perché non inclusa nel progetto da cui è stato generato il file che hai indicato con il nome "progetto.jar" (creato, ipotizzo, con il "build") e, quindi, non è stata trovata quando il "progetto.jar" è stato eseguito con il comando java -jar . In alternativa la classe non trovata potrebbe non essere nella classpath configurata nell’ambiente Java da riga di comando.
elatorre ha scritto: Dopo estenuanti ricerche non sono riuscito a trovare la soluzione.

Distro: Debian 10;
IDE: Apache NetBeans;
JDK: 14;
Utility to compile: Maven
Dal momento che l'errore che riferisci e le immagini che hai allegato sono relative ad un progetto chiamato "Calculator", non capisco cosa c'entra maven e perché l'hai indicata come "Utility to compile". Inoltre, sarebbe utile che specificassi quale versione della jdk stai usando (Openjdk da repository Debian ? Oracle Java JDK in bundle con netbeans ?)
⢀⣴⠾⠻⢶⣦⠀
⣾⠁⢠⠒⠀⣿⡁ Debian - The universal operating system
⢿⡄⠘⠷⠚⠋⠀ https://www.debian.org
⠈⠳⣄⠀
elatorre
Newbie
Newbie
Messaggi: 22
Iscritto il: 13/03/2015, 12:28
Località: Pomezia (ROMA)
Contatta:

Re: java.lang.NoClassDefFoundError: com/udojava/evalex/Expre

Messaggio da elatorre »

Ciao Aki; proverò ad essere più chiaro ;D

1) Dall’errore indicato ipotizzo che la classe [com/udojava/evalex/Expression] non sia trovata perché non inclusa nel progetto ...

Ho copiato da qui https://javalibs.com/artifact/com.udojava/EvalEx le direttive per Maven:

Codice: Seleziona tutto

<dependency>
   <groupId>com.udojava</groupId>
   <artifactId>EvalEx</artifactId>
   <version>2.5</version>
</dependency>
che ho inserito nel POM, per risolvere le dipendenze necessarie.

2) in [~/.m2/repository/com/udojava/EvalEx/2.5/], dopo aver lanciato [clean and build project] da NetBeans, trovo il jar scaricato:
EvalEx-2.5.jar
EvalEx-2.5.jar.sha1
EvalEx-2.5.pom
EvalEx-2.5.pom.sha1
_remote.repositories

3) La versione di java, scaricata dal sito Oracle (in bundle con NetBeans) è la:
java version "14.0.2" 2020-07-14
Java(TM) SE Runtime Environment (build 14.0.2+12-46)
Java HotSpot(TM) 64-Bit Server VM (build 14.0.2+12-46, mixed mode, sharing)

4) Riguardo a Maven, mi sono espresso male io, intendevo il gestore dei progetti per automatizzare il build (da qui l'imprecisione di utility per compilare).

5) Se il problema è dovuto al classpath, significa che il compilatore non sa dove trovare [EvalEx-2.5.jar]? Corretto? Se si, come potrei fare?

Grazie per il supporto.
Aki
Hero Member
Hero Member
Messaggi: 9970
Iscritto il: 27/12/2007, 16:59

Re: java.lang.NoClassDefFoundError: com/udojava/evalex/Expre

Messaggio da Aki »

Puoi esportare il progetto da Netbeans e condividerlo come file zip qui sul forum (ad esempio, se di dimensione compatibile, in allegato ad un messaggio del forum) ?
⢀⣴⠾⠻⢶⣦⠀
⣾⠁⢠⠒⠀⣿⡁ Debian - The universal operating system
⢿⡄⠘⠷⠚⠋⠀ https://www.debian.org
⠈⠳⣄⠀
elatorre
Newbie
Newbie
Messaggi: 22
Iscritto il: 13/03/2015, 12:28
Località: Pomezia (ROMA)
Contatta:

Re: java.lang.NoClassDefFoundError: com/udojava/evalex/Expre

Messaggio da elatorre »

Certamente.

Vorrei, in vista futura, comprendere come allegare [Jar] di terze parti nei miei progetti Java... ;D

Grazie per il supporto.
Allegati
Calculator.zip
Progetto test di una calcolatrice in Java.
(14.14 KiB) Scaricato 96 volte
Aki
Hero Member
Hero Member
Messaggi: 9970
Iscritto il: 27/12/2007, 16:59

Re: java.lang.NoClassDefFoundError: com/udojava/evalex/Expre

Messaggio da Aki »

elatorre ha scritto: Vorrei, in vista futura, comprendere come allegare [Jar] di terze parti nei miei progetti Java.
Se utilizzi Maven per la gestione delle dipendenze e della creazione dei file di progetto, puoi configurare il progetto per utilizzare il "Maven Assembly Plugin " (vedi https://maven.apache.org/plugins/maven- ... usage.html).
Nel caso del progetto di esempio che hai portato all'attenzione del forum, puoi modificare la sezione <build> del file pom.xml in questo modo (ho modificato il file che mi inviato con la esportazione del progetto):

Codice: Seleziona tutto

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>FirstGUI</groupId>
    <artifactId>Calculator</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>
    <dependencies>
        <dependency>
            <groupId>org.netbeans.external</groupId>
            <artifactId>AbsoluteLayout</artifactId>
            <version>RELEASE120</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.udojava/EvalEx -->
        <dependency>
            <groupId>com.udojava</groupId>
            <artifactId>EvalEx</artifactId>
            <version>2.5</version>
        </dependency>
    </dependencies>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>Calculator</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <!-- NOTE: We don't need a groupId specification because the group is
                     org.apache.maven.plugins ...which is assumed by default.
                 -->
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.3.0</version>
                <configuration>
                        <descriptorRefs>
                              <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                        <archive>
                         <manifest>
                               <mainClass>Calculator</mainClass>
                         </manifest>
                       </archive>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id> <!-- this is used for inheritance merges -->
                        <phase>package</phase> <!-- bind to the packaging phase -->
                        <goals>
                            <goal>single</goal>
                        </goals>
                </execution>
                </executions>                
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src</directory>
            </resource>
        </resources>
    </build>
</project>
Ridando il comando di build del progetto, sarà creato un file chiamato "Calculator-1.0-jar-with-dependencies.jar" che contiene i moduli jar indicati nel progetto come dipendenze e lo potrai avviare, ad esempio, usando la riga di comando dalla directory ./target del progetto con il comando:

Codice: Seleziona tutto

java -jar Calculator-1.0-jar-with-dependencies.jar
L'ho provato e funziona correttamente. Naturalmente, la dimensione del file jar con incluse le dipendenze è molto maggiore di quando non sono incluse.
⢀⣴⠾⠻⢶⣦⠀
⣾⠁⢠⠒⠀⣿⡁ Debian - The universal operating system
⢿⡄⠘⠷⠚⠋⠀ https://www.debian.org
⠈⠳⣄⠀
elatorre
Newbie
Newbie
Messaggi: 22
Iscritto il: 13/03/2015, 12:28
Località: Pomezia (ROMA)
Contatta:

java.lang.NoClassDefFoundError: com/udojava/evalex/Expressio

Messaggio da elatorre »

Gentilissimo Aki, confermo l'esito positivo del tuo intervento.

Il Jar ora funziona correttamente; grazie per l'info sul "Maven Assembly Plugin", che andrò ad approfondire. ;D

A questo punto, riformulo l'oggetto del post con un generico "java.lang.NoClassDefFoundError"; potrà essere utile per chiunque avesse problemi con dipendenze.

Ancora grazie,

Emanuele.
Aki
Hero Member
Hero Member
Messaggi: 9970
Iscritto il: 27/12/2007, 16:59

Re: [RISOLTO] java.lang.NoClassDefFoundError e dipendenze

Messaggio da Aki »

Felice di esserti stato d’aiuto
⢀⣴⠾⠻⢶⣦⠀
⣾⠁⢠⠒⠀⣿⡁ Debian - The universal operating system
⢿⡄⠘⠷⠚⠋⠀ https://www.debian.org
⠈⠳⣄⠀
Rispondi