[JAVA] java.lang.NoClassDefFoundError*

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
edit:
De foutmelding is uiteraard: java.lang.NoClassDefFoundError
De melding in de titel heb ik verkeerd geplakt en die kan ik niet meer wijzigen zie ik.

Ik weet dat mijn probleem vaker voorkomt want ik heb al heel wat gezocht d.m.v. google en de zoekmachine op GOT, maar ik kom er na uren er mee "gespeeld" te hebben toch niet uit.
Het zit als volgt:

Ik heb een class Person.java gemaakt met als package lw.user. De structuur is dan
/src/lw/user/Person.java

De class is erg simpel. Puur voor testing doeleinden:
Java:
1
2
3
4
5
6
7
8
9
10
package lw.user;

public class Person
{

    public static void main(String[] args)
    {
        System.out.println("hoi"); 
    }
}

Wanneer ik dit bestand vanuit Eclipse opsla wordt die automatisch gecompileerd. Structuur
/build/classes => gecompileerde bestanden
/src/* => source bestanden

Wanneer ik nu dmv java bovenstaande class wil uitvoeren (java Person) krijg ik dus deze foutmelding:
Exception in thread "main" java.lang.NoClassDefFoundError: Person (wrong name: lw/user/Person)

Terwijl ik zowel het build als src pad heb toegevoegd aan de environment variable CLASSPATH.

Daarnaast heb ik een class Animal.java gemaakt zonder package en wanneer ik die uitvoer dmv
java Animal (gecompileerde file) dan werkt het wel en wordt de main() methode wel netjes uitgevoerd.

Wat doe ik verkeerd? Wat is daarnaast de beste plaats om .jar files van bijv. externe tools zoals json op te slaan? In de ext lib van JDK of een eigen lib folder in je webapps dir?
ZO ja, moet je die lib pad dan ook toevoegen aan je CLASSPATH?

[ Voor 5% gewijzigd door een moderator op 29-07-2009 09:43 . Reden: code tags toegevoegd ]


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Wellicht moet je aan het begin van je classpath gaan staan (dus voor lw) en dan java lw.user.Person aanroepen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat wellicht betekend vast "je moet" ;) , maar dat werkt inderdaad prima! Dank hiervoor.
Zou je ook mijn vraag m.b.t. .jar files kunnen beantwoorden?

Ander puntje wat hier betrekking op heeft. Ik heb een jsp bestand gemaakt en vanuit het JSP bestand zou ik graag de methodes van Person willen oppakken.

Ik heb daarvoor in mijn project het bestand index.jsp aangemaakt met de volgende code:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@page import="lw.user.Person"%>
<%@page import="java.util.Date"%><html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Insert title here</title>
</head>
<body>
Test tekst
</body>
</html>

Zoals te zien is importeer ik lw.user.Person. Echter.... java vindt dat dit niet mag want ik krijg de volgende error:

org.apache.jasper.JasperException: Unable to compile class for JSP:


An error occurred at line: 6 in the generated java file
Only a type can be imported. lw.user.Person resolves to a package


Uit verschillende zoekresultaten van Google begrijp ik dat ook dit met het classpath te maken heeft.
Wat gaat hier verkeerd of met andere woorden... wat doe ik hier verkeerd?

[ Voor 0% gewijzigd door een moderator op 29-07-2009 09:43 . Reden: code tags toegevoegd ]


Acties:
  • 0 Henk 'm!

  • Standeman
  • Registratie: November 2000
  • Laatst online: 19-09 14:35

Standeman

Prutser 1e klasse

Verwijderd schreef op dinsdag 28 juli 2009 @ 19:21:
edit:
...
Wat is daarnaast de beste plaats om .jar files van bijv. externe tools zoals json op te slaan? In de ext lib van JDK of een eigen lib folder in je webapps dir?
ZO ja, moet je die lib pad dan ook toevoegen aan je CLASSPATH?
Ik heb altijd een /lib/ directory in mijn app staan. In de ext lib van je JDK is opzich geen goed idee. Zeker wanneer je meerdere applicaties hebt die van verschillende JSON versies gebruik maken.

En ja, je moet ze in je classpath toevoegen bijv: java -cp lib/json.jar lw.user.Person

Over je tweede probleem:
Lees wat meer over servlet containers (ik gok even dat je Tomcat gebruikt). In ieder geval worden JSP files intern gecompileerd tot een servlet (dat doet Jasper). Als Jasper geen classes die in de import staan niet kan vinden, krijg je dus deze melding.

Over het algemeen worden lib's opgeslagen in webapps/WEB-INF/lib, classes in webapps/WEB-INF/classes

Tip: maak in eclipse eens een webproject aan met een eenvoudige class en JSP en kijk dan eens in de WAR file welke gebouwd wordt.

[ Voor 28% gewijzigd door Standeman op 29-07-2009 09:45 ]

The ships hung in the sky in much the same way that bricks don’t.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
@leedert_w: Als je code post, gebruik dan a.u.b. code tags.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Stephan Oudmaijer
  • Registratie: Oktober 2000
  • Laatst online: 16-08-2023
Het lijkt erop dat je met een webapp bezig bent. Ik zou je classes naar WEB-INF/classes compileren.

Tevens een main aanroepen vanuit een webpagina is nogal vreemd :-) Misschien gewoon een Object aanmaken en vanuit je jsp een Object instantieren en daarna een functie aanroepen?

Ik zou ook eens gebruik gaan maken van een framework (apache wicket?) om webapps te bouwen, classes aanroepen vanuit je jsp`s is zooooooo jaren 90 ;-)
Verwijderd schreef op dinsdag 28 juli 2009 @ 19:58:
Ander puntje wat hier betrekking op heeft. Ik heb een jsp bestand gemaakt en vanuit het JSP bestand zou ik

[ Voor 50% gewijzigd door Stephan Oudmaijer op 29-07-2009 09:50 ]


Acties:
  • 0 Henk 'm!

  • Standeman
  • Registratie: November 2000
  • Laatst online: 19-09 14:35

Standeman

Prutser 1e klasse

Stephan Oudmaijer schreef op woensdag 29 juli 2009 @ 09:46:
Het lijkt erop dat je met een webapp bezig bent. Ik zou je classes naar WEB-INF/classes compileren.

Tevens een main aanroepen vanuit een webpagina is nogal vreemd :-) Misschien gewoon een Object aanmaken en vanuit je jsp een Object instantieren en daarna een functie aanroepen?

Ik zou ook eens gebruik gaan maken van een framework (apache wicket?) om webapps te bouwen, classes aanroepen vanuit je jsp`s is zooooooo jaren 90 ;-)


[...]
offtopic:
Laten we die jongen nou niet direct bedelven onder de frameworks. ;) (Overigens, zijn JSP's uberhaupt zooo jaren 90 :p )

The ships hung in the sky in much the same way that bricks don’t.


Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Standeman schreef op woensdag 29 juli 2009 @ 09:54:
[...]

offtopic:
Laten we die jongen nou niet direct bedelven onder de frameworks. ;) (Overigens, zijn JSP's uberhaupt zooo jaren 90 :p )
Als je JSF gebruikt, zit je over het algemeen ook gewoon in een JSP...

Acties:
  • 0 Henk 'm!

  • Standeman
  • Registratie: November 2000
  • Laatst online: 19-09 14:35

Standeman

Prutser 1e klasse

Remus schreef op woensdag 29 juli 2009 @ 09:57:
[...]

Als je JSF gebruikt, zit je over het algemeen ook gewoon in een JSP...
offtopic:
Liever facelets :) Maar nu gaan we wel erg off-topic.

[ Voor 10% gewijzigd door Standeman op 29-07-2009 10:16 ]

The ships hung in the sky in much the same way that bricks don’t.


Acties:
  • 0 Henk 'm!

  • Stephan Oudmaijer
  • Registratie: Oktober 2000
  • Laatst online: 16-08-2023
ja idd jsp`s zijn ook vrij retro ;-)

met jsf moet je IMHO jsp`s sowieso niet gebruiken... maarja, JSF :X :? 8)7 |:( O-)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt mensen! Het is allemaal gelukt.

Ik weet trouwens dat JSP iets was van eind jaren '90, maar je moet toch ergens beginnen hé.
Het ging mij vooral om de indeling en het opzetten van het project. Binnenkort maar eens aan een framework beginnen.

Acties:
  • 0 Henk 'm!

  • Standeman
  • Registratie: November 2000
  • Laatst online: 19-09 14:35

Standeman

Prutser 1e klasse

Stephan Oudmaijer schreef op woensdag 29 juli 2009 @ 19:27:
ja idd jsp`s zijn ook vrij retro ;-)

met jsf moet je IMHO jsp`s sowieso niet gebruiken... maarja, JSF :X :? 8)7 |:( O-)
Ik ben anders redelijk positief over JSF. De learning curve is misschien wat hoog, maar als je het framework eenmaal door hebt (zoals custom converters en validators) vind ik het prima werken ten opzichte van bijv. Struts e.d.
Verwijderd schreef op donderdag 30 juli 2009 @ 11:14:
Bedankt mensen! Het is allemaal gelukt.

Ik weet trouwens dat JSP iets was van eind jaren '90, maar je moet toch ergens beginnen hé.
Het ging mij vooral om de indeling en het opzetten van het project. Binnenkort maar eens aan een framework beginnen.
Ach, het maakt op zich niet uit. JSP wordt echt nog wel heel veel gebruikt. Misschien niet het nieuwste van het nieuwste, maar het werkt op zich prima.

[ Voor 10% gewijzigd door Standeman op 30-07-2009 11:57 ]

The ships hung in the sky in much the same way that bricks don’t.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Waar ik nog wel benieuwd naar ben is het volgende. Nu heb ik al mijn verschillende classes in verschillende packages staan in mijn src folder.
Is dat prima of moet je ze allemaal "jarren" en ook in je lib folder laten lopen?

Kortom: wat moet er nu allemaal precies in je src folder en wat in je lib? In je src al je eigen .java code en in je lib allerlei externe tools zoals bijv. mysql connector?

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 19-09 08:51

Janoz

Moderator Devschuur®

!litemod

In de lib horen alle JARs en in je src je eigen sources.

Onderstaande is enkel nodig wanneer je je applicatie ook ergens anders wilt draaien buiten de IDE.

Als je dan klaar bent compileer je alle *.java in src naar *.class en die *.class bestanden stop je, inclusief de folder structuur in je eigen jar. Bij die jar zul je vervolgens een zogenaamd manifest bestand moeten stoppen (bestand genaamt MANIFEST in een META-INF directory) en hierin configureer je van welke class de main methode aangeroepen moet worden en waar de externe jars staan.

Hoe dit allemaal exact gaat is wel ergens in wat tutorials te lezen. Mocht het zover komen dan kan ik je aanraden om eens naar wat build scripts te kijken die al deze handelingen voor je automatiseren. Denk daarbij aan ant en maven.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt! Ik ben momenteel al met ANT bezig en dat werkt inderdaad wat prettiger dan alles zelf te doen.

Acties:
  • 0 Henk 'm!

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Een IDE werkt nog prettiger. Eclipse is bijv. een populaire gratis IDE.

Je klikt op new -> project -> dynamic web project.
Je voegt wat java code toe onder "src" en wat JSP's onder "WebContent".
Als je klaar bent klik je met rechts op een JSP en in het context menu klik je op "Run on server". Je krijgt een dialoog waar je kun opgeven waar je server (zoals Tomcat) staat. Next next next next finish...
Er wordt een browser gestart en je kunt je app zien.

Classpath en zo wordt automatisch goed gezet.

Uit je probleem begrijp ik dat je pas net begonnen bent met Java, dus ik zou het zo gemakkelijk mogelijk houden. Eerst wat feeling krijgen met de taal en pas daarna gaan kijken naar classpath en details van servers en zo...

Fat Pizza's pizza, they are big and they are cheezy


Acties:
  • 0 Henk 'm!

Verwijderd

Als je het bestand interpreteerd, moet je wel weten dat de interpreter hoofdlettergevoelig is. Want zover ik die error heb gezien was dat omdat ik de naam verkeerd spelde of met alleen kleine letters.
Ook als de klasse public is, mag je de naam van het bestand niet veranderen want de class name moet gelijk zijn aan de naam van het bestand, ook kan het een object refferentie zijn van een niet bestaande of verkeerd gespelde klasse.

[ Voor 11% gewijzigd door Verwijderd op 31-07-2009 19:49 ]


Acties:
  • 0 Henk 'm!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Op zich heb je hier wel een vrij bijzondere situatie gecreeerd, want de NoClassDefFoundError is, in tegenstelling tot de ClassNotFoundException, redelijk zeldzaam. De laatste krijg je als de class tijdens het compileren wel op het classpath aanwezig was, maar tijdens het uitvoeren niet op het classpath aanwezig is. De eerste krijg je als de class ook tijdens het uitvoeren wel op het classpath aanwezig is, maar deze niet goed geladen kan worden, omdat een afhankelijkheid van die class niet gevonden kan worden. Zie bijvoorbeeld: http://www.jroller.com/sj..._and_noclassdeffounderror

Wie trösten wir uns, die Mörder aller Mörder?


Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Zo bijzonder is de beginnersfout van het niet meegeven van de fully qualified classname anders niet hoor :)

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Herko_ter_Horst schreef op vrijdag 31 juli 2009 @ 21:28:
Zo bijzonder is de beginnersfout van het niet meegeven van de fully qualified classname anders niet hoor :)
Ik betwijfel eigenlijk dat dat het (enige) probleem was.

Wie trösten wir uns, die Mörder aller Mörder?

Pagina: 1