Toon posts:

[JAVA] Probleem met verwijzing naar API's

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi,

ik weet dat ik enige tijd eerder met een soortgelijk probleem een topic op dit forum heb gepost, over een probleem om een verwijzing te maken vanuit een JAVA applet (in dit geval) in een JAR bestand naar benodigde API's. Mij is verteld dat ik dit kan doen via het MANIFST bestand. Dit heb ik nooit helemaal werkend kunnen krijgen, maar omdat er zich in de tussentijd een andere oplossing voordeed, heb ik hier niet meer naar gekeken. Tot vandaag. Er is namelijk iets heel vreemds aan de hand, wat ik niet kan verklaren.

Om te beginnen, de tijdelijke oplossing waar ik het over had was de API's in de JAVA/lib/ext folder te zetten. Dit had tot gevolg dat ik geen speciale Manifest file hoefde te maken, en dat mijn applet werkte. Tot zo ver voorspelbaar. Van de opdrachtgever mag ik echter niet voor deze oplossing kiezen, dus ben ik me toch gaan verdiepen in de mogelijkheden met het aanpassen van het manifest bestand.

Wanneer ik de api's niet in de LIB/ext folder zet, en geen aanpassing in de manifest doe, krijg ik een error, dat de API niet gevonden is. Tot zover nog steeds niet anders dan ik had verwacht.

Wanneer ik echter het manifest bestand aanpas,
(deze regel voeg ik toe: "Class-Path: C:\dtmj\lib\httpclient.jar;C:\dtmj\lib\logging.jar;C:\dtmj\lib\mysql.jar;C:\dtmj\lib\codec.jar") krijg ik een hele nieuwe error, namelijk een classnotfound error, op het bestand dat wordt gezien als hoofdklasse van de applet:
code:
1
2
3
4
5
6
7
8
9
10
11
12
load: class Uploader.class not found.
java.lang.ClassNotFoundException: Uploader.class
    at sun.applet.AppletClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.applet.AppletClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.applet.AppletClassLoader.loadCode(Unknown Source)
    at sun.applet.AppletPanel.createApplet(Unknown Source)
    at sun.plugin.AppletViewer.createApplet(Unknown Source)
    at sun.applet.AppletPanel.runLoader(Unknown Source)
    at sun.applet.AppletPanel.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

Deze had ik echter niet verwacht. Iemand enig idee hoe ik dit kan verhelpen en waar de oplossing in schuilt? Bij deze nog eenmaal mijn volledige manifest.txt (die geparsed wordt tot manifest.ms o.i.d.)

code:
1
2
3
Manifest-Version: 1.0
Class-Path: C:\dtmj\lib\httpclient.jar;C:\dtmj\lib\logging.jar;C:\dtmj\lib\mysql.jar;C:\dtmj\lib\codec.jar
Created-By: 1.4.2_18 (Sun Microsystems Inc.)


Mijn dank is groot als iemand mij hier het antwoord op kan geven.

Groeten,
Jan

[ Voor 8% gewijzigd door Verwijderd op 08-12-2008 02:08 ]


Acties:
  • 0 Henk 'm!

  • ari3
  • Registratie: Augustus 2002
  • Niet online
Het manifest classpath werkt geheel niet voor applets in een browser om veiligheidsredenen, zie ook de documentatie.

Een mogelijke plossing is een uber-jar te bouwen met Maven 2.

"Kill one man, and you are a murderer. Kill millions of men, and you are a conqueror. Kill them all, and you are a god." -- Jean Rostand


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ari3 schreef op maandag 08 december 2008 @ 02:13:
Het manifest classpath werkt geheel niet voor applets in een browser om veiligheidsredenen, zie ook de documentatie.

Een mogelijke plossing is een uber-jar te bouwen met Maven 2.
Ik kan het betreffende stukje niet zo snel vinden, waarin staat dat het niet voor applets werkt, maar misschien is het goed om erbij te vermelden dat het om een ondertekend applet gaat. In het applet gebeuren meer dingen die om veiligheidsredenen normaal gesproken niet mogen, maar in dit geval wel, zoals toegang tot de bestanden van de gebruiker.

Acties:
  • 0 Henk 'm!

  • SPee
  • Registratie: Oktober 2001
  • Nu online
Voor de ClassNotFoundException van je main classe, komt waarschijnlijk omdat de programma die je wilt uitvoeren zelf niet in de classpath zit (alleen je benodigde JARS).

No offens, maar waarom ben je bezig met een opdracht voor een opdrachtgever, terwijl je niet (genoeg) van de Java programmeertaal begrijpt?


[edit]
Gebruik je wel een IDE voor het programmeren en de JAR aanmaken? Dat scheelt een boel.

code:
1
2
3
Manifest-Version: 1.0
Class-Path: C:\dtmj\lib\httpclient.jar;C:\dtmj\lib\logging.jar;C:\dtmj\lib\mysql.jar;C:\dtmj\lib\codec.jar
Created-By: 1.4.2_18 (Sun Microsystems Inc.)


Gebruik voor de classpath liefst niet de volledige directory. En bedenk dat in java de slashes veelal op de Unix manier gebruikt worden. En waarom gebruik je nog Java 1.4 :?

Manifest.mf:
code:
1
2
3
Manifest-Version: 1.0
Class-Path: lib/httpclient.jar;lib/logging.jar;lib/mysql.jar;lib/codec.jar
Created-By: 1.4.2_18 (Sun Microsystems Inc.)

[ Voor 49% gewijzigd door SPee op 08-12-2008 02:31 ]

let the past be the past.


Acties:
  • 0 Henk 'm!

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

Confusion

Fallen from grace

