精华内容
下载资源
问答
  • Java命令行运行错误: 找不到或无法加载主类

    万次阅读 多人点赞 2021-01-17 18:15:46
    前言:虽然学习Java语言约有两年多,但在最近需要使用命令行工具编译并运行Java程序时,还是报错了。花费了一些时间,解决了该问题,发现解决方法在初学Java时使用过。...找不到或无法加载主类,主要原因有

    前言:虽然学习Java语言约有两年多,但在最近需要使用命令行工具编译并运行Java程序时,还是报错了。花费了一些时间,解决了该问题,发现解决方法在初学Java时使用过。一则,为了避免以后再出现同样的问题而浪费不必要的时间;二则,作为使用该语言的程序员,对于该语言的一些基本问题,应该有清晰的理解和认识;三则,网上的一些解决方案,不够完备。有的没有解释问题原因,直接给出答案;有的,未列举出某些常见情况的解决方案。因此,写此文章,让读者可以举一反三,深入理解问题。

    一、 问题分析

    找不到或无法加载主类,主要原因有两个:

    1. 类名错误

    2. 类所在位置未添加至类加载路径中

    二、 问题解决

    本部分将针对在“一”中提出的两个问题发生原因,分别进行分析及处理。并且会介绍java的一些和处理问题相关的基本概念。

    1. 类名错误

    全限定类名:包名+类名。另外,当包名为空时(即代码不包含package语句),称类所在包为默认包

    例如,以下代码的全限定类名为:“com.gzn.demo.HelloWorld”

    // 文件名HelloWorld.java
    package com.gzn.demo;
    public class HelloWorld {
        public static void main(String args[]) {
            System.out.println("hello world");
        }
    }
    

    在运行java程序时,全限定类名可以唯一确定该文件,就像是文件系统中路径(相当包名)+文件名(相当类名)可以唯一确定一个文件一样。本质上包名发挥的作用和文件系统中的目录相同,有利于文件分隔避免重名。

    现在存在一个问题,Java是如何识别一个类文件的包名的?
    实际上,包名的识别是通过文件系统的目录实现的 。例如,上文提到的包名为“com.gzn.demo”的HelloWorld.java文件,该文件在文件系统中的位置为 “com\gzn\demo”,编译后的HelloWorld.class也在"com\gzn\demo"目录下,因此,在运行java程序后加载类时,只需在“com\gzn\demo”目录下,查看是否存在要查找的文件即可。简而言之,目录(或路径)名于包名存在一一映射的关系,可认为相等。

    在Windows操作系统的命令行下,运行Java代码的语法格式为,注意,此时java命令位于目录com的上一级目录(一般为项目的目录名);类名不能包含扩展名.class

    Java 全限定类名
    例如java com.gzn.demo.HelloWorld;包名为空则为java HelloWorld

    Windows操作系统中还有另一种语法格式(其他系统未必可以),不常用,使用反斜杠代替了点好,之所以没用正斜杠,个人猜测是为了和系统的文件分隔符进行区分:

    例如Java com/gzn/demo/HelloWorld; 包名为空则为java HelloWorld

    可能出错情况一 :在命令行运行java程序时,类名包含了扩展名

    在helloworld项目目录下运行java命令,HelloWorld.class文件在“com\gzn\demo”目录下,即包名为com.gzn.demo,上文已介绍,不在赘述。
    C:\Users\gzn\helloworld>java com.gzn.demo.HelloWorld.class
    或者包名为空
    C:\Users\gzn\helloworld> java HelloWorld.class
    上述写法,会出现报错,原因是它不符号java运行程序的语法格式,java可能把“HelloWorld.class”作为一个整体类名处理,那么要查找的文件可能是“HelloWorld.class.class”,显然是找不到的。

    可能出错情况二 :运行Java命令时未指明全限定类名的包名部分或指明了包名但Java命令运行的位置不正确
    假设HelloWorld.class,包名为com.gzn.demo,所在位置为: C:\Users\gzn\helloworld\com\gzn\demo
    运行以下命令
    C:\Users\gzn\helloworld\com\gzn\demo>java HelloWorld
    运行命令后,会在当前目录下,查找并读取该文件后,发现该类为“com.gzn.demo.HelloWorld”(全限定类名唯一确定一个类,上文已介绍)与我要运行的类“HelloWorld”并不是同一类,因此,找不到要运行的类。
    于是,很自然的一个想法是运行以下命令
    C:\Users\gzn\helloworld\com\gzn\demo>java com.gzn.demo.HelloWorld
    包名和文件名是一一映射的(上文已介绍),运行命令后,会从命令所在位置开始(即以命令所在位置为相对路径),查找“com\gzn\demo\”路径下的HelloWorld文件。由于“C:\Users\gzn\helloworld\com\gzn\demo”路径下根本不存在目录“com”(更不用说gzn\demo),因此,找不到运行的类。

    正确的运行命令的方法,呼之欲出,只需改变命令的运行位置即可,如下所示
    C:\Users\gzn\helloworld>java com.gzn.demo.HelloWorld
    运行命令后,会在“com\gzn\demo”路径下找到并读取HelloWorld文件,发现该类的全限定名为“com.gzn.demo.HelloWorld”,查找的类正是Java想要运行的类。


    以上是比较初级的出错情况,下文将要介绍相对比较高级的出错情况,这也是其他博文未曾给出解决方案的情况。同时还会介绍classpath的概念,及使用方法。加油!

    2. 类所在位置未添加至类加载路径中

    类加载路径(Classpath):当你的程序依赖第三方或者自己写的类文件时,需要指出上述文件的所在位置,即类加载路径。Java虚拟机的类加载器会在你指定的路径中,查找你的程序所依赖的类文件(依赖的类文件 在import语句中指定)

    classpath可以通过以下两种方式指定:

    方式一:配置环境变量

      这种方式是初学Java者肯定了解的方式,通常在下载完JDK后就会进行配置。然而在JDK1.5之后,官方已不建议使用这种方式来指定类加载路径,原因后文扩展部分会谈及。

    在这里插入图片描述
    说明:“.”表示在当前目录,即java等命令运行时所在目录;
    dt.jar是关于运行环境的类库,主要是用于swing的包,如果不使用可以不配置;
    tools.jar是工具类库,它在编译和运行一个类时被使用

    方式二:java命令的-cp(或-classpath)参数指定(官方建议)

    这种方式是JDK1.5后官方建议的方式。当你在命令行下运行java命令时,如果没有指定-classpath参数,那么默认使用环境变量中设置的ClASSPATH。官方建议,你在运行每个程序时,为其显示设置所依赖的类文件所在的位置,而不是使用“全局”性质的环境变量中CLASSPATH。一旦你运行程序时指定了-classpath参数,环境变量中的CLASSPATH就不会在使用,而是使用你参数的classpath。实际上,JDK1.5以后,官方已经不建议配置CLASSPATH环境变量。

    语法格式如下:

    java -cp <路径1;路径2;…> 全限定类名

    路径:依赖的文件所在的绝对路径(或相对路径),如果类文件在jar包中,路径后还要写上jar包的名字,例如“C:\users\gzn\mylib\algs4.jar”
    注意,“.”代表当前路径,即java命令运行时所在路径。

    可能出错情况三 :存在依赖外部jar包时,命令行运行java命令,classpath参数中只是添加了外部jar包路径,没有添加当前目录“.”,导致要运行的类文件找不到。

    或者,程序在IDE(eclipse、IDEA等)开发工具中可以运行,但是在命令行下不能运行,情况相同。

    在某篇高赞博文中,依然存在的问题
    在这里插入图片描述
    下面,通过问题在现的方式,讲解解决方法。
    项目简介:HelloWorld.java程序,位置“C:\Users\gzn\helloworld\com\gzn\demo”,依赖algs4.jar(位置C:\Users\gzn\helloworld)中的edu.princeton.cs.algs4.StdOut类,调用了该类的print函数,其API如下

    public class StdOut
    public static void print(String s); 打印输出指定的字符串

    HelloWorld.java

    package com.gzn.demo;
    import edu.princeton.cs.algs4.StdOut;
    
    public class HelloWorld {
    	public static void main(String args[]) {
    		StdOut.print("Hello World!");
    	}
    }
    

    项目结构如下图所示:
    在这里插入图片描述
    在命令行运行程序时,存在外部依赖,不仅要在-cp (或-classpath)中指明依赖的路径,还有把当前路径加进去。因为当你指定了-classpath参数后,环境变量失效,于是环境变量CLASSPATHY中设置的当前目录“.”也就不能用了。虚拟机类加载器加载类的路径只能在classpath类加载路径指明的位置中查找,如果路径中没有添加当前目录“.”,也就是当前要运行的类所在位置没有添加到类加载路径中,显然会查找不到类。解决方法如下图所示:
    在这里插入图片描述

    三、扩展知识

    1. JDK目录结构及环境变量介绍

    JDK目录介绍
    在这里插入图片描述

    初学者环境变量配置如下:

    变量名
    CLASSPATH.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tool.jar (注,jdk1.5后无需配置)
    JAVA_HOMED:\jdk8(JDK安装目录,视个人安装情况而定)
    Path%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin

    Path为命令行工具指定命令的查找路径。命令的本质是可执行程序,设置后可以在命令行工具下运行java、javac、javah等常用的命令;
    JAVA_HOME 指定了JDK(Java开发工具包)路径。设置后,无论是编译还是运行程序,类加载器都会从相应的目录中加载需要的类库。如运行javac编译命令,会从”%JAVA_HOME%\lib\tool.jar”加载需要的类;通过java命令运行程序,会从“%JAVA_HOME%\jre\lib\rt.jar”加载程序依赖的类;Java虚拟机会从“%JAVA_HOME%\jre\lib\ext\”加载依赖的类。

    jdk中的函数库lib称为Java的标准库,指定了JAVA_HOME环境变量后就可以使用了,编译和运行会自动在相应位置查找依赖的类。而第三方库(如mysql-connector-java-5.1.40.jar)和用户自己定义的类库 在编译和运行时,需要在-cp类加载路径参数中指明库的位置。

    2. 为什么jdk1.5后不需要配置环境变量了?

    此部分内容参考自Java开发环境不再需要配置classpath!

    在JDK1.5之前,是没有办法在当前目录下加载类的(找不到 JDK目录下lib文件夹中的.jar文件),所以我们需要通过配置classpath,但JDK1.5之后,JRE能自动搜索目录下类文件,并且加载dt.jar和tool.jar的类。

    The class path tells the JDK tools and applications where to find third-party and user-defined classes that are not extensions or part of the Java platform. See The Extension Mechanism at
    类路径告诉JDK工具和应用程序在哪里可以找到第三方和用户定义的类,这些类既不是Java平台的扩展,也不是Java平台的一部分。参见扩展机制

    If you upgrade from an earlier release of the JDK, then your startup settings might include CLASSPATH settings that are no longer needed. You should remove any settings that are not application-specific, such as classes.zip. Some third-party applications that use the Java Virtual Machine (JVM) can modify your CLASSPATH environment variable to include the libraries they use. Such settings can remain.

    如果您从JDK的早期版本升级,那么您的启动设置可能包括不再需要的类路径设置。您应该删除任何与应用程序无关的设置,比如classes.zip。一些使用Java虚拟机(JVM)的第三方应用程序可以修改类路径环境变量,以包含它们使用的库。这样的设置可以保留。

    You can change the class path by using the -classpath or -cp option of some Java commands when you call the JVM or other JDK tools or by using the CLASSPATH environment variable. See JDK Commands Class Path Options. Using the -classpath option is preferred over setting the CLASSPATH environment variable because you can set it individually for each application without affecting other applications and without other applications modifying its value. See CLASSPATH Environment Variable.

    在调用JVM或其他JDK工具时,可以使用一些Java命令的-classpath或-cp选项,或者使用CLASSPATH环境变量,来更改类路径。参见JDK命令类路径选项。使用-classpath选项优于设置CLASSPATH环境变量,因为您可以为每个应用程序单独设置它,而不影响其他应用程序,也不需要其他应用程序修改它的值。参见CLASSPATH环境变量。

    展开全文
  • IDEA 错误 找不到或无法加载主类(完美解决)

    万次阅读 多人点赞 2021-01-16 22:12:02
    今天在运行项目的时候突然出了这样一个错误:IDEA 错误 找不到或无法加载主类 问题报错 找不到或无法加载主类 CSDN 有大佬是这样解决的 错误:找不到或无法加载主类 猜测:1,未能成功编译; 尝试:菜单—》Build—...

    博主希望能得到各位看官的支持!
    一键三连

    两块四块不嫌少,二十五十会更好,一键三连好人一生平安!
    如何支持?
    在这里插入图片描述

    前言

    今天在运行项目的时候突然出了这样一个错误:IDEA 错误 找不到或无法加载主类,相信只要是用过IDEA的朋友都

    遇到过它吧,但是每次遇到都是一顿焦头烂额、抓耳挠腮、急赤白咧!咋整呢?听我给你吹~

    瞧我这张嘴~


    问题报错

    找不到或无法加载主类


    问题截图

    在这里插入图片描述


    CSDN 有大佬是这样解决的:

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

    猜测:
    1,未能成功编译;
    尝试:菜单—》Build—》Rebuild Prodject
    结果:启动服务仍然报同样的错误
    2,缓存问题;
    尝试:菜单—》File—》Invalidate Caches/Restart 选择Invalidate and Restart 或者 只是Invalidate,清除掉缓存,然后 >Rebuild Project

    结果:启动成功,问题解决


    虽然在网上找到很多相关的解决办法,但是问题的根本原因好像并没有被挖掘到,治标不治本,下次在遇到一样是

    慌乱手脚,今天就给他来个追根溯源,刨根问底,永绝后患hiha
    在这里插入图片描述

    解决方案

    一、file—>Project Structure
    在这里插入图片描述
    二、点击Project Settings中的Moudles—>点击减号将所有的Moudle删除
    在这里插入图片描述

    三、点击+号重新引入Moudle
    在这里插入图片描述

    四、找到项目的父文件夹中的pom文件—>OK
    在这里插入图片描述
    五、Rebuild Project
    在这里插入图片描述
    完美解决
    在这里插入图片描述


    写在最后

    导致此问题的原因可能不止于此,希望有不同意见的小伙伴在评论区讨(si)论(bi)!

    展开全文
  • } } 是在myeclips中写的,运行后就报 错误: 找不到或无法加载主类 newa.SyncThread。不是环境变量的问题,是和debug和release调试方法有关吗,小弟对这两种调试方法不是很懂,望各位解惑。 解决方案 20 朋友你的...

    代码如下

    public class SyncThread implements Runnable {

    public static void main(String[] args) {

    System.out.println(“this is”+ count);

    }

    private static int count;

    public SyncThread() {

    count = 0;

    }

    public void run() {

    synchronized (this) {

    for (int i = 0; i 

    try {

    System.out.println(Thread.currentThread().getName() + “:”

    + (count++));

    Thread.sleep(100);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    }

    }

    }

    public int getCount() {

    return count;

    }

    }

    是在myeclips中写的,运行后就报 错误: 找不到或无法加载主类 newa.SyncThread。不是环境变量的问题,是和debug和release调试方法有关吗,小弟对这两种调试方法不是很懂,望各位解惑。

    解决方案

    20

    朋友你的main方法放外面吧,然后调用线程

    public class SyncThread implements Runnable {

    private static int count;

    public SyncThread() {

    count = 0;

    }

    public void run() {

    synchronized (this) {

    for (int i = 0; i 

    try {

    System.out.println(Thread.currentThread().getName() + ":"

    + (count++));

    Thread.sleep(100);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    }

    }

    }

    public int getCount() {

    return count;

    }

    }

    class test {

    public static void main(String[] args) {

    SyncThread s = new SyncThread();

    s.run();

    }

    }

    CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明找不到或无法加载主类错误!

    展开全文
  • 错误说明本次测试类为TestMain如果使用常规方式,即,java TestMain.class 运行当前class文件即会报找不到当前类,就是我们想要运行的TestMain.class文件。可是TestMain.class就在我们想要运行的目录下啊,而且cmd也...

    85e26e766de8cf6ee557a119c8fbcd26.png

    错误说明

    1bd606fee38a3e0b694d2fef9685994b.png

    本次测试类为TestMain

    如果使用常规方式,即,java TestMain.class 运行当前class文件

    72a79d3e014b0c1f96ecf1adf21240a7.png

    即会报找不到当前类,就是我们想要运行的TestMain.class文件。

    可是TestMain.class就在我们想要运行的目录下啊,而且cmd也是在当前目录打开的,那就应该能正常运行。

    先附上正确运行的方式,我们在来看差别

    261a39837e3f760a6c3c478f48d61b9a.png

    可以看到,只是添加了一个-classpath参数以后,该TestMain.class文件就可以正常运行,看样子问题就出在这个-classpath参数上。

    java -classpath C:Users

    ikolaperelmanIdeaProjectsmy-nettysrcmainjava com.gitee.randomobject.test.TestMain

    因为如果不添加-classpath文件的路径,那么就是默认去环境变量中去寻找class文件,默认环境变量一般配置为

    JAVA_HOME,%JAVA_HOME%in,或者classpath:%JAVA_HOME%libt.d=jar;%JAVA_HOME%libools,jar 等等吧,这些配置的路径下边怎么会有我们生成的TestMain.class文件呢,故需要手动指定,这就是-classpath的作用,后边com.gitee.randomobject.test为完整的包名,TestMain及为需要运行的类名。这样,就是一个完整的,可以让jvm找到需要加载的我们自定义的class文件的路径了。classpath顾名思义,就是class(Java的编译后的二进制文件格式)的path(路径)嘛。

    添加自定义JVM参数的运行方式

    java -Xmx10m -Xms10m -Xmn5m -XX:+PrintGCDetails -classpath C:Users

    ikolaperelmanIdeaProjectsmy-nettysrcmainjava com.gitee.randomobject.test.TestMain

    设置新生代5m,初始堆10m,最大堆10m,并且打印垃圾回收日志的jvm参数来运行TestMain类

    0e135adff15f53cb8c056b3078d9e448.png

    展开全文
  • 相信有很多人都遇到过java找不到或无法加载主类的这个问题,那么这究竟是什么原因造成的呢?有什么方法可以解决这个问题吗?问题:java文件导入到一个包当中,之后在class文件当中加入一张图片;解决:将class文件中的...
  • 前言 ...错误: 找不到或无法加载主类 com.bbzd.com.Application 问题原因 编辑启动设置 Main class路径错误导致,可以发现多出来一个 解决办法 删除错误启动设置 修改Main class 路径 ...
  • 54 1,732 NewGame.class 2014/03/29 01:16 1,537 NewGame.java 9 个文件 21,002 字节 2 个目录 128,317,755,392 可用字节 H:\Java\day331>java -jar FG.jar 错误: 找不到或无法加载主类 NewGame 源代码我上传到...
  • 在使用IDEA创建了一个普通Java项目,执行main()方法时,程序报错如下:“错误: 找不到或无法加载主类 com.Main Process finished with exit code 1”,我确信自己的java jdk安装和环境变量配置(java jdk安装和环境...
  • 场景:使用java命令运行.class文件时出现:“错误: 找不到或无法加载主类”:解决方法:使用 java 包名+类名执行,如下:在src下使用 java com.lznb.cloud.TCPEchoClient原因:1.java指令默认在寻找class文件的地址...
  • 错误:找不到或无法加载主类 可能刚刚改过文件夹权限建议该回去 如果实在不记得可以新建个文件夹在把项目考进去
  • }} 目录的结构E:/study/my_study_document/java debug(此目录即是cn的父目录,此时cn/guopeng目录结构可以存在,若存在并且hello.java在cn/guopeng目录下,则应该将hello.java拷贝他们的父目录java debug下。...
  • public static void insert(){ try { // 1: 加载数据库驱动程序 Class.forName("com.mysql.jdbc.Driver"); //2: 获取数据库连接 try { Connection conn = (Connection) DriverManager.getConnection(URL, USERNAME...
  • 场景:使用java命令运行.class文件时出现:“错误: 找不到或无法加载主类”:原因:1、java指令默认在寻找class文件的地址是通过CLASSPATH环境变量中指定的目录中寻找的。2、忽略了package的影响。解决方法:使用 ...
  • 由于是在运行阶段出现的问题,那么可能是环境变量配置不当的问题,即可能是classpath路径配置错误,而导致.class文件无法加载。那么此时你可以检查是否配置好classpath路径,一般来说classpath路径配置如下:.;%java...
  • 找不到或无法加载主类什么意思?

    千次阅读 2021-03-14 18:21:53
    顾名思义,当java找不到您要执行的类时,就会发生这个错误。为了更好地理解错误,您应该熟悉类路径CLASSPATH。如果你不熟悉类路径,那么请检查一下什么是类路径以及它与路径的区别。如果java查找所有类文件的...
  • 以上两种情况都有: 按以上两种情况操作一遍(顺序无所谓) 到此这篇关于详解springBoot启动时找不到或无法加载主类解决办法的文章就介绍到这了,更多相关springBoot启动时找不到或无法加载主类内容请搜索脚本之家...
  • Java错误:找不到或无法加载主类

    万次阅读 2021-10-18 15:13:51
    目录前言java c xxx.java 编译需要相对物理路径java xxx 编译需要虚拟路径总结 前言 一般情况下,我们都使用工具进行代码的编辑和调试,例如eclipse 、Manven、Android Studio、sublime...的时候 极有可能出现找不到或
  • 有时,当我们运行Java程序时,我们可能会看到“找不到或无法加载主类”。原因很容易猜测:JVM找不到主类并给出了这个错误。但是为什么不能呢?在本文中,我们将讨论找不到主类的可能原因。另外,我们将看看如何修复...
  • // 将数据库连接保存线程中 } catch (SQLException e) { e.printStackTrace(); } } return conn; } public static boolean closeConnection() {// 关闭数据库连接的方法 boolean isClosed = true; Connection conn...
  • 错误: 找不到或无法加载主类 com.yan.ms.work.WorkServiceApplication Disconnected from the target VM, address: '127.0.0.1:51456', transport: 'socket' 有时候更新gradle后,启动项目就报错了, 错误: ...
  • 记录一个方法,可能是项目之前运行过,然后又重新拉了代码。在文件里删除idea.这个文件然后再打开项目就可以了这个问题与jdk,和maven无关。
  • cmd下出现找不到或无法加载主类的问题

    千次阅读 多人点赞 2021-05-18 15:39:41
    之前安装过jdk,安装另一个版本的jdk,配置环境后出现了找不到或无法加载主类的问题。经过相关资料查询,整理后有如下情况(其实这些情况都不是我遇到的,我遇到的写在最后)。 1.环境变量配置错误。 -如果java和...
  • 一 概述D:\Project\Computer-Science-And-Technology\writeExam\...java CommandLineParameter错误: 找不到或无法加载主类 CommandLineParameterD:\Project\Computer-Science-And-Technology\writeExam\farben\sr...
  • 错误: 找不到或无法加载主类 原因: java.lang.ClassNotFoundException: 解决方法1:安装java8版本 解决方法2:修改sh脚本(亲测有效),无需修改Java版本 #为原有内容,下面为替换内容, 目的是去除JAVA_OPT_EXT_FIX ...
  • 一、问题描述java在执行的时候,会遇到这样的报错,编译可以正常通过,只是执行java命令时会报错,例如:G:\1\JavaPrac\tankproject\...java TankGame1错误: 找不到或无法加载主类 TankGame1二、解决方法主要是配置...
  • java提示找不到或无法加载主类的解决方法:1、打开高级系统设置,进入环境变量设置;2、新建JAVA_HOME变量,设置jdk安装路径;3、编辑PATH变量,添加bin目录的路径,点击【确定】即可。解决思路:设置环境变量即可。...
  • 从昨天开始使用IDEA开始就一直在搭建java环境,许久没有使用过java,刚开始有些生疏,先建了一个最简单的类:test.java ,可是运行的时候出现 错误:找不到或无法加载主类 。在网上了好久资料,都是环境变量的问题...
  • 今天复习Java基础知识时,使用cmd命令窗口进行编译Java文件发现了如下问题:网上有...接下来输入java -versionjavac也没毛病:接下来检查环境变量:用途:告诉jvm要使用执行的class放在什么路径上,便于JVM加载cl...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 29,997
精华内容 11,998
关键字:

找不到或无法加载主类

友情链接: WinFormSkinDemo.zip