Applet Java Applet läuft im Browser nicht mehr (HTTPClient - NoClassDefFoundError)

phiLue

Mitglied
Guten Morgen zusammen,

ich werke nun schon ein paar Tage an einem einfachem Uploader und gestern war ich dann auch fast fertig bis mir folgendes passiert ist.

Ich hatte geschaut wie man Parameter an ein Applet übergeben kann und wie man über den HTTPClient Cookies setzen kann. Als ich dies alles eingebaut hatte, funktionierte mein Applet im Browser plötzlich nicht mehr aufgrund der unten stehenden Fehlermeldung. Wenn ich es in Eclipse als Applet starte funktioniert alles problemlos :/ Ich habe nun schon alles mögliche versucht, unter anderem die Änderung bezüglich der Parameter und Cookies zurück gesetzt und letzendlich auch den Quellcode in ein neues Projekt importiert, aber hier hatte ich dann auch den selben Fehler. Kann mir hier vielleicht jemand weiter helfen? Ich poste mal den Quellcode zum Projekt, dieser ist ja zum Glück nicht all zu groß.

Falls sonst ihr sonst noch Infos braucht dann fragt ruhig nach. Ich wäre wirklich dankbar wenn mir bei diesem Problem jemand helfen könnte 🙁

PS: Bibliotheken sind definitiv alle drin und auch richtig. Wie gesagt, in Eclipse als Applet gestartet funktioniert das ganze auch prima. Signiert ist das Applet übrigens auch. :/

Vielen Dank an alle die sich mit meinem Problem beschäftigen! 🙂

JUploader.java
Java:
package de.XXXXX.juploader;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;

import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.CookieStore;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.protocol.ClientContext;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.ContentBody;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.cookie.BasicClientCookie;
import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;


public class JUploader extends JApplet {
	
	private JFileChooser 	fc;
	private JButton 		btnUpload;
	
	private String uploadScript = "";
	private String sessionID	= "";

	/**
	 * Constructor
	 */
	public JUploader() {

	}
	
	@Override
	public void init() {
		super.init();
		initialize();
	}
	
	
	/**
	 * 
	 */
	private void initialize() {
		GridBagLayout gridBagLayout = new GridBagLayout();
		gridBagLayout.columnWidths = new int[]{88, 0};
		gridBagLayout.rowHeights = new int[]{0, 0};
		gridBagLayout.columnWeights = new double[]{1.0, Double.MIN_VALUE};
		gridBagLayout.rowWeights = new double[]{0.0, Double.MIN_VALUE};
		getContentPane().setLayout(gridBagLayout);
		GridBagConstraints gbc_btnUpload = new GridBagConstraints();
		gbc_btnUpload.fill = GridBagConstraints.BOTH;
		gbc_btnUpload.gridx = 0;
		gbc_btnUpload.gridy = 0;
		getContentPane().add(getBtnUpload(), gbc_btnUpload);
		
		
		
	}
	
	/**
	 * 
	 * @return
	 */
	public JFileChooser getFileChooser() {
		if(this.fc == null) {
			fc = new JFileChooser();
		}
		return fc;
	}
	
	
	
	/**
	 * 
	 * @return JButton
	 */
	private JButton getBtnUpload() {
		if (btnUpload == null) {
			btnUpload = new JButton("Upload");
			btnUpload.addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent arg0) {
					
					uploadScript 	= JUploader.this.getParameter("script");
					sessionID 		= JUploader.this.getParameter("sessionID");
					
					JOptionPane.showMessageDialog(null,sessionID,"Upload", JOptionPane.INFORMATION_MESSAGE);					
					fc = getFileChooser();
					int returnVal = fc.showOpenDialog( JUploader.this );  
					String fileName = "";
					if ( returnVal == JFileChooser.APPROVE_OPTION ) {    
			            File aFile 	= fc.getSelectedFile();    
			            fileName	= aFile.getAbsolutePath();
			        }  
					
					if(fileName != null && fileName instanceof String && fileName.length() > 0) {

						HttpClient httpclient = new DefaultHttpClient();
						httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
						
						CookieStore cookieStore = new BasicCookieStore();
						
						BasicClientCookie cookie = new BasicClientCookie("PHPSESSID", JUploader.this.sessionID);  
						cookieStore.addCookie(cookie);
						
						HttpContext httpContext = new BasicHttpContext();
						httpContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);

						
						HttpPost httppost = new HttpPost("http://<IP+PORT>/juploader/upload.php");
						System.out.println("Filename: " + fileName);
						File file = new File(fileName);
						
						MultipartEntity mpEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
					    ContentBody cbFile = new FileBody(file, "multipart/form-data");
					    mpEntity.addPart("uploadfile", cbFile);

					    httppost.setEntity(mpEntity);
					    System.out.println("executing request " + httppost.getRequestLine());
					    HttpResponse response;
						try {
							response = httpclient.execute(httppost);
							HttpEntity resEntity = response.getEntity();
							System.out.println(response.getStatusLine());
							 
							if (resEntity != null) {
								JOptionPane.showMessageDialog(null,EntityUtils.toString(resEntity, "UTF-8"),"Upload", JOptionPane.INFORMATION_MESSAGE);
							}

							httpclient.getConnectionManager().shutdown();

						} catch (ClientProtocolException e) {
							e.printStackTrace();
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
				}
			});
		}
		return btnUpload;
	}
}

