我必须在学校作业中写一个.jar class loader
。我在另一个问题中找到了这段代码,但无法弄清楚它为何不起作用。
我已将路径设置为绝对路径,以确保它引用正确的文件。
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);
我得到的错误是:
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)
TicTacToe
中的包声明为package spatbord.game;
jar的内容是:
spatbord
-> game
-> TicTacToe.class
我在这里看不到什么?
答案 0 :(得分:3)
看看这个堆栈跟踪:
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)
和内容:
spatbord
-> game
-> TicTacToe.class
特别是在这一行:
java.lang.ClassNotFoundException: spatboard.game.TicTacToe
JRE期待spatbord.game.TicTacToe
,因此这意味着您错误地打包了您的包spatboard
spatbord
。
答案 1 :(得分:-1)
请在第3行代码中使用URLClassLoader而不是ClassLoader。
URLClassLoader loader = new URLClassLoader(new URL[]{url});
让我知道这有效与否。