标签(空格分隔): Javajavascript
习惯了eclipse的自动编译,Java命令行编译、执行文件只会最基础的部分,就是对单文件的编译和执行,并且不包含任何外部JAR包。但有时候你还非得用命令行,会碰到一些问题,博主这里给出几种常见的问题及解决方法。html
实验环境介绍
eclipse 的工做目录在D:\myeclipse\Workspaces,里面有咱们的一个工程example,点进去,eclipse为咱们设置好的几个文件.settings、bin、src、.classpath、project,src中存放的是源代码,结构就如上图所示。java
在eclipse导入后显示的结构以下图所示,
小提示:包名com.example.controller指的是在src/com/example/controller文件夹下有个controller.java文件python
model.java是一个独立的类,不导入任何外部包
controller.java导入了com.example.model.model
view.java导入了com.example.controller.controller和调用了一个外部Jar包linux
在观察案例代码时,须要特别注意此时命令行的当前目录,选项参数和Java文件,会有不一样的结果objective-c
使用绝对路径
绝对路径就是从根目录开始的路径,Windows下就是以盘符开头,如”C:\”,Linux下以斜杠开头/home。sql
使用绝对路径的好处就是无论命令行的当前路径在哪里,都能正确的进行编译windows
案例一
D:\myeclipse\Workspaces\example>javac D:\myeclipse\Workspaces\example\src\com\example\model\*.java
1
1
案例二
D:\myeclipse\Workspaces\example\src>javac D:\myeclipse\Workspaces\example\src\com\example\model\*.java
1
1
使用相对路径
相对路径就是相对当前上下文环境,在命令行中就是相对命令行中前面的路径。
相对路径不以/开头,直接文件名。
如案例一,当前路径在D:\myeclipse\Workspaces\example\src,相对这个路径,Java文件的相对路径就为com/example/model/*.java。在案例二中当前路径有变化,相应得Java文件的相对路径也有变化。
案例一
D:\myeclipse\Workspaces\example\src>javac com/example/model/*.java
1
1
案例二
D:\myeclipse\Workspaces\example>javac src/com/example/model/*.java
1
1
基本概念已经理解了,上干货,通常命令行编译出现的问题:
问题一:找不到符号或软件包不存在
案例一
D:\myeclipse\Workspaces\example\src>javac com/example/controller/*.java
1
1
这种状况下能够正常得进行编译,由于你本身不指定classpath,通常系统默认的classpath会在当前路径中搜索。
案例二
D:\myeclipse\Workspaces\example>javac src/com/example/controller/*.java
报错
src\com\example\controller\controller.java:3: 软件包 com.example.model 不存在
1
2
3
4
1
2
3
4
咱们切换目录,已上文绝对路径、相对路径的知识,正确给出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
1
1
加上参数-cp src,告诉编译器能够去src中找,就不会有问题了。
一样的,classpath能够是相对路径,也能够是绝对路径,本例中使用的是相对路径,命令行换路径后,全部参数都要换
D:\myeclipse\Workspaces>javac -cp example/src example/src/com/example/controller/*.java
1
1
下面这个是用绝对路径写的,相对路径和绝对路径如下再也不叙述
javac -cp D:\myeclipse\Workspaces\example\src example/src/com/example/controller/*.java
1
1
问题二: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 错误
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
其实就一个问题,没找到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 错误
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
细心的你会发现,问题变了,由于咱们引入了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
1
2
1
2
问题三:指定class文件存放位置
默认的状况下,class文件和java文件存放在一个目录下,但你有没有发现,eclipse编译后会有两个目录,一个是src,存放的是用户编辑的源代码,定一个是bin文件,是编译后的字节码。它是加了-d选项。
D:\myeclipse\Workspaces\example\src>javac -d ../bin com/example/model/model.java
1
1
这里bin文件和src文件是同级(看实验环境介绍),也是使用的是相对路径。打开文件后能够发如今bin文件中生成了com/example/model/model.class具备层次结构的目录。
到此我相信你已经能基本上解决编译时的问题了。
总结
本文给出了几个常见问题的解决方案,以上代码都通过实验过,不会有问题。命令行中咱们要注意相对路径和绝对路径的差异,已经Linux下和Windows下分隔符的差异(Linux用冒号,Windows下用分号)。另外设置classpath时,通常都加上当前路径.。
以上内容是博主查阅一些资料,并进行了总结,原本还想认真研读一下官方文档的,但由于是全英文,并且很具体,仍是放弃了。之后在碰到问题继续完善好了。若是以上所述有问题,请及时指出,欢迎交流!