index.php
HTML:
<APPLET  archive="java/JUploader.jar" code="de.XXXXX.juploader.JUploader.class" align="baseline" width="100" height="25" name="JUploader">
    <PARAM NAME="script" VALUE="http://<IP+PORT>/juploader/upload.php">
    <PARAM NAME="sessionID" VALUE="0">
    <PARAM NAME="java_code" VALUE="de.XXXXX.juploader.JUploader.class">
    <PARAM NAME="java_archive" VALUE="java/JUploader.jar">
    <PARAM NAME="java_type" VALUE="application/x-java-applet;jpi-version=1.4">
    <PARAM NAME="scriptable" VALUE="true">
    No Java 2 SDK, Standard Edition v 1.4 support for APPLET!!
</APPLET>

Fehler
Code:
Java-Plug-in 1.6.0_35
Verwendung der JRE-Version 1.6.0_35-b10-428-10M3811 Java HotSpot(TM) 64-Bit Server VM
Home-Verzeichnis des Benutzers = /Users/XXXXX
----------------------------------------------------
c:   Konsolenfenster schließen
f:   Objekte in Finalisierungswarteschlange finalisieren
g:   Speicherbereinigung
h:   Diese Hilfemeldung anzeigen
l:   ClassLoader-Liste ausgeben
m:   Speicherbelegung anzeigen
o:   Protokollierung auslösen
q:   Konsole ausblenden
r:   Richtlinien-Konfiguration neu laden
s:   System- und Bereitstellungseigenschaften ausgeben
t:   Threadliste ausgeben
v:   Thread-Stack ausgeben
x:   ClassLoader-Cache löschen
0-5: Trace-Stufe auf <n> setzen
----------------------------------------------------


java.lang.RuntimeException: java.lang.NoClassDefFoundError: org/apache/http/client/ClientProtocolException
	at sun.plugin2.applet.Plugin2Manager.createApplet(Plugin2Manager.java:3136)
	at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Plugin2Manager.java:1497)
	at java.lang.Thread.run(Thread.java:680)
Caused by: java.lang.NoClassDefFoundError: org/apache/http/client/ClientProtocolException
	at de.XXXXXX.juploader.JUploader.getBtnUpload(JUploader.java:104)
	at de.XXXXXX.juploader.JUploader.initialize(JUploader.java:78)
	at de.XXXXXX.juploader.JUploader.<init>(JUploader.java:61)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	at java.lang.Class.newInstance0(Class.java:355)
	at java.lang.Class.newInstance(Class.java:308)
	at sun.plugin2.applet.Plugin2Manager$13.run(Plugin2Manager.java:3060)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:199)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:702)
	at java.awt.EventQueue.access$400(EventQueue.java:82)
	at java.awt.EventQueue$2.run(EventQueue.java:663)
	at java.awt.EventQueue$2.run(EventQueue.java:661)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:672)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Caused by: java.lang.ClassNotFoundException: org.apache.http.client.ClientProtocolException
	at sun.plugin2.applet.Applet2ClassLoader.findClass(Applet2ClassLoader.java:252)
	at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Plugin2ClassLoader.java:249)
	at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Plugin2ClassLoader.java:179)
	at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Plugin2ClassLoader.java:160)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
	... 24 more
Ausnahme: java.lang.RuntimeException: java.lang.NoClassDefFoundError: org/apache/http/client/ClientProtocolException

[EDIT]// Edit:

Okay... es ist wie fast immer... man sucht ewig nach dem Fehler, und kurz nachdem man in nem Forum gefragt hat findet man ihn selbst -.- Hat sich damit erledigt, Lösung war wie folgt 😱

Einfach die Bibliotheken in das HTML-Applet Tag mit einbinden - Finde ich zwar seltsam, da der Fehler erst nach "HttpClient httpclient = new DefaultHttpClient();" auftritt, er aber diese Klasse schon garnicht kennen dürfte aber okay. Trotzdem danke für alle die sich die Mühe gegeben haben das durch zu lesen 🙂[/EDIT]
 
Zuletzt bearbeitet:
Beim Lesen deines Applet-Tags fiel mir auf, dass er nicht ganz korrekt ist.
In der FAQ findest du konkrete Beispiele für das richtige Einbinden von Applets.

Außerdem scheint im archive-Attribut auch noch die von dir eingesetzte Apache-Bibliothek zu fehlen. Die ist nicht Teil der Standard-Java-API und muss demzufolge entweder in dein eigenes Jar eingebaut werden (ein Weg mit vielen Nachteilen) oder neben deiner Jar gespeichert und im archive-Attribut aufgeführt werden (einfacher, sauberer, flexibler).
 
Vielen Dank für die Antwort, habe es mitlerweile zum laufen bekommen 🙂

Eine Frage habe ich aber noch zu deiner Anmerkung bezüglich "alles in eine Jar-Datei". Wo liegen hier genau die Nachteile wenn ich das machen würde? War nämlich grade dabei das AddOn FatJar für Eclipse zu installieren als ich deinen Post hier gelesen hatte.
 
Insbesondere sind solche Jar-Konstrukte schlechter wartbar. Eine einzelne Jar-Datei lässt sich einfacher austauschen (bspw. bei einem Update/Versionswechsel), als eine aufgelöste Jar-Datei. Die ganze Sache wird übersichtlicher.
Es kann auch sein, dass in den Lizenztexten Restriktionen eingebaut wurden, die ein Entpacken nicht zulassen.
 

Neue Themen


Zurück
Oben