Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Plugin (Nie do Minecrafta ;) )


Rekomendowane odpowiedzi

Opublikowano

Hej,

mam swoją gierkę w Javie, jest to gra 2D z Multiplayer, i teraz chciałbym zrobić pluginy (wtyczki) do serwera, grzebałem w craftbukkicie lecz nic ciekawego tam nie znalazłem, nie liczę na gotowca, lecz na jakieś porady jak do tego dojść, wiem że trzeba stworzyć Liba którego się zaimportuje do wtyczki i wtedy on będzie działał na klasach serwera (a także na swoich). Jednym słowem chcę uruchomić jakiegoś .jara w .jarze tak aby ten pierwszy (ładowany) miał dostęp do wszystkich klas (tego co go ładuje)

Pozdrawiam :)

 

Ps. Znalazłem coś ciekawego: http://stackoverflow.com/questions/194698/how-to-load-a-jar-file-at-runtime

Opublikowano

Możesz jakoś sprecyzować pytanie? Pierwszym pomysłem jaki mi przychodzi do głowy to tworzenie własnego ClassLoadera czytającego klasy z osobnych jarów. Do tego wymagasz od twórcy pluginu umieszczenia pliku informacyjnego. Odczytujesz z niego którą klasę masz uruchomić (tak jak w bukkicie). Ładujesz ją swoim ClassLoaderem i refleksją uruchamiasz metodę startową. Czego z tego nie rozumiesz?

708121422388637873334.png

Opublikowano

Pokażę ci prosty przykład:

public abstract class Plugin{

public void onEnable();

public void onDisable();

public int getCos(){
	return 1;
}

}

///////////////////////

public class PluginLoader{

public static void loadPlugins(){
	File f = new File("plugins/");
	if(!f.exits())
		f.mkdir();
	File[] plugins = f.listFiles();
	ClassLoader cl = ClassLoader.getSystemClassLoader();
	for(File plugin:plugins){
		cl = new URLClassLoader(new URL[]{plugin.toURL()}, cl);
		Plugin pl = (Plugin)ucl.loadClass("pl.autor."+plugin.getName().split(".")[0]+".Main");//przyklad
		pl.onEnable();
	}
}

}

Mam nadzieje ze zrozumiesz :)

Zbieram jak większość +!

Opublikowano

Pokażę ci prosty przykład:



public abstract class Plugin{

public void onEnable();

public void onDisable();

public int getCos(){
	return 1;
}

}

///////////////////////

public class PluginLoader{

public static void loadPlugins(){
	File f = new File("plugins/");
	if(!f.exits())
		f.mkdir();
	File[] plugins = f.listFiles();
	ClassLoader cl = ClassLoader.getSystemClassLoader();
	for(File plugin:plugins){
		cl = new URLClassLoader(new URL[]{plugin.toURL()}, cl);
		Plugin pl = (Plugin)ucl.loadClass("pl.autor."+plugin.getName().split(".")[0]+".Main");//przyklad
		pl.onEnable();
	}
}

}
Mam nadzieje ze zrozumiesz :)

 

Kod jest trochę nieprawidłowy. Dlaczego? Castujesz Class do Plugin i wykonujesz na tym metodę - to nie zadziała. Zmień Plugin na Class i uruchom tą metodę refleksją. Poza tym niepotrzebne jest podawanie parent'a, a tutaj podajesz jako parenta URLClassLoadera z poprzedniego wykonania pętli i może to w skrajnym przypadku zmarnować trochę pamięci.

708121422388637873334.png

Opublikowano

Kod jest trochę nieprawidłowy. Dlaczego? Castujesz Class do Plugin i wykonujesz na tym metodę - to nie zadziała. Zmień Plugin na Class i uruchom tą metodę refleksją. Poza tym niepotrzebne jest podawanie parent'a, a tutaj podajesz jako parenta URLClassLoadera z poprzedniego wykonania pętli i może to w skrajnym przypadku zmarnować trochę pamięci.

no tak xD, pisałem to w notatniku na szybko więc błędy były możliwe :D

Zbieram jak większość +!

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...