Avatar billede el-prebsi Nybegynder
03. juli 2003 - 00:06 Der er 28 kommentarer og
1 løsning

JDBC og MySQL

Hej

Jeg har forgæves prøvet at få en MySQL connection op at køre i java, men det vil ikke lykkes. Jeg har hentet "mysql-connector-java-3.0.8-stable-bin.jar" fra mysql.com og placeret denne i "C:\Program Files\j2sdk1.4.1_01\jre\lib\ext" og i "C:\Program Files\Java\j2re1.4.1_01\lib\ext" da jeg kører Windows XP.

Jeg kan fint kompilere koden, men når jeg prøver at eksekvere filen med java melder den fejl ved:

    Could not load mysql driver.
    java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
        at java.net.URLClassLoader$1.run(URLClassLoader.java:198)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:186)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:299)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:265)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:255)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:315)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:140)
        at Klasse.main(Klasse.java:18)
    java.sql.SQLException: No suitable driver


Nope, den kan ikke finde driveren. Hvorfor ikke - hvad har jeg gjort galt.

Det er her der fejles i koden:

import java.sql.Connection;
import java.sql.DriverManager;
//import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.DriverManager;

public class Klasse {
    public static final String DRIVER = "com.mysql.jdbc.Driver";

  <SNIP>

