Java URLClassLoader ClassNotFoundException

31,256

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.

Share:
31,256
Pepijn Compaan
Author by

Pepijn Compaan

Updated on December 10, 2020

Comments

  • Pepijn Compaan
    Pepijn Compaan over 3 years

    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?

    • eliasah
      eliasah about 9 years
      jar tf command to view your jar contents and update your question with the result
    • ryekayo
      ryekayo about 9 years
      spatboard.game.TicTacToe there is a typo somewhere..
    • Jimmy
      Jimmy about 9 years
      change ` loader.loadClass("spatboard.game." + name);` to ` loader.loadClass("spatbord.game." + name);`