Java永远不能;查找或加载“;主课
我试图运行一些java代码,但遇到了一些我无法理解的问题。java类加载器并不“查找或加载”我直接指向的文件 目录是这样的Java永远不能;查找或加载“;主课,java,windows,jar,classpath,Java,Windows,Jar,Classpath,我试图运行一些java代码,但遇到了一些我无法理解的问题。java类加载器并不“查找或加载”我直接指向的文件 目录是这样的 (project dir)\uwu_bot\target\classes\com\alejandro\uwu_bot\Bot.class 我把“类”作为我的工作目录并调用 java com.alejandro.uwu_bot.Bot 但我明白了 Error: Could not find or load main class com.alejandro.uwu_bot.
(project dir)\uwu_bot\target\classes\com\alejandro\uwu_bot\Bot.class
我把“类”作为我的工作目录并调用
java com.alejandro.uwu_bot.Bot
但我明白了
Error: Could not find or load main class com.alejandro.uwu_bot.Bot
我甚至直接去“alejandro\uwu_bot”做
没有骰子
会发生什么事
问题的首要答案指向了一些Oracle文章,这些文章记录了命令行工具和查找类文件的过程。它没有给我任何其他的想法。这篇文章还向我保证问题不在于类名,而是更深层次的技术问题
代码不是很重要,它只是我管理的Discord bot的主要类
Bot.java:
公共类Bot扩展ListenerAdapter{
/**
*主JDA的全局实例
*/
公共静态JDA-JDA;
public static final ScheduledExecutorService SCHEDULER=Executors.newScheduledThreadPool(1);
公共静态最终SerialPort端口=SerialPort.getCommPort(“COM3”);
public static final ThreadLocalRandom RAND=ThreadLocalRandom.current();
公共静态void main(字符串[]args)引发异常{
System.setProperty(“http.agent”、“Chrome”);
//打开引用中声明的串行端口
如果(!PORT.openPort())
System.err.println(“(警告):端口忙!!”;
jda=newjdabuilder(AccountType.BOT).setToken(TOKEN.build().awaitReady();
addEventListener(newcommandListener());
addEventListener(新的GeneralPurposeListener());
addEventListener(新Bot());
...
正如问题告诉我的那样,我添加了-Xdiag选项以查看更详细的输出
Error: Could not find or load main class Bot
java.lang.NoClassDefFoundError: Bot (wrong name: com/alejandro/uwu_bot/Bot)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
它直接声明找不到该文件
然后我进一步转到“classes”目录并运行
java -Xdiag com.alejandro.uwu_bot.Bot
得到
java.lang.ClassNotFoundException: com.alejandro.uwu_bot.Bot
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
这说明这个类根本不存在
编辑:这已经被宣布为重复,但我不同意。我特别说过我在那篇文章中尝试了解决方案,但没有成功,这是其他原因。我遗漏了一些东西,或者这个问题没有解释我需要的具体细节。请记住,我不是Java方面最有经验的人
文件的源代码树如下所示:
src
├───main
│ └───java
│ └───com
│ └───alejandro
│ └───uwu_bot
│ └───Bot.class
└───test
省略了多个文件,但现在这些都很重要您应该设置类路径
java -cp (project dir)\uwu_bot\target\classes com.alejandro.uwu_bot.Bot
或者,如果您已经在classes目录中,只需
java -cp . com.alejandro.uwu_bot.Bot
您从哪个目录调用该命令?不相关,您的程序包名称不应包含下划线。@Michael,为什么?@Michael,1)
唯一程序包名称的前缀始终以所有小写ASCII字母书写,并且应该是顶级域名之一,如com、edu、gov、mil、net、org。
-prefix!2)t包名称的组成部分根据组织自身的内部命名约定而有所不同
-包名称的下一部分可以是任意的。您的类中是否有包
语句?当前目录是否在类路径中?这是错误的。如果您要运行com.alejandro.uwu\u bot.bot
,则类路径应为指向(项目目录)\uwu\u bot\target\classes
。哦,你是对的。修复了你的第二部分也需要重新措辞
java -cp . com.alejandro.uwu_bot.Bot