Java命令行编译文件时出现的错误,找不到符号或软件包不存在等

原创 2015年11月20日 21:04:51

Java命令行编译文件时出现的错误,找不到符号或软件包不存在等

标签(空格分隔): Java


参考http://stackoverflow.com/questions/6665420/package-does-not-exist-error
参考http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html

配套代码上传在http://download.csdn.net/detail/qq369201191/9287185

习惯了eclipse的自动编译,Java命令行编译、执行文件只会最基础的部分,就是对单文件的编译和执行,而且不包含任何外部JAR包。但有时候你还非得用命令行,会碰到一些问题,博主这里给出几种常见的问题及解决方法。

实验环境介绍

这里写图片描述
eclipse 的工作目录在D:\myeclipse\Workspaces,里面有我们的一个工程example,点进去,eclipse为我们设置好的几个文件.settingsbinsrc.classpathproject,src中存放的是源代码,结构就如上图所示。

在eclipse导入后显示的结构如下图所示,
这里写图片描述
小提示:包名com.example.controller指的是在src/com/example/controller文件夹下有个controller.java文件

model.java是一个独立的类,不导入任何外部包
controller.java导入了com.example.model.model
view.java导入了com.example.controller.controller和调用了一个外部Jar包

在观察案例代码时,需要特别注意此时命令行的当前目录选项参数Java文件,会有不同的结果

使用绝对路径

绝对路径就是从根目录开始的路径,Windows下就是以盘符开头,如”C:\”,Linux下以斜杠开头/home。

使用绝对路径的好处就是不管命令行的当前路径在哪里,都能正确的进行编译

案例一

D:\myeclipse\Workspaces\example>javac D:\myeclipse\Workspaces\example\src\com\example\model\*.java

案例二

D:\myeclipse\Workspaces\example\src>javac D:\myeclipse\Workspaces\example\src\com\example\model\*.java

使用相对路径

  • 相对路径就是相对当前上下文环境,在命令行中就是相对命令行中前面的路径。
  • 相对路径不以/开头,直接文件名。

如案例一,当前路径在D:\myeclipse\Workspaces\example\src,相对这个路径,Java文件的相对路径就为com/example/model/*.java。在案例二中当前路径有变化,相应得Java文件的相对路径也有变化。

案例一

D:\myeclipse\Workspaces\example\src>javac com/example/model/*.java

案例二

D:\myeclipse\Workspaces\example>javac src/com/example/model/*.java

基本概念已经理解了,上干货,一般命令行编译出现的问题:

问题一:找不到符号或软件包不存在

案例一

D:\myeclipse\Workspaces\example\src>javac com/example/controller/*.java

这种情况下可以正常得进行编译,因为你自己不指定classpath,一般系统默认的classpath会在当前路径中搜索。

案例二

D:\myeclipse\Workspaces\example>javac src/com/example/controller/*.java

报错
src\com\example\controller\controller.java:3: 软件包 com.example.model 不存在

我们切换目录,已上文绝对路径、相对路径的知识,正确给出Java文件的路径。这时会报出错误,软件包com.xxx不存在。因为在controller.java文件中有一个import com.example.model.model,根据系统默认的classpath会在当前路径下找,即D:\myeclipse\Workspaces\example,很明显这个路径下没有com文件。

解决方法,我们告诉编译器哪个目录下会有就行了,所以需要加入选项-cp xxxx 或 -classpath xxxx

D:\myeclipse\Workspaces\example>javac -cp src src/com/example/controller/*.java

加上参数-cp src,告诉编译器可以去src中找,就不会有问题了。

同样的,classpath可以是相对路径,也可以是绝对路径,本例中使用的是相对路径,命令行换路径后,所有参数都要换

D:\myeclipse\Workspaces>javac -cp example/src example/src/com/example/controller/*.java

下面这个是用绝对路径写的,相对路径和绝对路径以下不再叙述

javac -cp D:\myeclipse\Workspaces\example\src example/src/com/example/controller/*.java

问题二:JAR包怎么引入

首先还是在eclipse调通,建议专门建立一个lib文件,然后把JAR包全部放在这里面,对项目转移也比较方便。

案例一

D:\myeclipse\Workspaces\example\src>javac com/example/view/view.java

错误
com\example\view\view.java:4: 软件包 com.google.gson 不存在
import com.google.gson.Gson;
                      ^
com\example\view\view.java:14: 找不到符号
符号: 类 Gson
位置: 类 com.example.view.view
                Gson gson = new Gson();
                ^
com\example\view\view.java:14: 找不到符号
符号: 类 Gson
位置: 类 com.example.view.view
                Gson gson = new Gson();
                                ^
3 错误

其实就一个问题,没找到JAR包。引入JAR就是注意要把路径写到JAR包的具体位置。废话少说,给出例子:

案例二

D:\myeclipse\Workspaces\example\src>javac -cp lib/gson-2.3.1.jar com/example/view/view.java

错误
com\example\view\view.java:3: 软件包 com.example.controller 不存在
import com.example.controller.controller;
                             ^
com\example\view\view.java:10: 找不到符号
符号: 类 controller
位置: 类 com.example.view.view
                new controller();
                    ^
2 错误

细心的你会发现,问题变了,因为我们引入了JAR包,所以因为JAR找不到的GSON问题已经没了,现在的问题就是找不到com.xxxx,就变成问题一。这里解释一下,我们加入-cp xxxx或-classpath xxxx之后,会覆盖系统中的classpath,案例二这么写的确可以找到GSON类,但在碰到import com.example.model.model时还在lib/gson-2.3.1.jar文件中查当然是找不到了,所以报错。方法很简单,在增加一个com.xxxx文件夹的路径,没错就是当前路径。所以加上.;lib/gson-2.3.1.jar。现在你是否对一开始配置Java环境时候,classpath中的路径要.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar有了理解呢?

特别注意的是在Linux下用冒号:进行分隔,而在Windows用分号进行分割。

案例三

正确
D:\myeclipse\Workspaces\example\src>javac -cp .;lib/gson-2.3.1.jar com/example/view/view.java

问题三:指定class文件存放位置

默认的情况下,class文件和java文件存放在一个目录下,但你有没有发现,eclipse编译后会有两个目录,一个是src,存放的是用户编辑的源代码,定一个是bin文件,是编译后的字节码。它是加了-d选项。

D:\myeclipse\Workspaces\example\src>javac -d ../bin com/example/model/model.java

这里bin文件和src文件是同级(看实验环境介绍),也是使用的是相对路径。打开文件后可以发现在bin文件中生成了com/example/model/model.class具有层次结构的目录。

到此我相信你已经能基本上解决编译时的问题了。

总结

本文给出了几个常见问题的解决方案,以上代码都经过实验过,不会有问题。命令行中我们要注意相对路径和绝对路径的差别,已经Linux下和Windows下分隔符的差别(Linux用冒号,Windows下用分号)。另外设置classpath时,一般都加上当前路径.。

以上内容是博主查阅一些资料,并进行了总结,本来还想认真研读一下官方文档的,但因为是全英文,而且很具体,还是放弃了。以后在碰到问题继续完善好了。如果以上所述有问题,请及时指出,欢迎交流!

版权声明:本文为博主原创文章,未经博主允许不得转载。

java 错误: 找不到符号遇到的几种情况

今天在学习java面向对象的时候写了两个类,在运行时出现了以下错误: 然后下面是我的两个java类 public class ArrayTool { ArrayTool(){ ...
  • qq_35091305
  • qq_35091305
  • 2017年07月19日 19:56
  • 2501

编译报错+解决方法:错误: 找不到符号

【0】README 1)本文主要解决“错误,找不到符号” 【1】 console error info 1)error :  E:\bench-cluster\mybatis_in_action_...
  • PacosonSWJTU
  • PacosonSWJTU
  • 2016年07月01日 23:13
  • 9015

java第二天--cmd编译报错:找不到符号 问题解决

今天学习Java对象,一开始我创建了Dog类,并在主函数中引用了对象,都在同一个文件夹里。但是编译报错找不到符号 下面是Dog.java class Dog{ int age; String ...
  • Hiter1140510116
  • Hiter1140510116
  • 2017年03月14日 23:31
  • 474

XXX.java:X: 错误: 程序包javax.servlet不存在

产生这个错误的原因可能有很多,这里我的错误原因以及解决办法如下: 由于servlet和JSP不是Java平台JavaSE(标准版)的一部分,而是Java EE(企业版)的一部分,因此,必须告知编译器...
  • u011121393
  • u011121393
  • 2015年06月15日 13:01
  • 1184

java 程序包不存在

在学习Java中的package的时候遇到一个这样的问题           今天在做Java例子的时候遇到一个这样的问题:错误: 程序包com.bjsxt.java140不存在  ...
  • u012996583
  • u012996583
  • 2014年11月04日 10:03
  • 1043

JAVA 编译找不到符号

 通常情况下,我们在编写java文件时,会有引用到自已定义的一些类,如果按通常的javac *.java的形式来编译会出现找不到符号的错误。以下提供了两种方法,以供参考假如在d:/web/wsh下有a...
  • shuilan0066
  • shuilan0066
  • 2010年05月27日 09:28
  • 21905

java找不到符号

我抄书上一段java源代码,它是用来判断闰年的算法,如下:public class RunTest { public static void main(String[] args) { R...
  • u012962138
  • u012962138
  • 2014年03月14日 17:11
  • 2097

Java虚拟机经常会报说找不到类、找不到符号的解决方法

Java虚拟机经常会抱怨说找不到类、找不到符号等等。一般情况下,我们的类、接口都要写package。比如,你写了一个接口:package cn.youhap.interface2;public int...
  • centurymagus
  • centurymagus
  • 2009年09月03日 11:37
  • 4081

JAVA 编译找不到符号

通常情况下,我们在编写java文件时,会有引用到自已定义的一些类,如果按通常的javac *.java的形式来编译会出现找不到符号的错误。 以下提供了两种方法,以供参考 假如在d:/web...
  • Mark_LQ
  • Mark_LQ
  • 2015年04月07日 20:04
  • 2730

HelloWorld.java:3: 找不到符号

public class HelloWorld { public static void main(string[] args) { System.out.pri...
  • PurpleGalaxy
  • PurpleGalaxy
  • 2014年10月10日 13:52
  • 1219
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java命令行编译文件时出现的错误,找不到符号或软件包不存在等
举报原因:
原因补充:

(最多只允许输入30个字)