命令行编译java的一点总结
今天在使用命令行编译时遇到些问题,顺便又仔细分析了一些基础知识,记录总结一下。

下面使用javac和java命令都是在 D:\Workspace\java目录下执行的:
1 //Inner.java
2 package cn.inner;
3 public class Inner
4 {
5 public static void show()
6 {
7 System.out.println("I'am inner class.");
8 }
9 }
10
11 //DoTest.java
12 import cn.inner.*;
13 public class DoTest
14 {
15 public static void main(String[] args)
16 {
17 Inner.show();
18 }
19 }
javac -d . Inner.java
javac DoTest.java

折腾半天,最终把 Inner.java 删掉、重命名都能够使 DoTest.java 编译成功。
自己思索半天,想到一个合理的解释: javac 命令在编译源文件时,如果源文件中有对其他类的调用(例如本例中的 Inner 类的调用),
它首先会在与源文件相同的目录下(即是与该类相同的包下)寻找是否有该类存在,在示例中发现了 Inner.java 源文件存在(该源文件中肯定存在一个 Inner 类),
但是事实上 Inner.java 是属于 cn.inner 包下的类,即 cn.inner.Inner 。 检查到这里, javac 命令就报错了,提示错误的源文件 ...
为了进一步证实我的假设,我修改 DoTest.java 文件,增加了默认包名:
package src;
在当前目录下执行:
Javac -d . DoTest.java
成功!
这时在分析下 DoTest.java 原源文件中导入的其它类:
由于该源文件中有导入 cn.inner.Inner 类,在使用 javac 命令编译时,该命令会按照 classpath 环境变量的路径去搜索导入的类,我的环境变量中有配置 "." ,
所以在当前目录下可以正确寻找到 cn.inner.Inner 类, 在当前目录下执行 javac DoTest.java 命令成功
但是在执行 java DoTest 命令时,出现下面的结果

这时才发现原来 DoTest.java 中增加了包名的限制,所以需要把 DoTest.class 文件移到 src 目录下,或者编译时加上 "-d ." 参数,即 javac -d . DoTest.java 命令
再执行 java src/DoTest 成功