    public static void main(String args[]) {
    try {
        Class.forName(DRIVER).newInstance();
    } catch (Exception e) {
        System.err.println("Could not load mysql driver.");
        e.printStackTrace();
    }

  <SNIP>

_________


Jeg kan ikke rigtig se hvad der er galt - kan I? Det håber jeg lidt i kloge mennesker kan!



Mvh / Preben
Avatar billede olly Nybegynder
03. juli 2003 - 00:40 #1
Ser jo ud til den ikke mener filen er i classpath... Så enten lave en

set classpath=C:\Program Files\j2sdk1.4.1_01\jre\lib\ext\mysql-connector-java-3.0.8-stable-bin.jar;%CLASSPATH%

Eller give den i cmd ved kørsel

java -cp "C:\Program Files\j2sdk1.4.1_01\jre\lib\ext\mysql-connector-java-3.0.8-stable-bin.jar" "programnavn"

Så burde det virke...

Problemet er hvert fald åbentlyst at den ikke kan finde filen.
Avatar billede el-prebsi Nybegynder
03. juli 2003 - 01:01 #2
Så får jeg flg. fejl.

Exception in thread "main" java.lang.NoClassDefFoundError: Klasse
Avatar billede arne_v Ekspert
03. juli 2003 - 06:06 #3
Prøv med:

-cp .;"C:\Program Files\j2sdk1.4.1_01\jre\lib\ext\mysql-connector-java-3.0.8-stable-bin.jar"
Avatar billede el-prebsi Nybegynder
03. juli 2003 - 18:18 #4
Ok.. Det her er mærkeligt arne_v s kommentar virker rent faktisk. Men selvom jeg prøvede at sætte classpath til C:\....\mysql-connector-java-3.0.8..... og programstien virkede det ikke. Men det her lader til at virke.

Dog var jeg ude på at det ikke skulle være nødvendigt at sætte sin classpath overhovedet, da jeg gerne ville være fri for den lange kommando hver gang.

Jeg har brugt klassen cs1 i mit studie, og den har virket fint nok ved bare at blive lagt i "C:\Program Files\j2sdk1.4.1_01\jre\lib\ext" og i "C:\Program Files\Java\j2re1.4.1_01\lib\ext". Hmm.. Er filens navn for langt eller skal den hedde noget andet? Eller hvorfor virker det ikke!


Mvh / Preben
Avatar billede arne_v Ekspert
03. juli 2003 - 18:23 #5
Nu er det ikke så mærkeligt.

Den kunne ikke finde Klasse som lå i current directory.

Og jeg foreslog netop at tilføje current directory til classpath.

Jeg bruger selv aldrig at smide noget i ext. Alt for store problemer, når man
skifter Java version.

Jeg kan dog ikke lige gennemskue hvorfor det ikke virker med MySQL JDBC
driver.

Der findes forskellige alternative mådet at håndtere classpath problemet
på.

En af dem er at du pakker din kode ned i en jar-fil og i manifestet
definerer både main class og classpath til de eksterne jar-filer
der skal bruges.
Avatar billede lazy_warrior Nybegynder
03. juli 2003 - 18:30 #6
Jeg blander mig lige.... hvad er det et manifest er???
Avatar billede arne_v Ekspert
03. juli 2003 - 18:34 #7
Et manifest er en "indholds beskrivelse" af en jar-fil.

Man kan angive forskellige ting bl.a. main class og classpath.

Så i.s.f.:
  java -classpath mystuff.jar,externalstuff.jar mypackage.MyClass
kan man nøjes med:
  java -jar mystuff.jar
fordi manifestet i mystuff.jar angiver at main clas er mypackage.MyClass
og classpath indeholder externalstuff.jar
Avatar billede arne_v Ekspert
03. juli 2003 - 18:35 #8
Hvis man arbejder på Windows og ens Java er korrekt installeret, så kan
man oveniøbet køre ved bare at dobbelt-klikke på jar-filen i
Windows Explorer !
Avatar billede el-prebsi Nybegynder
03. juli 2003 - 18:42 #9
Ok, men det lyder da så fair nok. Dog stadig mystisk at den ikke vil bruge den i ext-biblioteket.

Jeg har ikke rigtig forstået det med class-filer helt. Hvordan laver jeg en JAR-fil med alle class-filer i. Hvordan laves "manifestet" som du skriver og hvad indeholder det egentlig.

Jeg har i forskellige programmer set, at man ligger nogle class-filer i andre mapper. Det er også meget smart for at få lidt struktur, men hvordan kan jeg "komme i kontakt" med class-filerne i mapperne liggender derover. Dvs. jeg kan jo sagtens blot skrive mappenavn.class for at gå nedad i mapperne, men hvordan kommer jeg opad (eller udad).


Mvh / Preben
Avatar billede arne_v Ekspert
03. juli 2003 - 18:48 #10
Det med ext forstå jeg heller ikke.

Du kan lave en jar fil fra kommando prompt med noget a la:

jar cvf mystuff.jar MyMain.class myutils\*.class

Den opretter så selv et manifest der indeholder praktisk taget
ingenting.

Man kan også selv skrive sit manifest og skovle det ind i jar-filen med:

jar cvmf mymanifest.mf mystuff.jar MyMain.class myutils\*.class

Manifest filen er bare en text fil.

Man angiver f.eks. main class med:

Main-Class: MyClass
Avatar billede el-prebsi Nybegynder
03. juli 2003 - 18:48 #11
En anden ting.. En package - hvad er det og hvordan bruges det.

Jeg har kun leget med almindelige class-filer uden packages og JAR o.lign.

Hvis jeg vil lave et program og give det videre til nogle andre hvor jeg bruger en ekstern pakke. Hvordan bør jeg så udgive programmet?
Avatar billede arne_v Ekspert
03. juli 2003 - 18:50 #12
Jeg er ved at skrive noget. Det hænger nemlig sammen med det
andet spørgsmål om directories.
Avatar billede arne_v Ekspert
03. juli 2003 - 18:52 #13
Hvis du har følgende struktur:
    C:\myproject\Main.java (no package, import util.* import comutil.*)
    C:\myproject\util\SomeUtil.java (package util)
    C:\common\comutil\OtherUtil.java (package comutil)

Så skal du compile og køre med:

-classpath C:\myproject;C:\common

d.v.s. at classpath skal pege på roden over pakkerne.

Og du kan sagtens pege på flere steder.

Også flere directories og flere jar-filer.
Avatar billede arne_v Ekspert
03. juli 2003 - 18:56 #14
packages er en måde at gruppere sine klasser på.

I java skal package struktur matche directory struktur.
Avatar billede el-prebsi Nybegynder
03. juli 2003 - 19:29 #15
Ok. Jeg har i sin tid lavet lille "Dilemma"-spil som en aflevering.

Jeg bruger en jar-fil cs1.jar, indeholdende en klasse cs1.Keyboard. Jeg har nu i et separat bibliotek placeret de tre class-filer sammen med cs1.jar-filen. (Ja, der er lige SQLException i det andet program som startede denne tråd - derfor jeg lige skriver anderledes).

Dvs. i mappen jar, ligger nu flg.
cs1.jar
Dilemma.class
Player.class
Confront.class
manifest.mf (indeholder : "Main-Class: Dilemma")

Dette vil jeg gerne have pakket ned i en jar-fil. Dvs. hvis jeg skriver sådan her:
D:\Dok....\jar>jar cvmf manifest.mf Dilemma.jar *.class cs1.jar
added manifest
adding: Confront.class(in = 900) (out= 522)(deflated 42%)
adding: Dilemma.class(in = 1491) (out= 831)(deflated 44%)
adding: Player.class(in = 1795) (out= 1043)(deflated 41%)
adding: cs1.jar(in = 2644) (out= 2431)(deflated 8%)

Nu vil jeg så gerne køre dette:
D:\Dokumenter\skole\DM01\aflevering02\jar>java -jar Dilemma.jar
Failed to load Main-Class manifest attribute from
Dilemma.jar


Hvad er der galt - noget med manifest filen! Ja, jeg kan ikke rigtig se hvad der er galt helt præcist!
Avatar billede arne_v Ekspert
03. juli 2003 - 19:34 #16
Check om der er et linie-skift i manifest efter "Main-Class: Dilemma".
Avatar billede arne_v Ekspert
03. juli 2003 - 19:35 #17
Du kan iøvriht ikke bruge en jar-fil inden i en jar-fil.

cs1.jar skal ligge ved siden af Dilemma.jar og du skal
jave en:

Class-Path: cs1.jar

i manifestet.
Avatar billede el-prebsi Nybegynder
03. juli 2003 - 19:54 #18
Ok. Dvs.

D:\DOK.....\jar>jar cvmf manifest.mf Dilemma.jar *.class
added manifest
adding: Confront.class(in = 900) (out= 522)(deflated 42%)
adding: Dilemma.class(in = 1491) (out= 831)(deflated 44%)
adding: Player.class(in = 1795) (out= 1043)(deflated 41%)

Så langt så godt. Nu til eksekveringen:

D:\DOKU....\jar>java -jar cvmf Dilemma.jar
Exception in thread "main" java.util.zip.ZipException: The system cannot find th
e file specified
        at java.util.zip.ZipFile.open(Native Method)
        at java.util.zip.ZipFile.<init>(ZipFile.java:112)
        at java.util.jar.JarFile.<init>(JarFile.java:117)
        at java.util.jar.JarFile.<init>(JarFile.java:55)

Ok. Der er fejl. Jeg har dog erhvervet mig den viden at jar-filer som standard i windows eksekveres med javaw:

D:\DOKUME~1\skole\DM01\AFLEVE~2\jar>javaw Dilemma.jar

Der kommer så en dialog-boks frem - "Could not find the main class. Program will exit!"

Min manifest.mf ser ud som følger:
Main-Class: Dilemma
Class-Path: cs1.jar

Og der er intet linieskift efter Class-Path: cs1.jar - dvs. der er kun 2 linier. Hvad er der så galt?
Avatar billede arne_v Ekspert
03. juli 2003 - 19:57 #19
Erstat:

java -jar cvmf Dilemma.jar

med:

java -jar Dilemma.jar
Avatar billede arne_v Ekspert
03. juli 2003 - 19:57 #20
Eller erstat:

javaw Dilemma.jar

med:

javaw -jar Dilemma.jar
Avatar billede el-prebsi Nybegynder
03. juli 2003 - 20:15 #21
ahh, en lille fejl der!! - hehe...

Hvad er forskellen på java og javaw egentlig?

Nu brokker den sig over at den ikke kan finde cs1.jar. cs1.jar ligger jo ved siden af Dilemma.jar!

Fejlmeddelelse:

D:\DOKUME~1\skole\DM01\AFLEVE~2\jar>java -jar Dilemma.jar 7
Indtast spiller 1's navn: Exception in thread "main" java.lang.NoClassDefFoundEr
ror: cs1/Keyboard
        at Dilemma.main(Dilemma.java:10)


Hvad gør jeg galt så???
Avatar billede arne_v Ekspert
03. juli 2003 - 20:34 #22
Prøv og sæt et ekstra linie-skift ind efter:

Class-Path: cs1.jar
Avatar billede arne_v Ekspert
03. juli 2003 - 20:35 #23
java er en console applikation.

javaw er en GUI applikation.

På mere jævnt dansk: hvis man starter javaw fra windows explorer,
så åbner den ikke et console vindue !
Avatar billede el-prebsi Nybegynder
03. juli 2003 - 21:10 #24
Takker - så virker det.

Hvad angår det med biblioteker har jeg stadig lidt problemer.
Jeg befinder mig i C:\myproject - hvor mit projekts main-class ligger. Herfra eksekveres programmet. Jeg har nu en undermappe Bib hvori der ligger en klasse "Klasse", som jeg ønsker at eksekvere. Dette bør kunne gøres vha. Bib.Klasse.method(); Ok, men i min Bib.Klasse.method() ønsker jeg at referere til en klasse i C:\myproject\Bib2\ som f.eks. hedder "Klasse2".
Hvordan styrer jeg klasserne i C:\myproject\Bib2\ og i C:\myproject\ fra klasserne i C:\myproject\Bib\ ?
Avatar billede arne_v Ekspert
03. juli 2003 - 21:15 #25
C:\myproject\Main.java:

public class Main {

C:\myproject\Bib\Klasse.java:

package Bib;

import Bib2.Klasse2;

public class Klasse {

C:\myproject\Bib2\Klasse2.java:

package Bib2;

public class Klasse2 {

og:

-classpath C:\myproject
Avatar billede arne_v Ekspert
03. juli 2003 - 21:17 #26
man importerer fra de pakker man skal bruge

man sørger for at pakke struktur og directory struktur matcher

classpath peger på toppen af pakke strukturen

så virker det !
Avatar billede arne_v Ekspert
03. juli 2003 - 21:17 #27
Og et svar.
Avatar billede el-prebsi Nybegynder
03. juli 2003 - 21:20 #28
Ok, mange tak - du skal have nogle point.. Poster du ikke lige et svar så jeg kan smide dem til dig!
Avatar billede el-prebsi Nybegynder
03. juli 2003 - 21:21 #29
Ok, der nåede du det inden mig ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester