首页 > 编程知识 正文

java文件找不到路径怎么找,java程序找不到或无法加载主类

时间:2023-05-06 08:03:14 阅读:63092 作者:4000

前言:地基不牢,地动山摇。 开始学习语言后,可以使用IDE集成开发工具编写代码,只需一个按钮即可解决所有编译和运行问题。 就像汽车的自动档一样。 虽然隐藏了许多重要细节,但实际上编译和运行开发工具的是JDK的javac和java。 我们也可以直接使用这些工具编译和运行我们的代码。 在此期间,渠道一定会遇到很多有趣的问题,有助于解决这些问题,了解本质,提高能力。

使用编译工具javac编译源文件时出现了问题,如下图所示。 软件包XXX不存在; 找不到符号。 主要找不到类名和方法名。

2解决问题的原因可能有三个。 如果出现“错误:找不到符号”问题,则可能没有使用import关键字将类导入到源文件中。 如果同时出现“包XXX不存在”问题,则找不到从属文件。 如果不是以上两个原因,那可能是你源文件中的类名标记有误。

不使用import关键字导入此类的解析:导入即可。 例如import javax.servlet.*;

2 .使用时类名书写错误的解决方法:检查源文件中使用的类名或方法名称是否与导入的类匹配,如果不匹配则进行更正。

3 .在介绍找不到依赖关系的类之前,请了解如何使用专业术语和javac命令。

如下图所示,进行了简单的说明,我新建了helloworld项目。 类MyApp依赖于两个类:定制的com.company.util.Say和第三个jar包的Edu.Princeton.cs.alg

MyApp.java

package com.company.app; import edu.Princeton.cs.alg S4.stdout; import com.company.util.Say; 公共类myapp { publicstaticvoidmain (string args [ ] ) stdout.print ) ' thethirdpartylib3360Helloworld!' ); say.print (myown lib : hello world! ' ); }} Say.java

package com.company.util; public class say { publicstaticvoidprint (string words ) system.out.println ) words; } http://www.Sina.com/http://www.Sina.com /例如,MyApp.java是package com.company.app; 因此,MyApp.java必须位于comcompanyapp目录下,并且该目录结构的某些部分必须与MyApp.java文件视为一体。 理解这个很重要。helloworld为项目根目录,src为源文件根目录,outclasses为源文件编译后输出的根目录.

下面将介绍全限定类名:包名+类名,一个类的包名体现在操作系统中是对应的目录例如,命令c :usersgznhelloworldjavacsrccomcompanyappmyapp.Java 其中“c:usersgznhello”

使用javac命令

javac和java查找类都是根据全限定类名的

指定用于搜索options: 当前目录,即命令运行时所在的目录用户类文件和注释处理程序的位置。 指定要在其中搜索缺省当前目录、运行命令时的目录3358www.Sina.com/输入源文件的位置。 缺省的当前目录,运行命令时的目录3358www.Sina.com

源文件

需要编译的源文件

javac options source files

在这里,我们将以目前的方式一步一步地阐明解决问题的最佳做法。 在3358www.Sina.com/,-classpath (等同-cp)路径上运行编译命令时,既找不到自定义软件包,也找不到第三方软件包,而且也找不到该软件包中的类找不到符号。

首先,让我们解决找不到第三方软件包edu.prin的问题

ceton.cs.algs4的问题,由于我们在运行javac命令时,没有通过参数-classpath指定字节码类文件(后缀.class)的查找路径,因此会使用操作系统环境变量中定义的CLASSPATH(如果定义了的话)。我们先假设没有定义该环境变量,那么就要从当前目录下查找字节码类文件,即从helloworld目录下查找edu
princeton.cs.algs4.StdOut(对应与操作即,eduprincetoncsalgs4StdOut.class),可想而知,根本不存在该目录及文件。我们在回过头来看看操作系统的环境遍量,如下图所示

变量值中的点“.”代表当前目录,我们已经得知,当前目录下找不到程序包。接着回去%JAVA_HOMElibdt.jar和%JAVA_HOMElibtool.jar中寻找程序包edu.princeton.cs.algs4,显然也是查找不到的,因为此程序包位于helloworldlibsalgs4.jar中。所以,可以把该路径加入到系统环境变量中,但是此方法太麻烦,不可能每次添加依赖都去设置一下环境变量,因此不推荐使用。那么可以通过使用-classpath参数设置程序包所在的jar,此方法是官方推荐的。

