Java命令行编译文件时出现的错误,找不到符号或软件包不存在等_忘尘_追忆的博客-程序员秘密

技术标签: Java  javac  java  软件包不存在  classpath  找不到符号  

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时,一般都加上当前路径.。

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq369201191/article/details/49946609

智能推荐

使用screw plus来保护php代码安全_cptbtptpss的博客-程序员秘密

https://github.com/del-xiong/screw-plushttp://git.oschina.net/splot/php-screw-plusscrew plus是一个开源的php扩展,作用是对php文件进行加密,网络上提供php加密的服务很多,但大多都只是混淆级别的加密,被人拿到加密文件问只要有足够耐心就能破解,与之不同的是,screw plus采用扩展来加解密,而且...

lighttpd + web.py_luoweifeng1989的博客-程序员秘密_lighttpd web.py

lighttpd + web.py                                                              Luo Weifeng 2011-7-22本来这篇应该很早就写了这个的,可是不知道什么情况前几次尝试一直没有弄出来,搞得我

8.19(军训DAY 3)_1035719430的博客-程序员秘密

军训第三天 继续背包....先完成的是昨天二维费用的题目  40分的找啊找啊找GF....LUOGU1509 找啊找啊找GF题目背景"找啊找啊找GF,找到一个好GF,吃顿饭啊拉拉手,你是我的好GF.再见.""诶,别再见啊..."七夕...七夕...七夕这个日子,对于sqybi这种单身的菜鸟来说是多么的痛苦...虽然他听着这首叫做"找啊找啊找GF"的歌,他还是很痛苦.为了

[NOIP 2014复习]第三章:动态规划——NOIP历届真题回顾_qpswwww的博客-程序员秘密

序列型动态规划1、Wikioi 1058 合唱队形题目描述 Description     N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。    合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK,  则他们的身高满足T1Ti+1>…>TK(1    你的任务是,已知

地表最强的 9 则程序员笑话_程序员的店小二的博客-程序员秘密_程序员笑话

多图预警。编者按:不同的工种,有不同的共同笑点。以下是程序员们“都懂的”。本文编译自gitconnected,原文作者Pralabh Saxena,原文标题:9 Ultimate Programming Jokes。开怀大笑是减压的最佳方式之一。身为程序员,有什么比编程笑话更令人减压的呢?我们都喜欢笑话,尤其是那些日常生活中的梗。我总结了下面这些跟程序员相关的笑话,希望这篇文章能让你精神振作,用欢笑打开这一天。1、这招每次都奏效我要跟不存在的虚拟女朋友试一下。之后告诉你管不管用。..

安装完Ubuntu 16.10之后要做的几件事情_乐百川的博客-程序员秘密_ubuntu翻墙

网络篇设置代理如果你已经有了代理服务器的话那么就可以设置网络代理了。找到设置,进入网络,然后设置相应的代理,并点击应用到系统。之后就可以使用浏览器畅游网络了。安装proxychains这是一个命令行代理工具,可以用来给命令行设置代理。要安装它,sudo apt install proxychains安装完成之后,打开/etc/proxychains.conf文件,然后编辑该文件即可。例如,我使用了s

随便推点

28岁自学java,包装简历3年拿到15k薪资,分享我的学习经历_Nin-Ja-的博客-程序员秘密_java简历包装三年经验

网友分享:上周在南京找到了一个15k的java程序员工作,现在28岁,以前一直做的是金融,做证券金融如果没有特别好的经济头脑,你只能被刮毛,一直都是一个小小的业务员。自从15年后IT业的平均薪资全面超过了金融,我就很想转行了,但是一直都没有行动,现在根据大学同学的经验,17年的时候,程序员是最好找工作的,但是现在要难找一点,特别是今年年初的病情,但是从以后发展的前景来看,我还是选择了转行,因为现在信息技术发展很好,以后在这方面的人才需求会很大,待遇也会有很大的提升。因为我的工作比较清闲朝九晚五。所以

【gitlab】gitlab快速部署教程_aidun3016的博客-程序员秘密

gitlab快速部署教程部署环境Ubuntu 16.04(亲测可用)开始部署安装依赖sudo apt-get install curl openssh-server ca-certificates postfix执行完成后,出现邮件配置,选择Internet那一项(不带Smarthost的)下载软件包下载页面: https://mirrors.tuna.tsinghu...

3D游戏编程与设计-游戏的本质hw1_zhangxy389的博客-程序员秘密

游戏的本质游戏的分类游戏热点游戏的分类游戏的分类标准很多,以下主要以六个标准进行分类游戏载体:游戏除指代电子游戏之外,还可以指代诸如棋类、运动以及沙壶球这类基于现实的游戏。游戏方式:游戏地区游戏内容游戏平台:以游戏平台区分,电子游戏可分为街机游戏(使用大型游戏机进行游玩的游戏)、电脑游戏(使用PC和其他运算计算机进行游玩的游戏)、主机游戏(利用家庭用游戏主机进行游玩的游戏,如Xbox和Switch)、移动端游戏(使用掌上游戏机或手机等移动游戏设备进行游玩的游戏)游戏玩家人数游戏热点

命名空间 using 和 using namespace 使用详解_无敌小峰哥的博客-程序员秘密

1.using namespace 使用命名空间下所有属性(范围)2.using 使用命名空间的某一个属性(特指)

CentOS8 安装图形界面后,怎么转换为命令行界面_优小U的博客-程序员秘密_centos8进入命令行界面

问题安装了CentOS8图形界面版后,每次系统启动时间太长,而且如果VMWare里面安装了多台虚拟机,图形界面的CentOS耗费的内存太多使用Linux 主机不使用命令行就有点不是内味了~命令行形式启动:提高启动速度、降低内存占用命令行与图形界面转换图形界面->命令行第一步,在图形界面任何界面按ctrl+alt+f3,这时就会切换到命令行界面;第二步,在命令行里输入systemctl set-default multi-user.target,这样下次启动就会默认以命令行启动了。

用Sql生成数据插入Sql脚本_weixin_34034261的博客-程序员秘密

CREATE PROCEDURE dbo.UspOutputData @tablename sysname AS declare @column varchar(1000) declare @columndata varchar(1000) declare @sql varchar(4000) declare @xtype tinyint declare @name s...

推荐文章

热门文章

相关标签