SPee schreef op maandag 08 december 2008 @ 02:26:
Voor de ClassNotFoundException van je main classe, komt waarschijnlijk omdat de programma die je wilt uitvoeren zelf niet in de classpath zit (alleen je benodigde JARS).
Dat is vrij stug, aangezien hij 'java -jar' gebruikt op een zelfgebouwde jar en het enige verschil, volgens hem, is dat de Manifest file veranderd is. Dan is dus niet opeens de aangeroepen class uit de jar verdwenen.
No offens, maar waarom ben je bezig met een opdracht voor een opdrachtgever, terwijl je niet (genoeg) van de Java programmeertaal begrijpt?
Wat heeft het werkend krijgen van een jar met Manifest claspath met kennis van een programmeertaal te maken?
En waarom gebruik je nog Java 1.4 :?
Ik gebruik voor 1 van mijn klanten nog Java 1.3. Je mag zelf bedenken waarom.

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


Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Verwijderd schreef op maandag 08 december 2008 @ 01:51:
Hoi,

ik weet dat ik enige tijd eerder met een soortgelijk probleem een topic op dit forum heb gepost, over een probleem om een verwijzing te maken vanuit een JAVA applet (in dit geval) in een JAR bestand naar benodigde API's. Mij is verteld dat ik dit kan doen via het MANIFST bestand. Dit heb ik nooit helemaal werkend kunnen krijgen, maar omdat er zich in de tussentijd een andere oplossing voordeed, heb ik hier niet meer naar gekeken. Tot vandaag. Er is namelijk iets heel vreemds aan de hand, wat ik niet kan verklaren.

Om te beginnen, de tijdelijke oplossing waar ik het over had was de API's in de JAVA/lib/ext folder te zetten. Dit had tot gevolg dat ik geen speciale Manifest file hoefde te maken, en dat mijn applet werkte. Tot zo ver voorspelbaar. Van de opdrachtgever mag ik echter niet voor deze oplossing kiezen, dus ben ik me toch gaan verdiepen in de mogelijkheden met het aanpassen van het manifest bestand.

Wanneer ik de api's niet in de LIB/ext folder zet, en geen aanpassing in de manifest doe, krijg ik een error, dat de API niet gevonden is. Tot zover nog steeds niet anders dan ik had verwacht.

Wanneer ik echter het manifest bestand aanpas,
(deze regel voeg ik toe: "Class-Path: C:\dtmj\lib\httpclient.jar;C:\dtmj\lib\logging.jar;C:\dtmj\lib\mysql.jar;C:\dtmj\lib\codec.jar") krijg ik een hele nieuwe error, namelijk een classnotfound error, op het bestand dat wordt gezien als hoofdklasse van de applet:
code:
1
2
3
4
5
6
7
8
9
10
11
12
load: class Uploader.class not found.
java.lang.ClassNotFoundException: Uploader.class
    at sun.applet.AppletClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.applet.AppletClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.applet.AppletClassLoader.loadCode(Unknown Source)
    at sun.applet.AppletPanel.createApplet(Unknown Source)
    at sun.plugin.AppletViewer.createApplet(Unknown Source)
    at sun.applet.AppletPanel.runLoader(Unknown Source)
    at sun.applet.AppletPanel.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

Deze had ik echter niet verwacht. Iemand enig idee hoe ik dit kan verhelpen en waar de oplossing in schuilt? Bij deze nog eenmaal mijn volledige manifest.txt (die geparsed wordt tot manifest.ms o.i.d.)

code:
1
2
3
Manifest-Version: 1.0
Class-Path: C:\dtmj\lib\httpclient.jar;C:\dtmj\lib\logging.jar;C:\dtmj\lib\mysql.jar;C:\dtmj\lib\codec.jar
Created-By: 1.4.2_18 (Sun Microsystems Inc.)


Mijn dank is groot als iemand mij hier het antwoord op kan geven.

Groeten,
Jan
De manifest wordt inderdaad genegeerd voor applets en het plaatsen van jar-files in de lib\ext folder is echt not done. Plaats alle relevante JAR files op de webserver en geef deze mee in het archive attribuut van de applet- (comma-separated) of object-tag (space separated).
Zie ook http://www.w3.org/TR/1999...truct/objects.html#h-13.4 en http://www.w3.org/TR/1999.../objects.html#edef-OBJECT

BTW: Als je nu in je manifest absolute paden opgeeft, waarom maak je dan niet gewoon een applicatie ipv een applet?

Acties:
  • 0 Henk 'm!

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Absolute paden in applet´s manifest gaan niet werken. Plaatsen van JAR files in /lib/ext is absoluut bad practice. De applet wordt gedownload naar de client machine en draait op de client machine. Het draait niet op de server machine. Hetgeen je probeert zal in theorie alleen werken wanneer zowel de client als de server op dezelfde machine draaien, wat alleen maar kan voorkomen tijdens development.

Zoals eerder gezegd moet je de <applet>´s archive attribuut opgeven.
Zie ook http://java.sun.com/docs/...ployment/applet/html.html

[ Voor 17% gewijzigd door BalusC op 08-12-2008 17:46 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wellicht een beetje late reactie (heb het de afgelopen weken heel druk gehad met andere school vakken, heb vandaag pas de moeite kunnen nemen om hier naar te kijken), maar bedankt allemaal voor deze reacties. Heb dit probleem nu weten te verhelpen :)

Persoonlijk vind ik de Java documentatie geweldig als het aankomt op klassen en functies, maar dit soort (toch belangrijke) informatie is heel onduidelijk uitgelegd.

Heb de verschillende jars komma seperated aangeroepen, en het lijkt nu te werken. Bedankt dus!

Groeten,
Jan
Pagina: 1