Java URLClassLoader ClassNotFoundException

时间:2015-04-16 15:56:49

标签: java jar classloader

我必须在学校作业中写一个.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

我在这里看不到什么?

2 个答案:

答案 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});

让我知道这有效与否。