Java kaputt :]

G

Gast2

Gast
2 Tage !! :autsch:

seit 2 Tagen suche ich einen Fehler - der machte sich damit bemerkbar das ich irgendwie 2 Benutzerlisten in einem VPNServer habe ... zuerst zweifelt man ja an sich selber - vor allem wenn es unter Eclipse läuft :toll: ... nur unter Java nicht - egal ob Linux oder Windows ... anschließend fiel mir ein das Eclipse & Java Remote-Debugging beherrschen ... das Ergebnis habe ich mal aufgenommen

mal ein nettes kleines Video

ich brauche nur eine Instanz des VPNServers ... wie auf dem Video zu erkennen - ist der Konstruktor private ... dennoch springt er beim zweiten Aufruf erneut in den Konstruktor ... vor allem bitte im zweiten Teil auf die Meldung achten die fürs Logfile generiert wird und was lt. Eclipse da noch immer für ein Object ist ???:L ... im übrigen wird da das neue Object zurück geliefert

hand, mogel
 
Zuletzt bearbeitet von einem Moderator:
G

Gast2

Gast
Nachtrag,

selbst folgendes funktioniert nicht ;(

Java:
public class Helper {

	public final static VPNServer instance = new VPNServer();

}

das Blöde ist - ist kann das Problem nicht reproduzieren in einem TestProjekt

:mad:
 
J

JohannisderKaeufer

Gast
Ist ein bisschen, ein Video der verschwommenen Art. Zumindest bei mir.

Wenn ich das richtig deute soll VPNServer ein Singelton sein.
Bei Singeltons gibt es noch die möglichkeit synchronized zu nutzen.

also
Java:
private static VPNServer getInstance(){
if(instance == null){
synchronize{
if(instance == null)
instance = new VPNServer();
}
}
return instance;
}

Vielleicht hilft das ja.

Erstellt ein Thread gerade eine Instanz ist instance immer noch null, so daß sich auch ein weiterer Thread dranmachenkann eine Instanz zu erstellen, Erst wenn die Erstellung einer Instanz abgeschlossen ist, ist die Instance nicht mehr null.
 

ThreadPool

Bekanntes Mitglied
@Johannis

Dein synchronized ist auf dem falschen Lock, IMHO sollte dort synchronized(VPNServer.class) stehen. Besser wäre es die ganze Methode zu synchronisieren.

"Double-checked locking" ist IMHO heutzutage in Java nicht mehr notwendig, es war schon damals keine gute Alternative und besser is es auch nicht geworden. Mogels zweite Idee ist da schon besser.

Was mich wundert ist dass das Zweite aus Mogels Post nicht funktioniert. Liegt vielleicht am public?

Java:
public class Helper {
     private final static VPNServer instance = new VPNServer();
     public static VPNServer  getVPNServer(){return instance;}
}

Eine andere Alternative (lt. Effective Java, basierend auf Annahmen über das "lazy"-class Loading und dem Verhalten statischer Initialisierer) wäre Folgende:

Java:
public class VPNServerFactory{
    private static class VPNServerHolder{
        public static VPNServer server = new VPNServer();
    }
    public static VPNServer getVPNServer(){
        return VPNServerHolder.server;
    }
}
 
G

Gast2

Gast
Moin,

ich kann das Problem beliebig reproduzieren - allerdings nur innerhalb dieses Projektes ... ich habe mal in den Anhang mein Beispiel gepackt wie ungefähr das Programm funktioniert ... nur leider ohne diesen Bug

ich werde mal alles direkt von Java kompilieren lassen

hand, mogel
 
T

tuxedo

Gast
@ThreadPool und Johannis

Beides "oft so gemacht, aber dennoch nicht sauber". Bei Singletons synchronisiert man sich zu tode. Egal wie man's dreht und wendet, es ist nicht sauber thread-safe etc.
Am besten das ganze dem Classloader überlassen (so wie es Mogel schon gemacht hat mit dem private final static, zusammen mit einem privaten Konstruktur), oder eine Enum-Klasse zu Hilfe nehmen (Design Patterns in Java - Singleton).

- Alex
 
Zuletzt bearbeitet von einem Moderator:
G

Gast2

Gast
Ick werde bekloppt,

Code:
java.lang.ClassCastException: de.VPNServer cannot be cast to de.VPNServer

ich habe jetzt im Hauptprogramm entsprechend einen Container vorgesehen um den VPNServer da rein zu packen ... da das Hauptprogramm keine Ahnung hat was das Plugin macht geht natürlich nur Object ... beim Rausholen kann der Java das Ding nicht casten :cry: ... und nein - VPNServer erbt definitiv nur von Object

Nachtrag: ich habe jetzt noch etwas weiter rumgespielt ... er packt wirklich nur ein Object in den Container ... ich erhalte jetzt jedes mal eine ClassCastException - dadurch wird immer wieder ein neuer VPNServer erzeugt der in den Container gesteckt wird ... wenn ich auf den VPNServer zugreife vom letzten Object - dann klappt das ... nur nicht wenn ich zwischen durch über ein anderes Object zugreifen ... das ist als wenn im Plugin jedes einzelne Object einen eigenen Heap hat
 
Zuletzt bearbeitet von einem Moderator:

FArt

Top Contributor
Zwei Klasseninstanzen sind definitiv nicht gleich, wenn die Klassen dazu von zwei Classloadern geladen wurden (auch wenn das von der selben Ressource, z.B. JAR geschieht). Somit kann eine Instanz von Klasse A nicht auf Klasse B (also eigentlich die gleiche Klasse aber von einem anderen Classloader geladen) gecastet werden.
Das kommt vermutlich durch unsauberes Deploymentment in deinem Container bzw. (bei einem Plugin-Mechanismus) durch einen unsauberen Umgang mit Classloadern.
 
G

Gast2

Gast
Zwei Klasseninstanzen sind definitiv nicht gleich, wenn die Klassen dazu von zwei Classloadern geladen wurden (auch wenn das von der selben Ressource, z.B. JAR geschieht). Somit kann eine Instanz von Klasse A nicht auf Klasse B (also eigentlich die gleiche Klasse aber von einem anderen Classloader geladen) gecastet werden.
ah ja ... die Vermutung hatte ich auch - nachdem ich alle Dateien zusammen gepackt habe und das Programm funktionierte

Das kommt vermutlich durch unsauberes Deploymentment in deinem Container bzw. (bei einem Plugin-Mechanismus) durch einen unsauberen Umgang mit Classloadern.
dann hätte ich gerne an der Stelle etwas Hilfe

Java:
	private static boolean LoadBefehlURL(String befehl)
	{
		logger.info(" - Plugin: '" + befehl + "'");

		File dir = new File("plugins");
		if (!dir.exists())
		{
			logger.warn("kein Plugin-Verzeichnis angelegt");
			return false;
		}
		
		for(File file : dir.listFiles())
		{
			try
			{
				final URL extLibUrl = new URL("file", "localhost", file.getAbsolutePath());
				URLClassLoader loader = new URLClassLoader(new URL[]{extLibUrl});			
				final Class<?> c = loader.loadClass(befehl);
				befehle.add((ACommand) c.newInstance());
				return true;
			} catch(ClassNotFoundException ex)
			{
				// nüschts - try again ... nicht im aktuellen JAR vorhanden
				logger.error("", ex);
			} catch(Exception ex)
			{
				logger.error("", ex);
			}
		}
		
		return false;
	}

entsprechend dem geposteten Beispiel habe ich nur die einzelnen Pakete auf die verschiedenen JARs verteilt ... base ist das Hauptprogramm, welche das JAR aus library referenziert ... in der Realität sind da noch verschiedene Exceptions definiert ... dann fehlt nur noch plugin welches ebenfalls library referenziert ... viel falsch kann man an der Stelle nicht machen

was alles aus dem Plugin instanziert werden muss wird einmal am Start instanziert ... ähnlich wie im Beispiel

hand, mogel
 

FArt

Top Contributor
... viel falsch kann man an der Stelle nicht machen

Das ist eine grobe Fehleinschätzung, bei einem Plugin-Mechanismus, einer "Container-Architektur" kann man (alleine bzgl. Classloading) eine Menge falsch machen... bei der Implementierung und bei der Verwendung (z.B. über setzen des Klassenpfades).

Konkret zu hier:
der URLClassLoader ist hier problematisch, da er (wie alle Standard-Classloader) zuerst an den Parent-Classloader delegiert, bevor er selber nach einer Ressource sucht. Gerade bei Plugins wäre es umgekehrt besser (erst selber suchen, dann delegieren).

Das "Mischen" von Ressourcen über mehrere Classloader ist auch problematisch, da kann man sich schnell Memoryleaks bauen kann (wenn z.B. eine Ressource des Parents noch auch eine Ressource des (bereits beendeten) Plugins referenziert, wird u.U. der gesamte Classloader nicht collected... mit allem was dazu gehört.
 
G

Gast2

Gast
der URLClassLoader ist hier problematisch, da er (wie alle Standard-Classloader) zuerst an den Parent-Classloader delegiert, bevor er selber nach einer Ressource sucht. Gerade bei Plugins wäre es umgekehrt besser (erst selber suchen, dann delegieren).
kommt ja zurück - weil die Default-CL nix finden ... aber das Problem liegt daran das der URLClassLoder mehrfach instanziert wird ... ich habe mich jetzt darauf beschränkt das der URLClassLoader nur einmal Instaziert wird und dabei gleich die URL von allen Plugins im Verzeichnis mitbekommt

Java:
	private static URLClassLoader pluginloader = null;
	
	private static void InitPluginLoader()
	{
		if (pluginloader != null) return;
		File dir = new File("plugins");
		if (!dir.exists())
		{
			logger.warn("kein Plugin-Verzeichnis angelegt"); 
			return; 
		}
		
		List<URL> urls = new ArrayList<URL>();
		
		for(File file : dir.listFiles())
		{
			try
			{
				URL extLibUrl = new URL("file", "localhost", file.getAbsolutePath());
				urls.add(extLibUrl);
			} catch (MalformedURLException e)
			{
				logger.error("", e);
			}
		}
		
		pluginloader = new URLClassLoader(urls.toArray(new URL[urls.size()]));
	}

Java:
	private static boolean LoadBefehlURL(String befehl)
	{
		logger.info(" - Plugin: '" + befehl + "'");
	
		try
		{
			final Class<?> c = pluginloader.loadClass(befehl);
			befehle.add((ACommand) c.newInstance());
			return true;
		} catch(Exception ex)
		{
			logger.error("", ex);
		}
		
		return false;
	}

Nachtrag: sonst habe ich immer nur ein(e) Plugin(-Klasse) in einem JAR - da funktioniert das auch so ... diesmal sind aber pro JAR mehrere enthalten :oops:

danke, mogel
 
Zuletzt bearbeitet von einem Moderator:

FArt

Top Contributor
Das ist auch nicht wasserdicht... oder nicht sinnvoll...

Kommen zur Laufzeit Plugins dazu oder werden entfernt? Dann kommst du mit einem CL zu Problemen (nämlich wenn Ressourcen plötzlich fehlen oder ausgetauscht werden, z.B. gegen eine neuere Version).
Wenn das nicht der Fall ist, ist der ganze Heckmeck umsonst: es reicht die Ressourcen (JARs) beim Programmstart in den regulären Klassenpfad aufzunehmen.

[EDIT]
java plugin classloader - Google-Suche
 
Zuletzt bearbeitet:
G

Gast2

Gast
Kommen zur Laufzeit Plugins dazu oder werden entfernt? Dann kommst du mit einem CL zu Problemen (nämlich wenn Ressourcen plötzlich fehlen oder ausgetauscht werden, z.B. gegen eine neuere Version).
nein ... wird einmal am Programmstart alles geladen

Wenn das nicht der Fall ist, ist der ganze Heckmeck umsonst: es reicht die Ressourcen (JARs) beim Programmstart in den regulären Klassenpfad aufzunehmen.
da ich keine Ahnung habe welche Plugins irgend wann mal da mit reinkommen und ich gelernt habe das auch V011N00bs meine Programme nutzen fällt die Angabe des Classpath zum Programmstart definitiv aus

das habe ich mir auch überlegt ... dabei viel mir aber auf das ich den eigenen ClassLoader auch nur einmal verwenden darf ... dann kann ich gleich den URLClassLoader verwenden - da ich keine besonderen Anforderungen habe

falls doch irgendwann mal noch irgendwelche Plugins später geladen werden sollen/müssen/wollen ... kann auch der URLClassLoader erweitert - addURL()

hand, mogel
 
G

Gast2

Gast
*grml*

ach das mit den Classloadern ist doch Mist ... jetzt habe ich zwei Plugins die den gleichen Klassennamen importieren :toll:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
theJavaMaschine Mitstreiter gesucht: Gemeinsam Java und Android Development lernen! Allgemeine Java-Themen 5
PARAS Karriereberatung benötigt: Wie kann ich ein Java Full Stack Entwickler werden? Allgemeine Java-Themen 7
P Java Access Bridge Allgemeine Java-Themen 5
W ICEpdf PDF-Dateien werden mit Java 21 nicht nicht mehr vollständig dargestellt Allgemeine Java-Themen 3
MiMa Grundsätzliche Frage zur Verwendung von Java Versionen?? Allgemeine Java-Themen 3
OnDemand Java Deployment Vaadin Allgemeine Java-Themen 3
D Hat Java eine Library um JavaScript auszuwerten? Allgemeine Java-Themen 2
Zrebna Wieso sind eigentlich JUnit-Tests in src/test/java platziert - nur Konvention? Allgemeine Java-Themen 7
N LlaMA, KI, java-llama.cpp Allgemeine Java-Themen 39
V Java-Codierungsherausforderung: Navigieren durch die Macken der Datumsmanipulation Allgemeine Java-Themen 2
E Output Fehler (Java-Programm Kuchen) Allgemeine Java-Themen 11
M java: unexpected type Allgemeine Java-Themen 2
harrytut Java Input/Output Tests Junit Allgemeine Java-Themen 3
B Java Discord bot auf ein Root Server? Allgemeine Java-Themen 1
BetziTheRealOne Java PKIX path building failed as non Admin Allgemeine Java-Themen 15
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
KonradN Java 21 Release Allgemeine Java-Themen 5
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
K Java Anwendung machen Anleitung Allgemeine Java-Themen 5
G java.io.listFiles() Allgemeine Java-Themen 3
8u3631984 Frage zu Java Streams min / max Allgemeine Java-Themen 17
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
K Java-Projekt Allgemeine Java-Themen 11
K Java-Projekt Allgemeine Java-Themen 0
ruutaiokwu Welcher Browser unterstützt heutzutage noch Java Applets? Allgemeine Java-Themen 5
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
rode45e Java Threads Allgemeine Java-Themen 4
G java.io.listFiles() Allgemeine Java-Themen 2
N Java Dynamic Proxy Allgemeine Java-Themen 3
N Leichte Java Gegner Ki Allgemeine Java-Themen 10
A Java modul Problem Allgemeine Java-Themen 4
Thomasneuling Java Jar datei erstellen, von Projekt, dass auch Javafx Dateien, FXML Dateien und CSS Dateien, sowie Bilder enthält? Allgemeine Java-Themen 14
V Funktionale Schnittstelle in Java Allgemeine Java-Themen 3
OnDemand Java String in Hashmap als Key NULL Allgemeine Java-Themen 27
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
berserkerdq2 Wenn ich bei Intelij javafx mit maven importieren will, muss ich das in die pom.xml reintun, aber warum noch in module-info.java? Allgemeine Java-Themen 3
KonradN Java 20 am 21. März Allgemeine Java-Themen 1
O Java Website Stock Bot Allgemeine Java-Themen 3
J Front-/Backend in Java Allgemeine Java-Themen 14
doopexxx JAVA Google Webcrawler Allgemeine Java-Themen 1
J JavaScript innerhalb eines Java Projekts ausführen Allgemeine Java-Themen 2
A Java Programm erstellen hilfe Allgemeine Java-Themen 10
G java.lang.NoClassDefFoundError: org/aspectj/lang/Signature Allgemeine Java-Themen 2
lalex1491 Java Aktienkurse nachfragen Allgemeine Java-Themen 4
J Class to link Java Allgemeine Java-Themen 4
V Wie funktioniert das Schlüsselwort "final" von Java? Allgemeine Java-Themen 19
mrStudent Inferenz JAVA Allgemeine Java-Themen 6
U URI Rechner (Java Script) Allgemeine Java-Themen 7
TheSkyRider Java Geburtsdatum Textfeld Allgemeine Java-Themen 7
mihe7 Java 19 JavaDocs: Browserintegration Allgemeine Java-Themen 1
Encera Gleichzeitiges Ausführen und verbinden von 2 Java-Klassen über die Eingabeaufforderung und Eclipse Allgemeine Java-Themen 21
H Java Rechner Programmierung der Mathematik Allgemeine Java-Themen 33
Lennox Schinkel Java Kara Auf einen Java Host laufen lassen Allgemeine Java-Themen 17
C Fußnoten von DocX mit Java Allgemeine Java-Themen 2
C Fußnoten in DocX mit Java Allgemeine Java-Themen 1
M Aussagenlogik in Java Programmieren Allgemeine Java-Themen 22
B Per Java Word Dokument schreiben? Allgemeine Java-Themen 8
krgewb Java-Bibliothek für ONVIF Allgemeine Java-Themen 1
KonradN Oracle übergibt (Java Teile der) GraalVM Community Edition an OpenJDK Community Allgemeine Java-Themen 2
Momo16 Brauche Hilfe - Java Projekt kann nicht erstellt werden Allgemeine Java-Themen 12
B Java mit command line und jars benutzen? Allgemeine Java-Themen 18
M Java Überprüfen ob .exe-Datei bereits ausgeführt wird Allgemeine Java-Themen 2
B HTTP Allgemeine Fragen über Suchmaschine nutzen mit Java Allgemeine Java-Themen 20
Mick P. F. Wie kriege ich die Fehlermeldung "java: symbol lookup error: ..." weg? Allgemeine Java-Themen 11
K Nachhilfe Java Allgemeine Java-Themen 11
KonradN Java 19 Allgemeine Java-Themen 11
F IDEA IntelliJ Java Songliste erstellen Allgemeine Java-Themen 6
TheSepp Java bestimmtes Array auf den Wert 0 setzen Allgemeine Java-Themen 32
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
Sachinbhatt Sind alle Methoden in Java implizit virtuell Allgemeine Java-Themen 2
E Java und integrierte Grafikkarten Allgemeine Java-Themen 18
Sachinbhatt Wie wird die Typumwandlung bei Mehrfachvererbung in Java implementiert? Allgemeine Java-Themen 3
Peterw73 Hilfe bei Java gesucht Allgemeine Java-Themen 3
A Java unter Win 10 Allgemeine Java-Themen 1
B Woher kommen die Bildschirmkoordinaten beim java Robot? Allgemeine Java-Themen 14
P9cman java.Lang Klassen fehlen in JRE System Library Allgemeine Java-Themen 1
T Java Robot Class - Bot Allgemeine Java-Themen 3
E Wie Java Heap Space vergrößern? Allgemeine Java-Themen 3
B Java Programm auf virutellem Desktop laufen lassen? Allgemeine Java-Themen 1
D VBA Code mit Java ausführen möglich? Allgemeine Java-Themen 10
berserkerdq2 Threads, wie genau läuft das in Java ab? (Ich kann Threads erstellen und nutzen, nur das Verständnis) Allgemeine Java-Themen 6
izoards Java Home Pfad unabhängig von der Version Allgemeine Java-Themen 7
N JAVA-Code mit Grafikfenster zeichnet in Windows, aber nicht Mac. Allgemeine Java-Themen 4
L Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
KonradN CVE-2022-21449: Fehler in Java bei Signaturprüfung Allgemeine Java-Themen 20
berserkerdq2 Java sql Allgemeine Java-Themen 15
JordenJost Unverständlicher Java code? Allgemeine Java-Themen 21
LimDul XSD To Java - Überschreiben von Assoziationen Allgemeine Java-Themen 1
Aartiyadav Comparisons and Swapa in Bubble-sort Java Allgemeine Java-Themen 6
KonradN Java 18 Allgemeine Java-Themen 8
N Statistische Auswertung von Logfiles (Einlesen, auswerten und grafische Aufbereitung von logfiles) mit Java Allgemeine Java-Themen 9
ME2002 Fragen aus einer Java Klausur Allgemeine Java-Themen 67
Z Mit Java 8+ Streams Zeilen nummern zu Zeilen hinzufügen Allgemeine Java-Themen 17
M Verständnisfrage java.util.TimerTask Allgemeine Java-Themen 2
V Hilfe mit Java Code Allgemeine Java-Themen 4
S Processing Java Code verstehen Allgemeine Java-Themen 4
O Newton Algorithmus Java Allgemeine Java-Themen 1
P Java Quellen finden Allgemeine Java-Themen 3
M Java Analyse/ SWOT-Analyse Allgemeine Java-Themen 13

Ähnliche Java Themen

Neue Themen


Oben