无法使用类加载程序jdk.internal.loader

无法使用类加载程序jdk.internal.loader,第1张

删除导入的包。无法使用类加载程序jdkinternalloader可以删除导入的包,当然这只适合这一种bug。类加载指的是将类的class文件读入内存,并为之创建一个javalangClass对象。类的加载过程是由类加载器来完成。

//这个问题原因有以下几种,但是和环境变量并没有太大的关系

//能够执行java 和 javac 就证明你的环境变量已经配置好了,其实 classpath 可以不配置

//假如有如下文件:H:\code\Hellojava

public class Hello{

    public static void main(String[]args){

        Systemoutprintln("Hello");

    }

}

//正确编译命令: javac Hellojava

//正确<a href=">

最近在回顾基础知识的时候,想要用文本编辑器+控制台的方式写java程序,发现习惯了IDE,使用基础命令就遇到一些问题,比如,我在D:\MavenTrainingSpace\hello-world\src\main\java\jar\Appjava文件中写了个HelloWorld程序:

package jar;

/

Hello world!

/

public class App

{

public String satHello(){

return "Hello World";

}

public static void main( String[] args )

{

Systemoutprintln(new App()satHello());

}

}

然后用maven编译之后生成了D:\MavenTrainingSpace\hello-world\target\classes\jar\Appclass文件,我想运行这个class,打印Hello World:

PS D:\MavenTrainingSpace\hello-world> java App

错误: 找不到或无法加载主类 App

登录后复制

注意我当前的路径,是在D:\MavenTrainingSpace\hello-world下的,结果就是报错了,找不到主类

其实原因很简单了:

java指令默认在寻找class文件的地址是通过CLASSPATH环境变量中指定的目录中寻找的。

我们忽略了package的影响

原因1,就是说我们要找的类必须在CLASSPATH,而系统环境变量我们一般是这么配的:

;C:\Program Files\Java\jdk180_131\lib\dtjar;C:\Program Files\Java\jdk180_131\lib\toolsjar;

登录后复制

第一个分号前的表示执行java命令所在的当前目录,其他的则是jdk的类,与我们的问题无关,既然这样,我们当前的目录在哪儿呢?答案是D:\MavenTrainingSpace\hello-world下,在这个当前目录下可能是没有这个类的,那我们到D:\MavenTrainingSpace\hello-world\target\classes\jar\,在运行一下看看:

D:\MavenTrainingSpace\hello-world\target\classes\jar> java App

错误: 找不到或无法加载主类 App

登录后复制

还是不行,这是因为,App类被定义在package jar;里面,所以类的加载路径是jar/Appclass,所以我们到D:\MavenTrainingSpace\hello-world\target\classes下面:

D:\MavenTrainingSpace\hello-world\target\classes> java App

错误: 找不到或无法加载主类 App

登录后复制

还是报错,这就是原因2所说的"忽略了package的影响",因为加载一个类,是需要完整的类名,所以必须要把报名带上:

PS D:\MavenTrainingSpace\hello-world\target\classes> java jarApp

Hello World

登录后复制

这样就行了。

网上的教程到这里一般就结束了,但是我在想,这样太挫了吧,不停的切换目录,而且如果我们在eclipse中新建一个java项目,为什么就能找到这个Appclass并且加载它呢,

其实说到底还是CLASSPATH的事情,java命令执行的时候可以带上一个参数:-classpath [路径],指明了java加载的路径,那么就是说我们可以这样做,我先到一个无关的路径下:

D:\> java -classpath "D:\MavenTrainingSpace\hello-world\target\classes" jarApp

Hello World

登录后复制

你看,我切到了D盘,但是执行的时候,把class所在的路径放在了classpath参数上了,java就明白了要从这个路径里面按照包结构找。

然后回到eclipse的问题上,eclipse为我们做了什么事儿,使得我们不需要关注这些了呢,其实就是每个项目,eclipse生成了一个classpath的文件,通过这个文件,eclipse在执行java命令的时候,就告诉了java命令该去哪里加载类。

以上就是关于无法使用类加载程序jdk.internal.loader全部的内容,包括:无法使用类加载程序jdk.internal.loader、java中无法加载或找不到主类、360java控制台无法加载等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10125650.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存