Java URLClassLoader ClassNotFoundException

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/29680032/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 08:25:57  来源:igfitidea点击:

Java URLClassLoader ClassNotFoundException

javajarclassloader

提问by Pepijn Compaan

I have to write a .jar class loaderin an assignment for school. I've found this code in another question but can't figure out why it wont work.

我必须.jar class loader在学校的作业中写一个。我在另一个问题中找到了这段代码,但不知道为什么它不起作用。

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 TicTacToeis package spatbord.game;

中的包声明TicTacToepackage spatbord.game;

The contents of the jar are:

罐子的内容是:

spatbord
 -> game
  -> TicTacToe.class

What am I not seeing here?

我在这里看不到什么?

回答by Sri777

Please Use URLClassLoader instead of ClassLoader in 3rd line of code.

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

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

Let me know this worked or not.

让我知道这是否有效。

回答by ryekayo

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

java.lang.ClassNotFoundException: spatboard.game.TicTacToe

the JRE is expecting spatbord.game.TicTacToe, so this means you mispelled your package spatboardspatbord.

JRE 正在spatbord.game.TicTacToe等待,所以这意味着您拼错了您的包spatboardspatbord