使用java命令运行class文件提示“错误:找不到或无法加载主类“的问题分析

有时候我们需要直接用jdk提供的java命令来执行class文件让软件运行起来,特别是很多初学者,但经常会发现如下提示:

用eclipse或用ant则没有问题。

其实原因很简单,我们忽略了2个细节。

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

2.我们忽略了package的影响。

第一个问题好解决:

我们直接在CLASSPATH环境变量中加入“.;”即可。“.”的意思是搜索当前目录

第二个问题看下面分析:

看下面两个类

  

类A                                                                   类B

类A和类B的唯一差别就是没有定义包名。

我们的工程路径是D:\HelloWorld,在HelloWorld文件夹中建立一个src文件夹,类B的源代码文件就放在src中。用javac编译完以后

会在src文件夹中生成NewsManager.class,如下

执行如下:

现在我们再把源代码换成类A

为什么加入了package后就不对了呢?

类A中package的路径是org.will.app.main。按照java规定,我们应该按照package定义的路径来存放源文件,类A应该放入:

src\org\will\app\main下,如下:

然后我们编译执行:

依然有问题,为什么,其实大家再回去看看java的书籍就会发现,一个类的全名应该是包名+类名。类A的全名:org.will.app.main.NewsManager

好的,再试试:

还是不对。为什么?

仔细看上面的图,我们在main目录下让java命令去执行org.will.app.main.NewsManager,其实它会以为类的路径是:

D:\HelloWorld\src\org\will\app\main\org\will\app\main\NewsManager,大家看到了吧,路径重复了。

所以,我们应该这样执行:

成功!

总结:

一、java执行class文件是根据CLASSPATH指定的地方来找,不是我们理解当前目录。如果希望它查询当前目录,需要在CLASSPATH中加入“.;”,代表当前目录。

二、java执行class文件对package的路径是强依赖的。它在执行的时候会严格以当前用户路径为基础,按照package指定的包路径转化为文件路径去搜索class文件。各位同学以后注意就OK啦。至于网上说的要在CLASSPATH要加各种包等等都是泛泛而谈,真正静下心分析这个问题的资料不多。很多都没有说到点子上,会误导人的。

参考:https://www.cnblogs.com/wangxiaoha/p/6293340.html

原文地址:https://www.cnblogs.com/panchanggui/p/9672216.html

时间: 2024-11-05 14:04:33

使用java命令运行class文件提示“错误:找不到或无法加载主类“的问题分析的相关文章

mac 下 使用 java运行 class 文件 总是提示 “错误: 找不到或无法加载主类”的解决方法

发现问题 切换到mac平台后,突然想写点程序运行在mac下,想到mac自带java,会方便好多.不过在这过程中遇到了麻烦: 总是提示 “错误: 找不到或无法加载主类” 工程结构 查了好久,终于找到原型所在,发现网上很多资料都写的都不太多,自己记录一下.先看看工程的位置和目录. 我的eclipse 工作空间位置是: /Users/zhangyunfei/workspace_java 我的工程名字叫:hellodemo 我的main class 的package name (包名)为: hellod

springboot项目上有个红叉,且ecplise没有自动编译项目,运行提示“错误: 找不到或无法加载主类”

近期在做springboot项目,发现springboot项目上有个红叉但找不到哪个类报错,ecplise没有把项目自动编译,运行还提示"错误: 找不到或无法加载主类",进入工作空间"项目\target\classes",发现项目java类根本没有编译,尝试各种方式发现均不可以,后来在网上发下这篇文章试了确实可以http://blog.csdn.net/u011526234/article/details/50394951,现在remark以下,希望也可以帮到其他遇

Eclipse 无法编译,提示“错误: 找不到或无法加载主类”

jar包问题: 1.项目的Java Build Path中的Libraries中有个jar包的Source attachment指为了一个不可用的jar包, 解决办法是:将这个不可用的jar包remove掉. 2.项目的Java Build Path中的Libraries中有个jar包是不可用的,显示红色叉叉.这说明系统找不到这个这个jar文件. 解决办法:把这个jar删除即可. 3.eclipse: Eclipse处于打开状态,而这时更新SVN代码,再在Eclipse中运行Java程序时也可能

Intellij IDEA 封装Jar包(提示错误: 找不到或无法加载主类)

Intellij IDEA 封装Jar包(提示错误: 找不到或无法加载主类) 封装的过程如下: 然后准备打包 选择Build或者ReBuild即可. 但这样就会引起开始第一个图的问题.提示无法加载主类,另外一个情况就是所有的外部第三方jar包都被封装到一个jar包里面了. 那么如何能解决这个问题呢?百度找了很多发现其实配置都不准确,最终发现有个地方提示如下: https://stackoverflow.com/questions/15724091/how-to-run-a-jar-file-cr

java HelloWorld 提示“错误: 找不到或无法加载主类 HelloWorld“解决方案

在检查环境变量等前提工作准确无误后,注意要配好CLASSPATH,仍然报“错误: 找不到或无法加载主类 HelloWorld“. 本人工程目录:mygs-maven/src/main/java/hello 在hello目录底下: Greeter.java  HelloWorld.java 工程代码:HelloWorld.java package hello; public class HelloWorld { public static void main(String[] args) { Gr

Myeclipse运行提示错误: 找不到或无法加载主类 test.test1 终极解决办法

前提是代码没有问题 简单粗暴的解决办法: 重启电脑 解决办法2: 1.在控制台中点开"Problems",查看里面的错误.如果是多个项目,可以将其他项目暂时关闭. 根据错误进行处理. 2.把项目clean一下 3.项目Refresh一下 在项目上右键 Refresh一下 如果还不行 4.(关键一步) 将编译后的 配置信息或者新修改的对应的.class文件 删除 重新编译运行即可.

Mac 添加java 环境变量成功后,依然会报错 错误: 找不到或无法加载主类

Windows 批处理(bat)文件转换成 Mac 的批处理(sh)文件 1. bat转换成sh文件,注销掉echo ,title字段: 2.将bat文件中的';'分隔符替换成':' ; Mac 添加Java 环境变量 1.打开终端 输入 cd ~ niko:~ mmk$ open -e .bash_profile 打开.bash_profile文件进行编辑: 2.在.bash_profile中添加 JAVA_HOME=`/usr/libexec/java_home` export JAVA_H

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

jar包问题:项目的Java Build Path中的Libraries中有个jar包的Source attachment指为了一个不可用的jar包,解决办法是:将这个不可用的jar包remove掉. 项目的Java Build Path中的Libraries中有个jar包是不可用的,显示红色叉叉.这说明系统找不到这个这个jar文件.解决办法:把这个jar删除即可. eclipse: Eclipse处于打开状态,而这时更新SVN代码,再在Eclipse中运行Java程序时也可能会提示“错误: 找

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

在eclipse中导入一个Java工程,运行时报错:错误: 找不到或无法加载主类 Main! 百思不得其解,网上很多解决办法,但都不对路,最后通过如下办法解决: 打开debug configurations --> classpath选项 选中user entries,点击add jars,把该项目的jar包引入进来,就OK了. 如果上述办法解决了你的问题,不要谢我,叫我雷锋就行,哈哈哈!

命令行中编译和运行JAVA程序出现“错误: 找不到或无法加载主类”

初学JAVA,今天在命令行界面中尝试编译和运行Hello.java (文件当前目录.....\src\chapter1) 1 package chapter1; 2 3 public class Hello { 4 public static void main(String[] args){ 5 if(args.length==0) 6 System.out.println("hello!"); 7 else{ 8 for(int i=0;i<args.length;i++)