总结: java 中包名的层级关系是用目录来体现的,比如 cn.inner 包就对应 cn\inner 这两层目录,在编译代码的过程中,如果有 import 其他包中的类,
则使用 javac 命令的命令行窗口的目录必须可以按照 classpath 环境变量的路径搜索到 import 进来的类。另外值得一提的是,编译后的类都应该按照包名规定放在指定目录下,
还需要注意被引入的类的源文件和使用引入类的源文件不能放在一起,除非两个文件都是默认包,如果是这种情况也不会使用 import 引入另外一个类了。
当然,我今天提到的这些问题,在 IDE 开发中一般都不会遇到,只是觉得这样能够更加深刻的理解 java 的一些基础问题。
- 本文来自:Linux学习教程网
命令行编译java的一点总结的更多相关文章
- 用命令行编译java并生成可执行的jar包
用命令行编译java并生成可执行的jar包 1.编写源代码. 编写源文件:CardLayoutDemo.java并保存,例如:I:\myApp\CardLayoutDemo.java.程序结构如下: ...
- 命令行编译java项目
命令行编译java项目 项目名: testproj 目录 src -> cn -> busix -> test bin lib 编译项目 cd testproj javac -d . ...
- 在linux下用命令行编译 java的eclipse项目
由于jdk的版本问题导致在windows上编译打包好的jar包放在linux服务器上运行的时候出现一点小异常,所以决定在linux上进行一次项目编译,这有两个选择1.在相同的linux环境下安装lin ...
- Linux中命令行编译java接口总是提示找不到符号的疑难杂症的解决
今天学习java的接口,在linux的命令行下写代码练练手吧,啪啪啪一顿猛敲,写了一个接口UsbInserface,UDisk继承UsbInterface,写完了那就编译到bin目录呗. 当时写程序的 ...
- 用cmd命令行编译JAVA程序时出现“找不到或无法加载主类”
今天复习Java基础知识时,使用cmd命令窗口进行编译Java文件发现了如下问题: 网上有很多的解决方法,和问题出现的讨论,以下方法是解决我出现这个问题方式. 解决方式: 重点是圈住的部分. 下面是我 ...
- Maven 手动添加第三方依赖包及编译打包和java命令行编译JAVA文件并使用jar命令打包
一,实例:新建了一个Maven项目,在eclipse中通过 build path –> configure path-.将依赖包添加到工程中后,eclipse不报错了.但是用Maven命令 mv ...
- 如何命令行编译Java工程
在src下的包含Main的包下打开命令行,javac -classpath “路径到src,不到包下” Main.java
- Java 命令行编译项目
如果是用Exlipse, 第三方的包可以放在eclipse文件夹的jre包的lib文件夹中! (初学者的一些总结-高手们勿喷哈-) 原因: 以前一直用Eclispe编程环境运行Java.非常舒服,就像 ...
- 命令行编译运行Java
首先要安装JDK,然后设置环境变量Path,添加C:\Program Files (x86)\Java\jdk1.8.0_66\bin 然后建立一个名为j.java的文件,里面加入如下代码: publ ...
随机推荐
- 【解题报告】[动态规划]RQNOJ - PID82 / 又上锁妖塔
原题地址:http://www.rqnoj.cn/problem/82 解题思路: 简单的动态规划 状态表示:DP[i][0]表示当前在第i层,且当前跳跃状态不可用,此时消耗的最短时间. DP[i ...
- BZOJ - 4771 七彩树 (可持久化线段树合并)
题目链接 对每个结点建立两棵线段树,一棵记录该结点的子树下每种颜色对应的最小深度,另一棵记录子树下的每个深度有多少结点(每种颜色的结点只保留最浅的深度即可),自底而上令父节点继承子结点的线段树,如果合 ...
- WCF Restful 服务 Get/Post请求
Restful Get方式请求: Restful服务 Get请求方式:http://localhost:10718/Service1.svc/Get/A/B/C http://localhost:1 ...
- imageView添加阴影和边框
注意:大量设置阴影会造成卡顿!!! 用上这句之后流畅度大大增加:imageV.layer.shouldRasterize = YES; 例: // 设置阴影 imageV.layer.shadowOf ...
- 前阿里DT总监欧吉良猝死:一代大神勾践陨落滴滴
欧吉良 阿里巴巴集团数据技术及产品部(DT)总监,淘宝网&天猫BI团队负责人,集团数据委员会数据运营组组长,阿里数据大学校长:2007年7月正式加入阿里,先后在支付宝.天猫.淘宝.数据技术及产 ...
- dockerfile初试之tomcat8封装
前面学习了一些docker相关资料,有看到dockerfile这个东东,一时没看得太明白,理论给合实践是最好的学习方法,自己做一下就行了嘛.主要步聚记录如下: 0)环境 10.202.105.96 ...
- VMware网络模式介绍
VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式). Bridged 模式: 在桥接模式下,VMware虚拟机里的系统就像是 ...
- erlang分布式例子
抄袭自 http://www.blogjava.net/killme2008/archive/2007/06/29/127099.html 简单的说,就是 主机上需要同时启用短节点名,或者长节点名 保 ...
- FPGA应用及ARM-FPGA架构举例
FPGA的应用非常广泛,通信领域,视频图像处理领域,汽车电子领域,消费电子领域,工业领域,数据处理领域等,都能看到FPGA的身影. 在设计中,FPGA通常和其他处理IC架构,完成整个设计.FPGA-A ...
- Activity小技巧
随时随地退出程序 新建一个结合类对所有活动进行管理. public class ActivityCollector{ public static List<Activity> activi ...