//能够执行java 和 javac 就证明你的环境变量已经配置好了,其实 classpath 可以不配置
//假如有如下文件:H:\code\Hello.java
public class Hello{
public static void main(String[]args){
System.out.println("Hello")
}
}
//正确编译命令: javac Hello.java
//正确运行命令: java Hello
错误1:H:\code>java Hello.java
原因:命令错误
错误2:H:\code>java Hello.class
错误: 找不到或无法加载主类 Hello.class
原因:命令错误
错误3:java 源文件带有包名,往往容坦尘易出错
如:H:\code\Hello2.java
package com.example
public class 让指禅Hello2{
public static void main(String[]args){
System.out.println("Hello2")
}
}
这代码看上去没什么问题,执行:
H:\code>javac Hello2.java
H:\code>java Hello2
错误: 找不到或无法加逗搭载主类 Hello2
解决办法:
+.删除包名 或者
+.在code 下创建一个与包名相同的文件结构(H:\code\com\example\Hello2.java)
编译:H:\code>javac com/example/Hello2.java
运行:H:\code>java com.example.Hello2
最近在回顾基础知识的时候,想要用文本编辑器+控制台的方式写java程序,发现习惯了IDE,使用基础命令就遇到一些问题,比如,我在D:\MavenTrainingSpace\hello-world\src\main\java\jar\App.java文件中写了个HelloWorld程序:package jar
/**
* Hello world!
*
*/
public class App
{
public String satHello(){
return "Hello World"
}
public static void main( String[] args )
{
System.out.println(new App().satHello())
}
}
然后用maven编译之后生成了D:\MavenTrainingSpace\hello-world\target\classes\jar\App.class文件,我想运行这个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\jdk1.8.0_131\lib\dt.jarC:\Program Files\Java\jdk1.8.0_131\lib\tools.jar
登录后复制
第一个分号前的.表示执行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/App.class,所以我们到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 jar.App
Hello World
登录后复制
这样就行了。
网上的教程到这里一般就结束了,但是我在想,这样太挫了吧,不停的切换目录,而且如果我们在eclipse中新建一个java项目,为什么就能找到这个App.class并且加载它呢,
其实说到底还是CLASSPATH的事情,java命令执行的时候可以带上一个参数:-classpath [路径],指明了java加载的路径,那么就是说我们可以这样做,我先到一个无关的路径下:
D:\>java -classpath "D:\MavenTrainingSpace\hello-world\target\classes" jar.App
Hello World
登录后复制
你看,我切到码带孙了D盘,但是执行的时候,把class所在迟链的路径放在了classpath参数上了,java就明白了要从这个路径里面按照包结构找。
然后回到eclipse的问题上,eclipse为我们做了什么事儿,使得我们不需要关注这些了呢,其实就是每个项目,eclipse生成了一个.classpath的文件,通过这个文件,eclipse在执行java命令的时候,就告诉了java命令该去哪里加载类。
该如何解决呢?解决办法如下:
1.由于是在运行阶段出现的问题,那么可能是环境变量配置不当的问题,即可能是classpath路径配置错误,而导致.class文件无法加载。那么此时你可以检查是否配置好classpath路径,一般来说classpath路径配置如下:
.%java_home%\lib%java_home%\lib\tools.jar; (注意前面的 . 以及 ; 缺一不可)
其中.表示当前路径,;表示分隔符。
2.如果你试过了很多次,classpath也配置对了,依旧出现这个错误,注意你使用的测试代码,是否在某一个包名的下面;
比如说如下测试代码:
在文件所在的当前目录下御旅蠢,运行javac TestPlusPlus.java编镇陪译成功,生成TestPlusPlus.class文件,这个时
候,你用javaTestPlusPlus想运行程序,总会出现”找不到或无法加载主类“的错误。这个时候要注意,
之所以找不到,是因为TestPlusPlus在HelloWorld包名的下面。
解决办法:
1.去掉 ”package HelloWorld“ 重新用javac 编译TestPlusPlus.java,再运行javaTestPlusPlus就可以了。
2.新建一个包名一样的文件夹,在本例中,为建立一个HelloWorld的镇举文件夹,把TestPlusPlus.java文件移到该目录下。
然后在HelloWorld文件夹的平级下,打开DOS命令窗口,运行javacHelloWorld/TestPlusPlus.java编译程序,
运行javaHelloWorld/TestPlusPlus(或者javaHelloWorld.TestPlusPlus也可以),则可以运行含有包名的java程序。
注意:包名不要含有'.'(点),' '(空格)等特殊符号,这样的话命令行无法判断包名与java程序名的分割点在哪里,
从而还是找到或者无法加载主类。
原理说明:
java程序运行class文件,对于有包名的类,java把包名当成文件夹处理."包名+类名"相当于"文件夹目录+类名"来寻找类。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)