在Eclipse中可以运行,但在CMD中错误:找不到符号的解决办法

Posted 从零开始的智障生活

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Eclipse中可以运行,但在CMD中错误:找不到符号的解决办法相关的知识,希望对你有一定的参考价值。

一、问题描述

Java环境变量配置完成,在Eclipse中可以运行的程序,但在CMD中运行报错:找不到符号。

 如:创建了一个要求从命令行界面输入参数的java文件[Driver.java]。但是这个文件还有两个相关文件[Summation.java][MutableInteger.java]。而且主类Driver还可以输入命令行参数。

代码如下:

package com.zyx.chapter9.thread;

public class MutableInteger {
	private int value;
	public int getValue() {
		return value;
	}
	public void setValue(int value) {
		this.value = value;
	}
}
package com.zyx.chapter9.thread;

import com.zyx.chapter9.thread.MutableInteger;
public class Summation implements Runnable{
	private int upper;
	private MutableInteger sumValue;
	public Summation(int upper,MutableInteger sumValue) {
		this.upper = upper;
		this.sumValue = sumValue;;
	}

	@Override
	public void run() {// 执行这个代码会,创建一个线程。
		int sum=0;
		for(int i=0;i<=upper;i++)
			sum+=i;
		sumValue.setValue(sum);
	}
}
package com.zyx.chapter9.thread;
import com.zyx.chapter9.thread.MutableInteger;
import com.zyx.chapter9.thread.Summation;

public class Driver {

	public static void main(String[] args) {
		if(args.length>0) {
			if(Integer.parseInt(args[0])<0)
				System.err.println(args[0]+"Must be >= 0");
			else {
				MutableInteger sum = new MutableInteger();
				int upper = Integer.parseInt(args[0]);
				// 对实现了Runnable接口的对象创建Thread对象
				Thread thread = new Thread(new Summation(upper, sum));
				thread.start();// 启动这个线程
				// 打印线程运行结果
				try {
					thread.join(); 
					System.out.println("the sum of "+upper+" is "+sum.getValue());
				}catch (InterruptedException e) {}
			}
		}
		else {
			System.out.println("Usage:Summation<integer value>");
		}
	}
}

在Eclipse运行正常:(因为我没有输入参数)

Usage:Summation<integer value>

但是在CMD中出现了如下情形:

 二、问题原因

这一般是由于有多非JavaAPI函数库依赖项的原因。即在你的代码中,有很多其他自己创建的类或接口。如果单个文件编译,那么就会出现问题。因为javac编译器是要将你的代码编译成JVM可以识别的字节码,然而如果文件中有其他非java API库的依赖项,那么编译器就无法识别,那它就是一串不知道是什么的字符串。

三、解决办法

解决办法就是,将所有依赖项一起编译,按照依赖性依次往后放:

3.1 用命令行按文件名直接编译java文件

在命令行,可以直接进入文件目录D:\\eclipse-workspace\\GSZJ\\src\\com\\zyx\\chapter9\\thread,然后再命令行依次或按依赖顺序编译。

D:\\eclipse-workspace\\GSZJ\\src\\com\\zyx\\chapter9\\thread>javac MutableInteger.java Summation.java Driver.java

3.2 用中间文件编译java文件

新建一个【依赖性文件列表】,名字无所谓,就叫source.txt吧,这些相关文件的绝对路径按行、按依赖性依次写入到这个文件,最先被依赖的文件最先写入。

D:\\eclipse-workspace\\GSZJ\\src\\com\\zyx\\chapter9\\thread\\MutableInteger.java
D:\\eclipse-workspace\\GSZJ\\src\\com\\zyx\\chapter9\\thread\\Summation.java
D:\\eclipse-workspace\\GSZJ\\src\\com\\zyx\\chapter9\\thread\\Driver.java

这样我们就可以直接针对这个文件来运行,在CMD中运行如下指令:

如果你的代码中有中文,那么就要用GBK,当然也可以默认省略这一条。

javac -encoding GBK @source.txt -Xlint:unchecked

四、运行执行

要从命令行,运行java程序要从它包名开始指示。java运行时只会从包名开始识别。可以从java文件的第一行知道该java文件的包名:com.zyx.chapter9.thread。

D:\\eclipse-workspace\\GSZJ\\src\\com\\zyx\\chapter9>java thread.Driver 10
错误: 找不到或无法加载主类 thread.Driver
原因: java.lang.NoClassDefFoundError: com/zyx/chapter9/thread/Driver (wrong name: thread/Driver)

D:\\eclipse-workspace\\GSZJ\\src>java com.zyx.chapter9.thread.Driver 10
the sum of 10 is 55

以上是关于在Eclipse中可以运行,但在CMD中错误:找不到符号的解决办法的主要内容,如果未能解决你的问题,请参考以下文章

为啥eclipse找不到文件夹。文件绝对存在于项目中,但在eclipse中显示不出

我用eclipse导出的runnable jar不能双击执行,但在命令行可以用java -jar ***.jar运行,这是怎么回事?

我在Eclipse中将一个java项目打包成jar文件后,为啥双击它时没反应?但在eclipse中是可以运行的

java文件在eclipse中可以运行,在cmd中javac命令运行正确,java命令报错

Eclipse引入外部Jar在发布时没有自动带入,导致出现ClassNoFound错误

模块在 cmd 中有效,但在 Pycharm 中无效