Klassen Class Files nachladen (mehrer .jar Dateien)

Context

Mitglied
Ich versuche mehrere "libs" für mein Programm nachzuladen doch dies funktioniert nicht (java.lang.NoClassDefFoundError). Der Grund, dass ich die Klassen so laden muss ist, dass die .jar Dateien beim Start des Programmes normalerweise nicht existieren und somit erst irgendwann während der Laufzeit geladen werden können(müssen). Ich habe einen Testcode erstellt der funktioniert jedoch wenn ich das gleich im eigentlichen Programm einfüge funktioniert es nicht. Das Programm und der Testcode verwenden die selben libs, jedoch hat der Testcode einen anderen "entry" als das Programm selbst.(Das Programm ruft die Methode auch auf jedoch nicht zu beginn) Hier habe ich den Stacktrace:

Exception in thread "Thread-5" java.lang.NoClassDefFoundError: org/lwjgl/LWJGLException
at Game.InputHandler.input(InputHandler.java:43)
at Game.InputHandler.handleInput(InputHandler.java:9)
at Game.Game$1.run(Game.java:72)
Caused by: java.lang.ClassNotFoundException: org.lwjgl.LWJGLException
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 3 more

Exception in thread "Thread-4" java.lang.NoClassDefFoundError: org/lwjgl/LWJGLException
at java.lang.Class.getDeclaredFields0(Native Method)
at java.lang.Class.privateGetDeclaredFields(Unknown Source)
at java.lang.Class.getDeclaredField(Unknown Source)
at Game.Game$LibraryLoader.loadLibraries(Game.java:188)
at Game.Game.start(Game.java:45)
at Client.Update$1.run(Update.java:59)
Caused by: java.lang.ClassNotFoundException: org.lwjgl.LWJGLException
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 6 more

Da es sich hier um relativ viel Code handelt werde ich nur die Klassen hochladen nach denen gefragt wird. Ich hoffe ihr könnt mir helfen.

Grüsse Context
 
Hier habe ich die ganze Klasse Game.
Java:
public class Game {
	
	private static boolean hasStarted = false;
	private static final char s = File.separatorChar;
	
	public static void start(String playerName) {
		if(hasStarted)
			return;
		hasStarted = true;
		Surface.kill(956720);
		read();
		try {
			Natives.nativeSetup();
			LibraryLoader.loadLibraries();
		} catch (SecurityException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(Main.a, e.getMessage());
			System.exit(0);
		} catch (Exception e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(Main.a, e.getMessage());
			System.exit(0);
		}
	}

	private static BufferedReader reader;
	
	public static void setReader(BufferedReader reader) {
		if(Game.reader==null) {
			Game.reader=reader;
		}
	}
	
	private static void read() {
		new Thread() {
			public void run() {
				String line;
				try {
					while((line=reader.readLine())!=null) {
						InputHandler.handleInput(line);
					}
				} catch (IOException e) {
					ObjectControl.stop=true;
					JOptionPane.showMessageDialog(Main.a, "Error by reading.");
					System.exit(0);
				}
			}
		}.start();
	}
	
	static class Natives {
		
		
		private static boolean setupDone;
		
		protected static void nativeSetup() {
			if(setupDone)
				return;
			setupDone=true;
			setupNatives(getOS(),is64Bit());
		}
		private static void setupNatives(OS os,boolean bit64) {
			File file = null;
			if(os==OS.Windows) {
				if(bit64) {
					file = new File(Main.dir+s+"client"+s+"lib"+s+"natives_windows"+s+"64");
				} else {
					file = new File(Main.dir+s+"client"+s+"lib"+s+"natives_windows"+s+"32");
				}
			} else if(os==OS.Linux) {
				if(bit64) {
					file = new File(Main.dir+s+"client"+s+"lib"+s+"natives_linux"+s+"64");
				} else {
					file = new File(Main.dir+s+"client"+s+"lib"+s+"natives_linux"+s+"32");
				}
			} else if(os==OS.MacOsX) {
				file = new File(Main.dir+s+"client"+s+"lib"+s+"natives_macosx");
			} else if(os==OS.Solaris) {
				if(bit64) {
					file = new File(Main.dir+s+"client"+s+"lib"+s+"natives_solaris"+s+"64");
				} else {
					file = new File(Main.dir+s+"client"+s+"lib"+s+"natives_solaris"+s+"32");
				}
			} else if(os==OS.NotSupported) {
				throw new RuntimeException("this OS isn't supported: "+System.getProperty("os.name"));
			}
			try {
	            if(!file.exists()) {
	                  file.mkdirs();
	            }
	            System.setProperty("java.library.path",file.getAbsolutePath());
	            Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths");
	            fieldSysPath.setAccessible( true );
	            fieldSysPath.set( null, null );
            } catch (IllegalArgumentException e) {
                  e.printStackTrace();
            } catch (IllegalAccessException e) {
                  e.printStackTrace();
            } catch (NoSuchFieldException e) {
                  e.printStackTrace();
            }

		}
		private static OS getOS() {
			String os = System.getProperty("os.name");
			if(isWindows(os)) {
				return OS.Windows;
			} else if(isLinux(os)) {
				return OS.Linux;
			} else if(isMacosx(os)) {
				return OS.MacOsX;
			} else if(isSolaris(os)) {
				return OS.Solaris;
			} else {
				return OS.NotSupported;
			}
		}
		private static boolean is64Bit() {
			return Integer.parseInt(System.getProperty("sun.arch.data.model"))==64;
		}
		private static boolean isWindows(String os) {
			return os.toLowerCase().contains("win");
		}
		private static boolean isLinux(String os) {
			return os.toLowerCase().contains("linux");
		}
		private static boolean isMacosx(String os) {
			if(os.contains(" "))
				os=os.replace(" ", "");
			return os.toLowerCase().contains("macosx");
		}
		private static boolean isSolaris(String os) {
			return os.toLowerCase().contains("solaris");
		}
		enum OS {
			Windows,Linux,MacOsX,Solaris,NotSupported;
		}
	}
	static class LibraryLoader {
		
		@SuppressWarnings({ "deprecation", "unchecked", "rawtypes" })
		protected static void loadLibraries() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, MalformedURLException {
			File parentFile = new File(Main.dir+s+"client"+s+"lib");
			ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
			if(classLoader != null && (classLoader instanceof URLClassLoader)) {
				URLClassLoader urlClassLoader = (URLClassLoader)classLoader;
	            Method addURL = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{URL.class});
	            addURL.setAccessible(true);
	            for(File file : parentFile.listFiles()) {
	            	if(file.getName().endsWith(".jar")) {
	            		addURL.invoke(urlClassLoader, new Object[]{file.toURL()});
					}
				}
	            try {
					//hier ist möglicherweise der Fehler da die Klasse schon "bekannt" ist, jedoch beim setup
					//die Klassen aus den anderen libs benötigt werden
					Class c = classLoader.loadClass("Game.openGL.ObjectControl");
					Field field = c.getDeclaredField("testing");
					field.setAccessible(true);
					field.setBoolean(null, true);
					c.getMethod("setup").invoke(null);
					
				} catch (ClassNotFoundException | NoSuchFieldException e) {
					e.printStackTrace();
				}
		        }
			
		}


	}
	

}
 
Zuletzt bearbeitet:

Zurück
Oben