【问题标题】:Java URLClassLoader ClassNotFoundExceptionJava URLClassLoader ClassNotFoundException
【发布时间】:2015-06-23 04:09:31
【问题描述】:

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

我在这里没有看到什么?

【问题讨论】:

  • jar tf 命令查看您的 jar 内容并使用结果更新您的问题
  • spatboard.game.TicTacToe 某处有错别字..
  • 将`loader.loadClass("spatboard.game." + name);`改为`loader.loadClass("spatbord.game." + name);`

标签: java jar classloader


【解决方案1】:

看看这个堆栈跟踪:

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

【讨论】:

    【解决方案2】:

    请在第三行代码中使用 URLClassLoader 而不是 ClassLoader。

    URLClassLoader loader = new URLClassLoader(new URL[]{url});
    

    让我知道这是否有效。

    【讨论】:

      猜你喜欢
      • 2011-05-18
      • 1970-01-01
      • 2014-09-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多