Reputation: 74
I have to write a .jar class loader
in an assignment for school. I've found this code in another question but can't figure out why it wont work.
I've set the path to be an absolute path to make sure it references to the right file.
System.out.println("Loading game: " + name);
URL url = new URL("file:///home/<name>/Documents/School/thema2.3/batavus/batavus/gamemodules/TicTacToe.jar");
ClassLoader loader = new URLClassLoader(new URL[]{url});
Class<?> clazz = loader.loadClass("spatboard.game." + name);
Class<? extends Game> boardClass = clazz.asSubclass(Game.class);
Constructor<? extends Game> ctor = boardClass.getConstructor();
return ctor.newInstance(board);
The error I get is:
Loading game: TicTacToe
java.lang.ClassNotFoundException: spatboard.game.TicTacToe
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at spatbord.loader.GameLoader.loadModule(GameLoader.java:29)
at spatbord.model.Board.<init>(Board.java:51)
at spatbord.controller.GameController.onMatchStarted(GameController.java:157)
at spatbord.connection.Server.matchStarted(Server.java:428)
at spatbord.connection.Server.handleInput(Server.java:346)
at spatbord.connection.Server.run(Server.java:145)
at java.lang.Thread.run(Thread.java:745)
The package declaration in the TicTacToe
is package spatbord.game;
The contents of the jar are:
spatbord
-> game
-> TicTacToe.class
What am I not seeing here?
Upvotes: 3
Views: 37556
Reputation: 2421
Look at this stacktrace:
Loading game: TicTacToe
java.lang.ClassNotFoundException: spatboard.game.TicTacToe
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at spatbord.loader.GameLoader.loadModule(GameLoader.java:29)
at spatbord.model.Board.<init>(Board.java:51)
at spatbord.controller.GameController.onMatchStarted(GameController.java:157)
at spatbord.connection.Server.matchStarted(Server.java:428)
at spatbord.connection.Server.handleInput(Server.java:346)
at spatbord.connection.Server.run(Server.java:145)
at java.lang.Thread.run(Thread.java:745)
and the contents:
spatbord
-> game
-> TicTacToe.class
Specifically at this line:
java.lang.ClassNotFoundException: spatboard.game.TicTacToe
the JRE is expecting spatbord.game.TicTacToe
, so this means you mispelled your package spatboard
spatbord
.
Upvotes: 5
Reputation: 540
Please Use URLClassLoader instead of ClassLoader in 3rd line of code.
URLClassLoader loader = new URLClassLoader(new URL[]{url});
Let me know this worked or not.
Upvotes: -1