第二步,在项目根目录helloworld下运行编译命令,并使用-classpath参数

我们自定义的类的程序包不存在,原因有二:1.源文件还没有编译 2.编译后的字节码文件未添加到类查找路径

第三步,在helloworldsrc源文件根目录下运行编译命令”


可以看到我们自定义的程序包即使用的类不再有问题,但是第三方程序包又找不到了。我们先来分析为什么自定义的程序包及类没有问题,编译时,遇到语句import com.company.util.Say,先去classpath下查找,由于没有配置环境变量或显示的使用-classpath参数,所以在当前目录helloworldsrc下,查找com.company.util.Say(对应于文件系统,comcompnayutilSay.class)显然不存在。然后,去sourcepath(由于没有指定-sourcepath参数,所以sourcepath为当前目录,即helloworldsrc)下查找com.company.util.Say(对应于文件系统,comcompnayutilSay.java),可以查找到,于是就进行了编译。由于没有指定编译输出目录参数-d,因此,编译后的字节码文件放在了与源文件相同的目录下,即comcompnayutilSay.class。然后,再重新在classapth下(即当前目录helloworldsrc下)就可以找到程序包及类文件了。

对于没有依赖第三发程序包的情况,在源文件根目录下运行编译命令,不会出现题目中的问题。

但是,我们依赖的第三方程序包及类文件,由于没有通过参数-classpath指定,又找不到了,因此,我们需要在-classpath参数中指定当前目录和第三方程序包及类所在目录。

第四步,在“helloworldsrc源文件根目录”下运行编译命令,并使用-classpath参数
命令:C:Usersgznhelloworldsrc>javac -classpath .;C:Usersgznhelloworldlibsalgs4.jar comcompanyappMyApp.java (图片不清数,点击图片可以使图片变清晰,或者看命令!)

其实,第四步还可以优化,我们希望helloworldsrc源文件下只存在源文件,即编译输出到一个固定的目录,如outclasses,不在输出到默认的目录,这样可以使得项目的结构根清晰,同时classpath中的当前目录应该替换为outclasses,还需要使用-sourcepath指定源文件根目录,不在使用当前目录为源文件根目录。

第四部优化,同时是最佳实践,在helloworldsrc源文件根目录,下运行命令,并使用-classpath参数

命令:C:Usersgznhelloworld>javac -sourcepath src -classpath outclasses;libsalgs4.jar -d outclasses srccomcompanyappMyApp.java(图片不清数,点击图片可以使图片变清晰,或者看命令!)

对于同时依赖自定义和第三方类文件的情况,推荐建议使用这种方法和类似的目录结果。

另外补充说明,现在classpath的outclasses存在com.company.util.Say.class文件,sourcepath的src存在com.company.util.Say.java文件,在编译时,会检查Say.java在编译后是否存在更新,如果有更新,则则先编译,然后使用outclasses下的com.company.util.Say.class文件,如果不存在更新,则直接使用。

总结 情况解决方式依赖自定义的类在源文件根目录下运行命令 ,例如C:Usersgznhelloworldsrc>javac comcompanyappMyApp.java依赖自定义类和第三发jar包在源文件目录下运行命令,使用classpath参数,使用默认sourcepath源文件路径,默认d编译输出路径,即当前路径,例如C:Usersgznhelloworldsrc>javac -classpath .;C:Usersgznhelloworldlibsalgs4.jar comcompanyappMyApp.java依赖自定义类和第三方包优化最佳实践在源文件目录下运行命令,使用classpath参数,使用sourcepath参数,使用d参数,例如C:Usersgznhelloworld>javac -sourcepath src -classpath outclasses;libsalgs4.jar -d outclasses srccomcompanyappMyApp.java

注:-d中目录必须先手动创建

三 其他

欢迎阅读,其他相关文章:

Java命令行运行错误: 找不到或无法加载主类javac 错误: 编码GBK的不可映射字符

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。